{
  "id": "CON-FLOW-SPECIFIC",
  "slug": "con-flow-specific",
  "title": "The message flow must describe a real, specific opt-in",
  "statement": "The message flow must name where consent happens concretely enough for a reviewer to find and verify it.",
  "rationale": "Reviewers verify by going and looking. A flow that says \"customers opt in on our website\" gives them nowhere to go, so they reject rather than hunt — this is the single most common campaign-level rejection reason across every provider.",
  "layer": "CONSENT_FLOW",
  "layerSlug": "consent-flow",
  "object": "campaign.message_flow",
  "severity": "BLOCKING",
  "detectability": [
    "AI_FORM"
  ],
  "failureClass": "RETRY_FIELD",
  "authorities": [
    "TCR",
    "Twilio",
    "Bandwidth",
    "AWS"
  ],
  "codes": [
    {
      "provider": "Twilio",
      "code": "30896",
      "remediable": true,
      "generation": "gen1"
    }
  ],
  "applicabilityText": "Applies to every 10DLC registration.",
  "universal": true,
  "remediation": "Name the exact surface — the page URL, the form, the physical location, or the script — and quote the consent wording the consumer agrees to. Add the link to your hosted evidence.",
  "example": "Customers opt in at https://acmecoffee.com/signup by ticking an unchecked box reading: \"By checking this box, you agree to receive recurring automated marketing text messages from Acme Coffee at the number provided. Consent is not a condition of any purchase. Message frequency varies. Message and data rates may apply. Reply STOP to unsubscribe or HELP for help.\" Screenshot: https://cdn.acmecoffee.com/compliance/optin.png",
  "phase": "approval",
  "automated": true,
  "url": "https://ekas.io/rules/10dlc/consent-flow/con-flow-specific/",
  "markdown": "https://ekas.io/rules/10dlc/consent-flow/con-flow-specific.md",
  "registry": "https://ekas.io/rules/10dlc/",
  "updated": "2026-07-25",
  "licence": "CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/"
}
