DLT templates
In India, every business text must match a content template registered on a DLT portal. Carriers compare the two and silently drop a text that doesn’t match. smsyra checks every text the same way, so you see the mismatch in staging.
Exact match
The fixed text of a template — everything outside the {#…#} tags — must appear in the text exactly as registered: the same letters in the same case, the same quotes and dashes, the same spaces and line breaks. One character off is a mismatch, and smsyra tells you which character and why.
{#var#} is your ACME login code. Don't share it with anyone.
Carriers compare every character. A word processor or a translation tool swapping one apostrophe is enough for the text to be dropped, silently.
1007123456789012345- Error: Character 36: the template has ' but the text has ’ (a curly quote where the template has a straight one).
- Warning: That one curly quote makes the text Unicode: 70 characters a part instead of 160.
482913 is your ACME login code. Don’t share it with anyone. (this doesn't match the template)
fixed text variable doesn’t match
- Template has
't·share·it·- Text has
’t·share·it·- Around it
login code. Don’t share it with
Invisible characters are shown as · (space), ⍽ (non-breaking space), ↵ (line break), ⇥ (tab).
Variables and typed tags
Each tag stands for a value your app fills in. {#var#} holds anything up to 30 characters on one line. Since January 2026 new templates may also use typed tags, which only accept their own kind of value:
| Tag | May hold | At most |
|---|---|---|
{#var#} | Anything except a line break | 30 characters |
{#numeric#} | Digits 0–9 | 30 characters |
{#alphanumeric#} | Letters, digits, spaces and . , - / : ' ( ) & # _ (lenient, the default) — or letters and digits only (strict) | 30 characters |
{#url#}, {#urlott#} | An http:// or https:// address with no spaces; if you register URLs, it must start with one of them | 500 characters |
{#cbn#} | A call-back number: digits, an optional + in front; if you register numbers, one of them | 15 characters |
{#email#} | A simple name@domain.tld address | 60 characters |
A value that is too long, or has a character its tag doesn’t allow, makes the text a mismatch even when the fixed text is right; smsyra points at the variable. Tags are case-insensitive ({#Numeric#} works); anything else in braces, like {#name#}, is fixed text.
What smsyra reports
For a mismatch, the first place the text differs from the template, as one of:
| Kind | Typically |
|---|---|
| Capital letters differ | OTP in the template, otp in the text. |
| A curly quote | ’ or “ ” where the template has ' or " — or the other way round. Word processors and translation tools do this. |
| A different dash | – or — where the template has -. |
| An ellipsis character | … where the template has three dots. |
| A non-breaking space | Copied from a web page or a spreadsheet; it looks like a space. |
| An invisible character | A zero-width space or joiner, usually from a copy and paste. |
| Spacing | A tab, two spaces where the template has one, or a Windows line break (\r\n). |
| A line break at the end | The template ended, the text goes on with a new line. |
| Missing or extra text | The template goes on where the text stopped, or the text goes on where the template stopped. |
It also flags a text sent with the wrong template id (when it matches another of yours), an id you haven’t registered, a template that isn’t approved, and a sender that isn’t the template’s header. Without an id (Twilio sends none), smsyra finds the matching template by the text.
Curly quotes and Unicode
A text made only of the GSM-7 alphabet goes as 160 characters a part (153 when it needs several). A single character outside it — a curly quote, ₹, an emoji, Hindi — sends the whole text as Unicode: 70 characters a part (67 when split). The same message can cost two or three times as many parts. smsyra shows the parts on each text and warns when a template itself forces Unicode.
Your workspace’s rules
- Whitespace: Exact (the default) — a double space or a trailing line break is a mismatch, like on the network. Lenient — whitespace-only differences are warnings.
- Alphanumeric: Lenient (the default) or Strict, as in the table above.
- Registered URLs and call-back numbers: when you list them,
{#url#}and{#cbn#}values must match.
An owner changes these in Settings → DLT rules; the next text is checked with them.
Getting your templates in
Import the export from your DLT portal (CSV or Excel) — Jio: Registered with all TSPs → Download as Excel; Airtel, Vi, BSNL: Content templates → Approved → Download excel. If Excel shows ids like 1.07E+18, export as CSV or format the id column as Text: a rounded id can’t be matched. Or paste templates one by one.
MSG91 Flow and Fast2SMS’s dlt route send an id instead of the text; a provider mapping tells smsyra which template it stands for. See the MSG91 and Fast2SMS guides.