{
  "id": "OPS-150",
  "slug": "ops-150",
  "title": "Send only the message types the subscriber agreed to",
  "statement": "Message types the subscriber did not consent to must not be sent — a survey to an OTP-only list, marketing to a transactional opt-in.",
  "rationale": "Consent has a scope, and the scope is the category described at opt-in, not the sending platform's idea of a contact list. Sending outside it is unconsented messaging however carefully the original opt-in was collected, and it is the failure that turns a well-run programme into a complaint source, because the recipients did opt in — to something else.",
  "layer": "OPERATIONAL",
  "layerSlug": "operational",
  "object": "message type against the consent record scope",
  "severity": "BLOCKING",
  "detectability": [
    "UNDETECTABLE_PRE_SUBMISSION"
  ],
  "failureClass": "TERMINAL_EXTERNAL",
  "authorities": [
    "AWS",
    "CTIA"
  ],
  "applicabilityText": "Applies to every 10DLC registration.",
  "universal": true,
  "remediation": "Store the consent scope on the record and check it before a send rather than segmenting by list membership. Done when a marketing send cannot include numbers whose consent was transactional.",
  "notes": "A comparison between a send and a stored scope. What the user has to check is whether the scope is stored at all — where consent is a boolean, this rule cannot be satisfied by any amount of care at send time. OPS-209 and OPS-199 cover recording it.",
  "phase": "post",
  "automated": false,
  "attestation": {
    "question": "Is the consent scope stored on each record — or is consent a boolean?",
    "howToCheck": [
      "Look at the consent record itself. Where consent is a boolean, this rule cannot be satisfied by any amount of care at send time.",
      "Check the scope before a send rather than segmenting by list membership.",
      "Done when a marketing send cannot include numbers whose consent was transactional."
    ],
    "failureLooksLike": "A survey to an OTP-only list. The recipients did opt in — to something else — which is what turns a carefully run programme into a complaint source."
  },
  "url": "https://ekas.io/rules/10dlc/operational/ops-150/",
  "markdown": "https://ekas.io/rules/10dlc/operational/ops-150.md",
  "registry": "https://ekas.io/rules/10dlc/",
  "updated": "2026-07-25",
  "licence": "CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/"
}
