DLT SMS Template Checker
Paste a TRAI DLT SMS template and see the common rejection causes before you register it: untyped variables, adjacent variables, the two-variable limit, per-tag length, GSM-7 vs Unicode segments, and promotional wording on a service header.
What it checks
- Variable count: two is the limit, a third needs recorded exigency, more needs a written requisition.
- Non-contiguity: variables cannot touch or be separated only by a space, comma, or special character.
- Pre-tag types: every slot must be typed ({#numeric#}, {#alphanumeric#}, {#url#}, {#urlott#}, {#cbn#}, {#email#}), not a bare {#var#}.
- Length and encoding: estimates the filled-message length, flags Unicode characters that cut the per-part limit from 160 to 70, and counts SMS parts.
- Header category hint: flags marketing wording that cannot ride a Service Implicit or Transactional header.
FAQs
What does this DLT template checker do?
It runs a set of static checks on a DLT SMS content template and flags the mistakes that most often cause silent rejections or delivery failures: untyped {#var#} slots, variables that sit next to each other, more than two variables, encoding that forces a Unicode message, and marketing wording on a message you intend to send as a service or transactional alert. It does not register, submit, or send anything, and it never leaves your browser.
What are the DLT variable pre-tag types?
Since TRAI's 2026 pre-tagging rules, every variable in a template must declare a type. The types are {#numeric#}, {#alphanumeric#}, {#url#}, {#urlott#}, {#cbn#} (call-back number) and {#email#}. A plain {#var#} with no type is rejected on new templates. Each type also has its own character ceiling in scrubbing (for example, #alphanumeric# is capped at 40 characters and #cbn# at 3 to 14).
Why does my template get rejected even though my gateway accepts it?
Your gateway acking a message is not the same as the operator delivering it. During the initial scrubbing window the rules allow a logger mode, where a failing message is still delivered while a fault message is generated behind the scenes, so your dashboard looks green while the template is quietly non-compliant. After that window, the same message is rejected outright. The usual causes are an edited body that no longer matches the registered template, an untyped variable, or the wrong header category.
How many variables can a DLT template have?
The rules limit a content template to two variables. A third is allowed only for recorded reasons (exigency), and more than three needs a written requisition with justification from the Principal Entity. Variables must also be non-contiguous, meaning you cannot place two variables next to each other or separate them only with a space, comma, or special character. There has to be real static text between them.
Can an OTP message use a Transactional header?
Usually no. Under DLT, the Transactional category is restricted to banks sending OTPs. An OTP or alert from a non-bank SaaS or business goes out on a Service Implicit header, not a Transactional one. Registering everything as Transactional is a common mistake that gets traffic filtered. If you are a bank, Transactional applies. For everyone else, which is most senders, it is Service Implicit.
Is this an official TRAI or gateway tool?
No. It is a free heuristic checker we built at buildbyRaviRai from running notification systems in production. It follows the rules in TRAI's Direction of 18 November 2025, but it cannot replace your operator's live scrubbing, and ceilings can change. Always confirm the current rules and your header category with your SMS gateway. For the full architecture behind this, see our DLT-compliant notification service guide.
Building the notification layer behind this?
The full guide covers the typed template registry, provider failover, idempotency, and delivery reconciliation. Or tell us your setup and we will build it.