What the direction actually says
TRAI's variable pre-tagging requirement isn't brand new — the Authority first directed access providers to limit content templates to two (later, with justification, more) variables and to pre-tag each one back in February and May 2023. Those earlier directions were never fully implemented. On 18 November 2025, TRAI issued a fresh direction (under section 13 of the TRAI Act, read with the Telecom Commercial Communications Customer Preference Regulations, 2018) noting that non-implementation directly, and instructing all access providers to enforce pre-tagging this time — based on a tag set the Cellular Operators Association of India (COAI) proposed on 5 September 2025 and all access providers, including BSNL, agreed to on 17 September 2025.
In short: every variable field in a registered content template must now carry a descriptive tag that specifies its content type, purpose and validation rule — and operators are required to scrub/validate the actual value sent in that slot against the declared type before delivering the message.
The six official variable tags (Annexure-I)
Generic, untyped variables are no longer accepted for new templates. Every variable must use one of these six tags:
| Tag | Purpose / example | Validation rule |
|---|---|---|
#numeric# (a.k.a. #number#) | Digits only — OTPs, amounts, counts | Digits only; no letters or special characters |
#url# | A web link, e.g. "Track order: #url#" | Must resolve to a registered CTA under Static, Dynamic or Short URL |
#urlott# | An app/OTT link, e.g. "Download app: #urlott#" | Must resolve to a registered CTA under OTT or APK link |
#cbn# | A callback number, e.g. "Call #cbn# for support" | Must match a registered CTA (mobile, landline or toll-free) |
#email# | An email address, e.g. "Write to #email#" | Must match a valid email pattern |
#alphanumeric# | Mixed IDs — booking/ticket/order numbers | Letters + numbers only; length-checked |
Two notation styles show up in the wild: the bare form TRAI's own Annexure-I uses
(#numeric#) and the curly-brace form most operator DLT portals display
({#numeric#}). This validator's template checker accepts either.
Primary source: TRAI Direction dated 18 November 2025, F.No. D-2711/(2)/2024-QoS (E-13563), and the accompanying press release.
Compliance timeline
| Milestone | Deadline |
|---|---|
| Direction issued | 18 November 2025 |
| All new content templates must be pre-tagged per Annexure-I | Templates registered from ~10 days after issuance (late Nov 2025) onward |
| Access providers begin scrubbing/validating tagged variables against whitelisted URLs/OTT links/APKs/callback numbers | Within 30 days of issuance (~mid-December 2025) |
| "Logger mode" grace period — non-compliant messages still delivered, faults only logged | First 60 days of scrubbing (~mid-February 2026) |
| Enforcement — messages failing variable-tag validation are rejected outright | From the end of the 60-day logger-mode window |
| Updated Code of Practice due from access providers | Within 90 days of issuance |
The logger-mode grace period has already lapsed, so as of today, outright rejection of non-compliant messages is the enforced default — there's no more "warn but deliver" fallback for untyped or mistyped variables.
How to migrate an existing template
- Pull every content template you currently have registered on your operator's DLT portal (or your CPaaS/SMS gateway's DLT dashboard).
- For each variable slot, decide which of the six tags actually describes the data — an OTP is
#numeric#, a tracking link is#url#, a support number is#cbn#, and so on. - Re-submit the updated template for approval through your content template registrar; approval typically takes about two working days.
- Update the message-construction code in your application or SMS gateway integration so the value it drops into each slot actually matches the declared type — a numeric-tagged slot should never receive a string with letters in it.
- Before going live, paste the updated template and a sample real message into the DLT template validator to confirm the structure and variable types line up.
Common mistakes that now cause rejection
Using a generic, untyped placeholder instead of one of the six tags is the most common one — those
are simply no longer accepted on new templates. Right behind it: putting two variables back-to-back
with no static text between them (only #alphanumeric# is allowed to sit next to another
tag without a separator), sending a URL that isn't on your registered CTA whitelist, and exceeding
the per-tag length limits most operators enforce during scrubbing (commonly 40 characters for
numeric/alphanumeric/email tags, 120 for URL tags).
Validate before you register
Paste your updated, tagged template and a real sample message into the validator to catch structural and type mismatches before you submit it — or before your operator's scrubber rejects live traffic. Open the validator →
Testing OTP delivery on a real number
To see how a newly tagged template actually renders once delivered, you can receive the test SMS on a free temporary Indian number instead of your own. Receive SMS online at receive-smss.live →