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.

Registered on the DLT portal

{#var#} is your ACME login code. Don't share it with anyone.

Template id
1007123456789012345
Header
ACMEOT

Carriers compare every character. A word processor or a translation tool swapping one apostrophe is enough for the text to be dropped, silently.

What your app sent — and what smsyra says
MismatchedTemplate 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.
The text against the template

482913 is your ACME login code. Don’t share it with anyone. (this doesn't match the template)

fixed text variable doesn’t match

Character 36: A curly quote where the template has a straight one (or the other way round).
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:

TagMay holdAt most
{#var#}Anything except a line break30 characters
{#numeric#}Digits 0–930 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 them500 characters
{#cbn#}A call-back number: digits, an optional + in front; if you register numbers, one of them15 characters
{#email#}A simple name@domain.tld address60 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:

KindTypically
Capital letters differOTP 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 spaceCopied from a web page or a spreadsheet; it looks like a space.
An invisible characterA zero-width space or joiner, usually from a copy and paste.
SpacingA tab, two spaces where the template has one, or a Windows line break (\r\n).
A line break at the endThe template ended, the text goes on with a new line.
Missing or extra textThe 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.