Guide
Meddelanden från Qrona
Med tillägget Byråstöd: Klientkommunikation bestämmer byråns Qrona vem som får vad och när, och skickar den färdiga datan för ett meddelande i taget. Hur meddelandet ser ut bestäms här, i en mall som designas en gång.
Så fungerar det
- Byråns arbetsyta är kopplad till byråns Qrona (Inställningar → Integrationer → Koppla Qrona), och Qrona-kunden har Byråstöd. Då visas tillägget under Inställningar → Tillägg, och en administratör installerar det.
- Qrona får beskedet med en systemnyckel för arbetsytan och hemligheten som kvittona signeras med. Systemnyckeln hör till organisationen, inte till en person, och har bara behörigheterna
messages:sendochtemplates:render. Den återkallas när tillägget avinstalleras eller kopplingen tas bort. - Mallarna designas i Qrona Newsletter mot Qronas datakontrakt och publiceras.
- Qrona förhandsgranskar med
POST /templates/{key}/renderoch skickar medPOST /messages. Kvittona kommer tillbaka som signerade webhooks.
curl -X POST 'https://newsletter.qrona.se/api/v1/messages' \
-H "Authorization: Bearer $QRONA_NEWSLETTER_SYSTEM_KEY" \
-H 'Content-Type: application/json' \
-d '{
"template": "byra.momsunderlag",
"to": { "email": "ekonomi@klienten.se", "name": "Eva Ekonom" },
"category": "service",
"data": { "klient": { "namn": "Exempel AB" }, "knapp": { "url": "https://byran.q.qrona.se/portal/underlag", "text": "Ladda upp" } },
"idempotency_key": "occ_20261023_0042",
"reference": "occ_20261023_0042",
"client_ref": "kl_7f3a"
}'Alla fält och fel: Skicka meddelande.
Mallar och datakontrakt
En Qrona-mall har en nyckel, samma som datakontraktets i Qrona. Kontraktet säger vilka fält meddelandet får och har exempeldata, som visas i editorn och förhandsgranskningen. Värdena kommer färdiga – belopp formaterade och datum utskrivna – och Qrona Newsletter räknar inget och slår inte upp något.
- Ett fält i en text, en knapp eller ämnesraden:
{{data.klient.namn}}. Värdet visas alltid som text: det kan aldrig bli HTML eller ett annat fält. - Listor visas med blocken Tabell och Lista – en rad per post. Ett längre textfält visas med Text ur data, i stycken.
- Visa bara om: ett block kan visas bara när ett fält finns eller är sant, eller bara i nyhetsbrev.
- Publicera fryser mallen som en ny version. En publicerad version ändras aldrig, och varje meddelande sparar sin version. Publiceringen stoppas om mallen använder ett fält som inte finns i kontraktet.
| Typ | Värde |
|---|---|
text Text | En färdig text (eller ett tal). |
url Adress (URL) | En https-adress (mailto: och tel: går också). |
boolean Ja/nej | true eller false – för Visa bara om. |
list Lista | En lista med objekt; items säger vilka fält varje rad har. |
Ett fält är obligatoriskt om inte required: false står. Datan i ett meddelande kontrolleras mot kontraktet innan något skickas (422 med errors[] annars). Ett exempel:
{
"key": "byra.momsunderlag",
"version": 1,
"title": "Påminnelse om underlag till momsdeklarationen",
"fields": [
{
"path": "klient.namn",
"type": "text",
"label": "Klientens namn"
},
{
"path": "klient.orgnr",
"type": "text",
"label": "Organisationsnummer",
"required": false
},
{
"path": "period.etikett",
"type": "text",
"label": "Perioden"
},
{
"path": "period.intern_deadline",
"type": "text",
"label": "Byråns sista dag för underlag"
},
{
"path": "period.skv_deadline",
"type": "text",
"label": "Skatteverkets sista dag",
"required": false
},
{
"path": "konsult.namn",
"type": "text",
"label": "Konsultens namn"
},
{
"path": "konsult.epost",
"type": "text",
"label": "Konsultens e-post",
"required": false
},
{
"path": "konsult.telefon",
"type": "text",
"label": "Konsultens telefon",
"required": false
},
{
"path": "knapp.url",
"type": "url",
"label": "Länk till uppladdningen"
},
{
"path": "knapp.text",
"type": "text",
"label": "Knappens text"
},
{
"path": "saknas",
"type": "list",
"label": "Underlag som saknas",
"items": [
{
"key": "typ",
"type": "text",
"label": "Typ"
},
{
"key": "beskrivning",
"type": "text",
"label": "Beskrivning"
},
{
"key": "belopp",
"type": "text",
"label": "Belopp",
"required": false
}
]
},
{
"path": "bradskande",
"type": "boolean",
"label": "Brådskande",
"required": false
}
],
"example": {
"klient": {
"namn": "Exempel AB",
"orgnr": "556677-8899"
},
"period": {
"etikett": "september 2026",
"intern_deadline": "fredag 2 oktober",
"skv_deadline": "måndag 12 oktober"
},
"konsult": {
"namn": "Karin Konsult",
"epost": "karin@byran.se",
"telefon": "08-123 45 67"
},
"knapp": {
"url": "https://byran.q.qrona.se/portal/underlag",
"text": "Ladda upp underlaget"
},
"saknas": [
{
"typ": "Kvitton",
"beskrivning": "Inköp med företagskortet",
"belopp": "4 312 kr"
},
{
"typ": "Kontoutdrag",
"beskrivning": "Skattekontot, september"
}
],
"bradskande": false
}
}Tjänstemeddelanden och nyhetsbrev
| category | Stoppas av | Räknas mot |
|---|---|---|
service | Studs, skräppostanmälan, radering och manuell spärr – aldrig en avregistrering. Har ingen avregistreringslänk. | Tilläggets egen pott per månad, utanför månadstaket. |
marketing | Allt ovan och avregistreringar, som arbetsytans andra utskick. Får avregistreringslänk och List-Unsubscribe. | Organisationens månadstak. |
Ett meddelande som inte får gå sparas med status suppressed och reason, och kvittot message.suppressed skickas.
Inga dubbletter
idempotency_key är unik per arbetsyta för alltid, inte bara ett dygn. Samma nyckel igen ger 200 med det första meddelandet och skickar inget nytt – så Qrona kan göra om ett anrop som inte fick något svar. Samma nyckel med annat innehåll ger 409 idempotency_conflict. Använd utskickets id i Qrona.
Kvitton
Varje meddelande ger kvitton till Qronas mottagare /qrona-newsletter/messages/events, med Qrona-kopplingens nycklar och signerade som andra webhooks (se Webhooks). Qrona känner igen meddelandet på reference och message_id.
| Händelse | När |
|---|---|
message.sent | Utskickstjänsten tog emot meddelandet för leverans. |
message.delivered | Mottagarens e-postserver tog emot meddelandet. |
message.bounced | Adressen tar inte emot e-post. Den spärras i hela organisationen. |
message.complained | Mottagaren markerade meddelandet som skräppost. Adressen spärras i hela organisationen. |
message.failed | Meddelandet kunde inte levereras, och inga fler försök görs. |
message.suppressed | Meddelandet skickades inte: adressen är spärrad för meddelandets klass, eller taket för månaden är nått. reason säger varför. |
POST /api/qrona-newsletter/messages/events HTTP/1.1
Content-Type: application/json
Qrona-Signature: t=1761208205,v1=…
Qrona-Event: message.delivered
Qrona-Delivery: 4d3c2b1a-0f9e-4d8c-b7a6-5f4e3d2c1b0a{
"id": "2c9d4e1f-6a7b-4c8d-9e0f-1a2b3c4d5e6f",
"type": "message.delivered",
"created_at": "2026-10-23T08:30:05.000Z",
"workspace_id": "0b8f6c2a-1d3e-4f5a-9b7c-8d6e5f4a3b2c",
"data": {
"message_id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
"reference": "occ_20261023_0042",
"client_ref": "kl_7f3a",
"template": "byra.momsunderlag",
"template_version": 3,
"category": "service",
"email": "ekonomi@klienten.se",
"status": "delivered",
"reason": null,
"occurred_at": "2026-10-23T08:30:04.000Z"
}
}Vad som sparas
- Datan används för att göra meddelandet och sparas krypterad för webbversionen i 30 dagar. Sedan finns bara dess SHA-256 kvar – Qrona är källan.
- Mallversionen och HTML:ens SHA-256 sparas alltid, liksom kvittona.
client_refär byråns klient, pseudonymt. Antalet olika klienter som fått ett meddelande under en kalendermånad är underlaget för fakturan.