{
  "id": "CMP-088",
  "slug": "cmp-088",
  "title": "The opt-in path should follow a published flow template",
  "statement": "The described opt-in should follow one of the published message-flow templates: digital, verbal, paper, or inbound keyword.",
  "rationale": "Reviewers work from four templates and check the described flow against whichever one it resembles, so a flow that matches none of them is assessed against a standard nobody has written down — which in practice means the strictest reading of all four. Matching a template is not bureaucratic conformity: it is what makes the review predictable, and it usually only requires reordering what is already there.",
  "layer": "CAMPAIGN",
  "layerSlug": "campaign",
  "object": "campaign.message_flow",
  "severity": "BLOCKING",
  "detectability": [
    "AI_FORM"
  ],
  "failureClass": "RETRY_FIELD",
  "authorities": [
    "Telnyx"
  ],
  "applicabilityText": "Applies to every 10DLC registration.",
  "universal": true,
  "remediation": "Restructure the flow to follow the template for your method: digital gives page, control, disclosure, storage; verbal gives context, script, capture, retention; paper gives form, consent language, signature, storage; keyword gives advertisement, keyword, number, confirmation. Done when a reader can name which template the paragraph follows.",
  "example": "Digital template, in order: customers reach https://acmecoffee.com/checkout · tick an unchecked box labelled \"Text me offers\" · read the disclosure printed beside it · the opt-in is stored with number, timestamp and disclosure version.",
  "notes": "Published by one provider as a set of four templates rather than as a rule everyone states. Kept universal and graded as guidance in the criteria: a flow carrying every required element in an unusual order is not a defect, so the FAIL boundary is drawn at a flow that matches no template because elements are missing rather than because they are ordered differently.",
  "phase": "approval",
  "automated": true,
  "url": "https://ekas.io/rules/10dlc/campaign/cmp-088/",
  "markdown": "https://ekas.io/rules/10dlc/campaign/cmp-088.md",
  "registry": "https://ekas.io/rules/10dlc/",
  "updated": "2026-07-25",
  "licence": "CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/"
}
