Šablóny a personalizácia
Šablóna a jej obsah
Šablóna (template) má názov, predmet, preheader a obsah. Obsah je {editor, html, design, version}:
editor: "html": obsah je HTML,designjenull. Pre API najjednoduchšie.editor: "visual": obsah vizuálneho editora (MJML) vdesign({"format": "mjml-1", "mjml", "styles"}) a z neho vykreslenéhtml.
Založenie so skopírovaným obsahom jedným volaním:
curl -sS -X POST "https://www.postarna.cz/api/v1/tenants/$TENANT/templates" \
-H "Authorization: Bearer $POSTARNA_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"name": "Opuštěný košík",
"subject": "{{df_name|default('Dobrý den', true)}}, něco jste nechali v košíku",
"preheader": "Váš košík na vás počká ještě pár dní",
"content": {
"editor": "html",
"design": null,
"html": "<!doctype html><html><body><p>Dobrý den, {{df_salution|default('vážený zákazníku', true)}},</p><p>ve vašem košíku zůstalo {{ metadata.event.attributes.itemCount }} ks zboží za {{ metadata.event.attributes.total }} {{ metadata.event.attributes.currency }}.</p><p><a href=\"https://www.example.cz/kosik/\">Dokončit objednávku</a></p><p style=\"font-size:12px\">{{cl_company}}, {{cl_address}}. <a href=\"{{unsubscribe}}\">Odhlásit odběr</a></p></body></html>"
}
}
JSON{
"id": "301",
"name": "Opuštěný košík",
"subject": "{{df_name|default('Dobrý den', true)}}, něco jste nechali v košíku",
"preheader": "Váš košík na vás počká ještě pár dní",
"editor": "html",
"createdAt": "2026-10-01T08:00:00.000Z",
"updatedAt": "2026-10-01T08:00:00.000Z",
"tags": [],
"size": 465,
"archived": false,
"archivedAt": null,
"readOnly": false,
"usage": {
"campaigns": 0,
"automations": 0
},
"lastUsedAt": null,
"check": {
"errors": [],
"warnings": [
"subject_long"
],
"checkedAt": "2026-10-01T08:00:00.000Z"
},
"content": {
"editor": "html",
"html": "<!doctype html><html><body><p>Dobrý den, {{df_salution|default('vážený zákazníku', true)}},</p><p>ve vašem košíku zůstalo {{ metadata.event.attributes.itemCount }} ks zboží za {{ metadata.event.attributes.total }} {{ metadata.event.attributes.currency }}.</p><p><a href=\"https://www.example.cz/kosik/\">Dokončit objednávku</a></p><p style=\"font-size:12px\">{{cl_company}}, {{cl_address}}. <a href=\"{{unsubscribe}}\">Odhlásit odběr</a></p></body></html>",
"design": null,
"version": 1,
"updatedAt": "2026-10-01T08:00:00.000Z"
},
"settings": {
"linkParams": [],
"headers": [],
"unsubscribePageId": null,
"footerId": null
},
"draft": {
"pending": false,
"savedAt": null,
"publishedAt": null
},
"activeUses": {
"automations": 0,
"emails": 0,
"campaigns": 0
},
"publicUrl": "https://links.example.cz/template/1/72cf576a-85b2-474e-86e2-bfdbd1f4d38f"
}Úprava obsahu: PUT /templates/{id}/content s {editor, html, design, baseVersion}; baseVersion je verzia, ktorú ste načítali (pri novej šablóne 1). Iná verzia na serveri = 409 conflict / version s params.current. Každé uloženie sa zapíše do historie (GET /templates/{id}/versions).
- HTML server pred uložením vyčistí: žiadne skripty, rámy, atribúty
on*, odkazyjavascript:ani nebezpečné CSS. Čistý vstup zostane bez zmeny. - HTML nad 102 000 bajtov hlási kontrola obsahu ako chybu a taký e-mail neodíde (Gmail dlhší e-mail oreže).
- Kampaň má vlastnú kópiu obsahu (
PUT /campaigns/{id}/content); neskoršia úprava šablóny kampaň nezmení.
Šablóna, ktorú posiela zapnutá automatizácia
Aby sa omylom nezmenil e-mail, ktorý práve chodí zákazníkom, uloží sa zmena obsahu takej šablóny do konceptu. E-maily posielajú ďalej publikovanú podobu, dokým koncept nepublikujete:
POST /templates/{id}/publishs{"confirm": "<presný názov šablóny>"}(API kľúčom; prihlásený človek posiela heslo).DELETE /templates/{id}/draftkoncept zahodí.- Zmazať šablónu, ktorú posiela zapnutá automatizácia, nejde (409
conflict/in_use).
Kontrola obsahu
POST /content/lint s {html, subject, preheader} vráti issues s kódmi (chyby prvé). Rovnaká kontrola beží pri schválení kampane a zapnutí automatizácie: chyba odoslanie zastaví, upozornenie nie.
curl -sS -X POST "https://www.postarna.cz/api/v1/tenants/$TENANT/content/lint" \
-H "Authorization: Bearer $POSTARNA_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"html": "<p>Dobrý den, {{df_jmeno}}</p>",
"subject": "Podzimní novinky",
"preheader": ""
}
JSON{
"issues": [
{
"code": "unknown_tag",
"severity": "error",
"params": {
"tags": "{{df_jmeno}}"
}
},
{
"code": "no_unsubscribe",
"severity": "warning",
"params": {}
}
]
}| Kód | Závažnosť | Kedy |
|---|---|---|
subject_missing | chyba | prázdny predmet |
subject_too_long | chyba | predmet nad 200 znakov |
content_empty | chyba | žiadny text ani obrázok |
unknown_tag | chyba | neznáma zástupná značka (params.tags) |
foreign_tag | chyba | značky iných nástrojov (*|X|*, %%x%%, {$x}) |
script_error | chyba | skript Twig sa nedá spustiť (params.line, params.detail) |
unsupported_filter | chyba | nepodporovaný filter (napríklad |raw) |
bad_fallback | chyba | neplatná náhrada default(...) |
emoji | chyba | emoji, keď ho firma zakázala |
forbidden_word | podľa pravidla | zakázané slovo podľa pravidiel firmy |
image_placeholder, image_data_uri | chyba | nenahradený zástupný obrázok, obrázok vložený ako data: |
banned_host | chyba | odkaz alebo obrázok na zakázanom hostiteľovi |
html_too_large | chyba | HTML nad 102 000 B |
no_unsubscribe | upozornenie | chýba {{unsubscribe}}; Poštárna doplní štandardnú pätičku |
footer_incomplete | upozornenie | odhlásenie nie je odkaz alebo chýba meno odosielateľa; doplní sa pätička |
subject_long, img_without_alt, insecure_image, image_foreign_host, text_image_ratio | upozornenie | odporúčanie |
Zástupné značky
| Značka | Hodnota |
|---|---|
{{df_name}}, {{df_surname}} | krstné meno, priezvisko |
{{df_salution}} | oslovenie v 5. páde („Petre“) |
{{df_emailaddress}} | e-mail príjemcu |
{{df_titlesbefore}}, {{df_titlesafter}}, {{df_gender}}, {{df_birthday}}, {{df_nameday}}, {{df_language}}, {{df_company}}, {{df_street}}, {{df_town}}, {{df_postalcode}}, {{df_country}}, {{df_phone}}, {{df_cellphone}}, {{df_notes}} | ďalšie polia kontaktu |
{{df_id}}, {{df_created}}, {{df_updated}}, {{df_domain}} | ID kontaktu, založenie, posledná zmena, doména adresy |
{{cf_<id>}} | vlastné pole podľa ID (viac hodnôt oddelených čiarkou) |
{{cl_sendername}}, {{cl_senderemail}} | meno a e-mail odosielateľa |
{{cl_company}}, {{cl_address}} | firma a adresa odosielajúceho e-shopu |
{{unsubscribe}} ({{unsubscribelink}}) | odkaz na odhlásenie jedným kliknutím |
{{preferences}} ({{confirmlink}}) | odkaz na nastavenie odberu |
{{webversion}} ({{webversionlink}}, {{forwardLink}}) | webová verzia e-mailu |
{{coupon_<klíč>}} | nový kód zo zásobníka kupónov s týmto kľúčom |
Náhrada prázdnej hodnoty: {{df_name|default('zákazníkovi', true)}}. Text náhrady má 1 až 40 znakov a nesmie obsahovať ' " \ { } < > | % &.
V testovacom e-maile sa doplní meno „Test“ a odkazy na odhlásenie vedú na ukázkovú stránku, takže test nikoho neodhlási.
Skripty (Twig)
Obsah smie obsahovať bezpečnú podmnožinu jazyka Twig, rovnako ako SmartEmailing: {% if %}, {% elseif %}, {% else %}, {% for %} (aj loop), {% set %}, komentáre {# #}, operátory and, or, not, in, ~, ??, ? :, testy (is defined, empty, null, even, odd, divisible by), filtre (abs, capitalize, date, default, first, join, json_encode, keys, last, length, lower, merge, number_format, replace, reverse, round, slice, sort, split, striptags, title, trim, upper, url_encode) a funkcie date(), min(), max(). Každá vypísaná hodnota sa escapuje, filter raw nie je k dispozícii.
Dáta pre skripty:
| Výraz | Čo vráti |
|---|---|
data.orders(filter, triedenie, limit) | objednávky kontaktu v e-shope e-mailu (najviac 200 najnovších); položky items[] |
data.products({'item_id': kód}, triedenie, limit) | produkty produktových feedov e-shopu |
data.articles(filter, triedenie, limit) | články článkových feedov (najviac 25) |
data.lists(filter) | zoznamy kontaktu a ich stavy |
data.promoCode('<názov zásobníka>') | nový kód kupónu zo zásobníka s týmto názvom pre každý e-mail |
data.promo.assigned('<zásobník>', od, do) | kódy, ktoré kontakt už dostal |
data.terminate('<dôvod>') | e-mail tomuto kontaktu neodošle (preskočí sa) |
metadata.order | objednávka, ktorá spustila beh automatizácie (len v e-maile automatizácie) |
metadata.event.attributes | dáta udalosti, ktorá beh spustila (košík: itemCount, total, currency, shopId; vlastná udalosť: name a data; návšteva: url, visitType, attributes) |
{% set o = metadata.order %}
{% if o %}
<p>Ďakujeme za objednávku {{ o.eshop_code }}.</p>
<ul>{% for item in o.items %}<li>{{ item.name }}</li>{% endfor %}</ul>
{% endif %}
<p>Váš kód: <strong>{{ data.promoCode('Svátek') }}</strong></p>- Kupón:
{{ data.promoCode('Svátek') }}berie názov zásobníka,{{coupon_svatek}}jeho kľúč (mergeKey). Keď zásobník dojde, e-mail neodíde a automatizácia zaznamená zlyhaniecustomizationDataboxOutOfPromocodes. - Skript, ktorý sa nedá spustiť, zastaví e-mail (
failed); kontrola obsahu ho nájde skôr akoscript_error. - Nepodporované: zoznam položiek košíka v e-maile (v dátach košíka je len počet kusov a súčet), všeobecné feedy (
data.generic.itemsvracia prázdny zoznam).
Testovací e-mail
- Ide len na testovacie adresy firmy (
GET /test-recipients); iná adresa = 400validation/to. POST /campaigns/{id}/tests{"to"},POST /templates/{id}/tests{"shopId", "to"}. Predmet dostane predponu[TEST], nič sa nemeria.- Najviac 10 testov jednej kampane alebo šablóny za 24 hodín (429
rate_limited/test).
curl -sS -X POST "https://www.postarna.cz/api/v1/tenants/$TENANT/campaigns/151/test" \
-H "Authorization: Bearer $POSTARNA_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"to": "test@example.cz"
}
JSON{
"to": "test@example.cz",
"sentAt": "2026-10-01T08:00:00.000Z"
}Pätičky, odhlasovacie stránky a ďalší obsah
- Pätičky (
/footers) a odhlasovacie stránky (/unsubscribe-pages) majú východiskovú položku firmy; šablóna a uzol automatizácie môžu mať vlastné. - Šablóny skriptov (
/script-templates), uložené prvky editora (/editor-elements), správca súborov (/files,/file-folders), landing pages, dotazníky a šablóny SMS majú vlastné skupiny v referencii.