Template: Crea, Versiona e Test
Gestisci template email versionati con sostituzione di variabili
I template sono template email riutilizzabili con variabili placeholder. Invece di comporre HTML nel codice ogni volta, definisci un template una volta e invialo centinaia di volte con variabili diverse.
Due Formati: HTML e Markdown
Ogni template ha un format, scelto alla creazione e immutabile dopo:
html(default) — l'HTML dell'email lo fornisci tu. Tutto in questa pagina usa questo formato.emailmd— fornisci markdown nel campomarkdown; il server lo renderizza in HTML responsive ed email-safe al salvataggio e memorizza il markdown comesource. Il campohtmldella risposta è l'output renderizzato e non può essere impostato direttamente (inviarehtmlper questo formato fallisce con 422). Un endpoint statelessPOST /v1/templates/render-previewrenderizza il markdown senza salvare.
I template markdown hanno una guida dedicata — sintassi, modello di sicurezza,
flusso end-to-end: Template Markdown.
Le risposte in questa pagina omettono il campo format per brevità; i
template creati prima dell'esistenza dei formati sono html.
Crea un Template
Un template è un nome più un corpo. La richiesta accetta name, format e
uno fra html e markdown — nient'altro.
Un template non ha un oggetto. Non esiste un campo subject sul template,
né un campo text che tu possa impostare: l'oggetto appartiene al singolo
invio. Passarlo in questa richiesta non ha alcun effetto — viene scartato in
silenzio, non memorizzato.
cURL
curl -X POST https://api.tratto.email/v1/templates \
-H "Authorization: Bearer tratto_live_..." \
-H "Content-Type: application/json" \
-d '{
"name":"Email di Benvenuto",
"html":"<h1>Benvenuto, {{firstName}}!</h1><p>Il tuo codice: {{code}}</p>"
}'Risposta:
{
"data": {
"id": "tmpl_abc123",
"name": "Email di Benvenuto",
"html": "<h1>Benvenuto, {{firstName}}!</h1><p>Il tuo codice: {{code}}</p>",
"status": "draft",
"version": 1,
"createdAt": "2025-06-30T12:00:00Z",
"updatedAt": "2025-06-30T12:00:00Z"
}
}status è un'etichetta, non un gate
Un template nasce con status: "draft", e status accetta draft o
published. Finisce lì: è un'etichetta editoriale per il tuo flusso di
lavoro, e l'API non la fa rispettare in alcun modo.
Un template draft si invia. Il percorso di consegna carica il template e
ne legge l'html: non guarda mai status. Se ti serve che «non pronto per
l'invio» significhi davvero questo, imponilo nel tuo codice — non contare sul
rifiuto dell'API.
Cambia l'etichetta come qualsiasi altro campo:
cURL
curl -X PATCH https://api.tratto.email/v1/templates/tmpl_abc123 \
-H "Authorization: Bearer tratto_live_..." \
-H "Content-Type: application/json" \
-d '{"status":"published"}'È anche un filtro sull'endpoint di elenco: GET /v1/templates?status=published.
Invia Usando un Template
Il template fornisce il corpo. subject è obbligatorio sull'invio e va
passato ogni volta: se lo ometti la richiesta fallisce con 422.
cURL
curl -X POST https://api.tratto.email/v1/emails \
-H "Authorization: Bearer tratto_live_..." \
-H "Content-Type: application/json" \
-d '{
"from":"[email protected]",
"to":"[email protected]",
"subject":"Benvenuta, {{firstName}}!",
"templateId":"tmpl_abc123",
"variables":{
"firstName":"Alice",
"code":"SECRET123"
}
}'Risultato:
Subject: Benvenuta, Alice!
HTML: <h1>Benvenuto, Alice!</h1><p>Il tuo codice: SECRET123</p>L'oggetto viene renderizzato con le stesse variables del corpo, quindi
{{firstName}} funziona in entrambi. Una variabile che non passi diventa una
stringa vuota anche nell'oggetto — vedi Passa Sempre Tutte le Variabili più
sotto.
Un template html non ha una parte testuale. Un template Markdown fissa al
salvataggio una parte testuale renderizzata, e quella viene inviata come
text/plain accanto all'HTML.
Aggiorna un Template
Aggiorna un template. Questo crea una nuova versione, lasciando intatte le versioni precedenti.
cURL
curl -X PATCH https://api.tratto.email/v1/templates/tmpl_abc123 \
-H "Authorization: Bearer tratto_live_..." \
-H "Content-Type: application/json" \
-d '{
"html":"<h1>Benvenuto di nuovo, {{firstName}}!</h1><p>Codice: {{code}}</p>"
}'Risposta: il template completo, con version incrementata.
{
"data": {
"id": "tmpl_abc123",
"name": "Email di Benvenuto",
"html": "<h1>Benvenuto di nuovo, {{firstName}}!</h1><p>Codice: {{code}}</p>",
"status": "draft",
"version": 2,
"createdAt": "2025-06-30T12:00:00Z",
"updatedAt": "2025-06-30T12:05:00Z"
}
}La versione si incrementa solo se il contenuto cambia davvero: una PATCH che
reimposta lo stesso HTML la lascia com'è. Le versioni non hanno uno status
proprio, e il bump di versione non tocca lo status del template.
Per i template Markdown, aggiorna invece il campo markdown — ogni modifica
ri-renderizza l'HTML e incrementa la versione allo stesso modo. html e
markdown sono mutuamente esclusivi in una PATCH, e ciascuno è accettato solo
da un template del formato corrispondente (422 altrimenti).
Cronologia delle Versioni
Elenca le versioni di un template, dalla più recente (fino a 20). Ogni voce contiene solo il numero di versione e il momento del salvataggio:
cURL
curl https://api.tratto.email/v1/templates/tmpl_abc123/versions \
-H "Authorization: Bearer tratto_live_..."Risposta:
{
"data": [
{ "version": 2, "savedAt": "2025-06-30T12:05:00Z" },
{ "version": 1, "savedAt": "2025-06-30T12:00:00Z" }
]
}Ottieni una Versione
Per leggere il contenuto di una versione passata — l'unico modo di recuperarlo — richiedila per numero:
cURL
curl https://api.tratto.email/v1/templates/tmpl_abc123/versions/1 \
-H "Authorization: Bearer tratto_live_..."Risposta:
{
"data": {
"version": 1,
"html": "<h1>Benvenuto, {{firstName}}!</h1><p>Il tuo codice: {{code}}</p>",
"savedAt": "2025-06-30T12:00:00Z"
}
}Su un template Markdown la risposta porta anche source: il markdown che ha
prodotto l'HTML di quella versione.
Invio di Test
Invia un'email di test usando il template per verificare che appaia corretta.
cURL
curl -X POST https://api.tratto.email/v1/templates/tmpl_abc123/test-send \
-H "Authorization: Bearer tratto_live_..." \
-H "Content-Type: application/json" \
-d '{
"to":"[email protected]",
"variables":{
"firstName":"Alice",
"code":"TEST123"
}
}'Un'email di test viene inviata immediatamente al tuo indirizzo in modo che tu possa esaminarla nella tua inbox.
Il suo oggetto è [Test] seguito dal nome del template. Un invio di test non
ha un contatto, quindi le variabili del destinatario che non passi prendono
valori di anteprima: email è l'indirizzo di test, firstName è Preview,
lastName è Recipient e unsubscribe_url è un link di anteprima che non
disiscrive nessuno. Ogni altra variabile che ometti diventa vuota, come in un
invio reale.
Elenca i Template
Ottieni tutti i template per il tuo tenant.
cURL
curl https://api.tratto.email/v1/templates \
-H "Authorization: Bearer tratto_live_..."Ottieni un Template
Recupera un template specifico.
cURL
curl https://api.tratto.email/v1/templates/tmpl_abc123 \
-H "Authorization: Bearer tratto_live_..."Elimina un Template
Elimina permanentemente un template (non può essere annullato).
cURL
curl -X DELETE https://api.tratto.email/v1/templates/tmpl_abc123 \
-H "Authorization: Bearer tratto_live_..."L'eliminazione di un template non può essere annullata. Le campagne e i flussi che usano quel template falliranno.
Sintassi Variabile del Template
Usa le doppie graffe {{variableName}} per i placeholder — gli spazi attorno
sono ammessi, quindi funziona anche {{ firstName }}. Le variabili fanno
distinzione tra maiuscole e minuscole. Non ci sono condizioni né cicli: è
sostituzione, non un linguaggio di template.
Template:
HTML: <p>Ciao {{firstName}}, la tua email è {{email}}</p>Invio:
{
"variables": {
"firstName": "Alice",
"email": "[email protected]"
}
}Renderizzato:
HTML: <p>Ciao Alice, la tua email è [email protected]</p>La sostituzione si applica all'oggetto e ai corpi HTML e testo.
Best Practice
1. Usa Nomi Variabili Semantici
✅ {{firstName}}, {{orderID}}, {{confirmationCode}}
❌ {{x}}, {{var1}}, {{v}}
2. Passa Sempre Tutte le Variabili
Una variabile mancante non fa fallire l'invio: il placeholder viene sostituito con una stringa vuota. Questo template
<p>Ciao {{firstName}}, benvenuto a {{companyName}}!</p>inviato senza firstName né companyName arriva come Ciao , benvenuto a !
— la punteggiatura resta orfana, ma il destinatario non vede mai il nome della
tua variabile.
Vale per l'oggetto e per il corpo, in HTML e in Markdown, sia sugli invii
transazionali che sulle campagne. Anche null sostituisce vuoto: non
comparirà mai la stringa null o undefined in un'email.
Non è un invito a passare meno variabili — al contrario. Una frase con un
buco resta una frase sbagliata, e ora niente te lo segnala: né all'invio,
né prima. Con il placeholder visibile un refuso come {{firstname}} al posto
di {{firstName}} almeno si notava nell'anteprima; con la sostituzione vuota
sparisce senza lasciare traccia.
Il controllo automatico esiste solo per le campagne, dove Tratto conosce
l'insieme delle variabili disponibili (email, firstName, lastName,
unsubscribe_url) e può quindi segnalare in bozza quelle che non ne fanno
parte. Per un template non è possibile: le variabili arrivano da chi chiama
POST /v1/emails, quindi non esiste un insieme contro cui verificarle e ogni
controllo sarebbe un'ipotesi.
Su un template, quindi, l'unica difesa è passare a ogni invio tutti i placeholder che il template usa.
3. Usa Template per Invii Bulk
Non comporre HTML per ogni email. Usa template e variabili per consistenza e riutilizzabilità.
4. Fai un Test Prima di Usarlo
Fai sempre un test-send del template prima di inviarlo a qualcuno, per
intercettare problemi di rendering. Nulla impedisce a un template draft di
partire: il test-send è l'unico controllo che esiste.
Prossimi Passi
- Inviare con un template? Vedi Invia Email
- Scrivere template in markdown? Vedi Template Markdown
- Usare i template nelle campagne? Vai a Campagne
- Usare i template nei flussi? Vedi Flussi
Modifica questa pagina su GitHub
Ultimo aggiornamento