{
  "id": "OPS-207",
  "slug": "ops-207",
  "title": "The consent record must name the page the opt-in came from",
  "statement": "Every consent record must carry the source URL of the consent surface.",
  "rationale": "A brand usually has several places a consumer can opt in — a footer form, a checkout box, a landing page for one campaign — and they carry different disclosure wording. Storing only \"web\" makes every one of those records identical, so when a reviewer asks which page a specific consumer used, nobody can answer. The innocent cause is that the form posts to one endpoint, and the endpoint records itself rather than the page that called it.",
  "layer": "OPERATIONAL",
  "layerSlug": "operational",
  "object": "campaign.message_flow + privacy policy",
  "severity": "HIGH",
  "detectability": [
    "AI_FORM"
  ],
  "failureClass": "RETRY_FIELD",
  "authorities": [
    "CTIA",
    "Telnyx"
  ],
  "applicability": {
    "consentMethods": [
      "web_form",
      "checkout",
      "account_settings",
      "third_party",
      "chat",
      "social",
      "email",
      "qr"
    ]
  },
  "applicabilityText": "Applies when consent was collected by web form, checkout, account settings, third party, chat, social, email and QR code.",
  "universal": false,
  "remediation": "Store the full URL of the page the opt-in was submitted from — path and query included — on each consent record, and describe that in the message flow. Done when you can take any consent record and open the exact page that produced it.",
  "example": "Each opt-in stores source_url: https://acmecoffee.com/signup?src=instore-qr, alongside the timestamp and IP.",
  "pitfalls": [
    "Storing the form-handler endpoint rather than the referring page produces one URL for every record, which is the same failure with a longer string in it."
  ],
  "notes": "Registration-side twin: we judge whether the programme describes storing the field, never whether the stored record exists.",
  "phase": "approval",
  "automated": true,
  "url": "https://ekas.io/rules/10dlc/operational/ops-207/",
  "markdown": "https://ekas.io/rules/10dlc/operational/ops-207.md",
  "registry": "https://ekas.io/rules/10dlc/",
  "updated": "2026-07-25",
  "licence": "CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/"
}
