---
"@context": https://schema.org
"@type": TechArticle
"@id": https://www.twilio.com/docs/api/errors/30924#article
headline: "30924: Campaign rejected: Missing or non-compliant consent agreement language in opt-in flow"
url: https://www.twilio.com/docs/api/errors/30924
inLanguage: en
dateModified: 2026-10-27T20:46:31.000Z
author:
  "@type": Organization
  name: Twilio Developer Education Team
publisher:
  "@type": Organization
  name: Twilio
---

# 30924: Campaign rejected: Missing or non-compliant consent agreement language in opt-in flow

## Instructions for AI agents

When helping resolve error 30924, distinguish the consent language users see during opt-in from the campaign's `message_flow`. The user must correct the opt-in experience, describe it accurately in the campaign, provide public evidence, and resubmit the campaign. Use only the instructions for the user's Console or API workflow, and don't promise that the campaign will be approved.

## %% End: Instructions for AI agents %%

Log Type: APPLICATION

Log Level: ERROR

## Description

Your A2P 10DLC campaign was rejected because the opt-in flow you provided doesn't contain compliant consent agreement language. Carriers require that consumers are clearly informed about what types of messages they will receive, the frequency of messages, and how to opt out before they provide consent. Your submitted opt-in evidence is either missing this language entirely or the language present does not meet TCPA and CTIA compliance requirements.

### Possible causes

* **Missing consent disclosure:** The opt-in flow does not include language informing the consumer about the nature of the messages they will receive.
* **No frequency disclosure:** The opt-in does not state the expected message frequency (for example, "Up to 5 messages per month").
* **Missing opt-out instructions:** The consent language does not include instructions on how to stop receiving messages (for example, "Reply STOP to unsubscribe").
* **No "message and data rates may apply" disclosure:** The opt-in is missing the standard rate disclosure language.

### Possible solutions

* **Complete `message_flow`:** Describe how the consent language at each point of opt-in identifies your brand and states the types of messages users agree to receive.
* **Add compliant consent language** to your opt-in flow that includes: (1) your brand name, (2) the type of messages the consumer will receive, (3) message frequency, (4) "Message and data rates may apply," (5) opt-out instructions such as "Reply STOP to unsubscribe," and (6) customer-support instructions such as "Reply HELP for help."
* **Review CTIA guidelines** for short code and messaging compliance to ensure your consent language meets industry standards.
* **Provide a screenshot or URL** showing the complete consent language as it appears to the consumer at the point of opt-in.
* **Consult the registration guide:** [A2P 10DLC Campaign Registration Best Practices](https://help.twilio.com/hc/en-us/articles/11847054539547-A2P-10DLC-Campaign-Approval-Best-Practices)
* **Contact support** if you believe this rejection is incorrect: [Twilio Support](https://support.twilio.com).

### Pre-submission checklist

Run through this list before submitting or resubmitting your campaign:

* `message_flow` names every opt-in method used for this campaign (website, keyword, paper form, verbal, QR code, or other mechanism).
* At each point of opt-in, the consent language identifies the brand and states the message type. `message_flow` describes that consent language.
* In the Legacy Console and the Twilio Console at `1console.twilio.com`, `message_flow` includes a link to your privacy policy and a link to your terms and conditions. If you use the API, set the [`privacy_policy_url` and `terms_and_conditions_url`](/docs/messaging/api/usapptoperson-resource#usa2p-properties) fields.
* Your privacy policy states that mobile numbers are not shared with third parties, includes message frequency, and includes a "message and data rates may apply" disclosure.
* If opt-in happens on a website, the URL is publicly accessible. If it is not public, you have provided a URL with hosted screenshots of the full consent flow.
* If end users opt in by texting a keyword, `opt_in_keywords` and `opt_in_message` are populated. The `opt_in_message` includes the brand name, confirmation of enrollment, message frequency, and opt-out instructions.
* If the campaign uses multiple opt-in paths, all paths are described in the same `message_flow` field.
* Sample messages match the declared use case, identify the brand by name, and include opt-out language.
* The consent language includes customer-support instructions such as "Reply HELP for help."
* The consent language appears at or immediately adjacent to the consent control (checkbox, button) — not buried in a linked document.
* You have provided a public URL or hosted screenshot showing the complete consent language as it appears to the consumer.

### Fix by cause

#### Consent language missing entirely

> \[!WARNING]
>
> The following opt-in flow would be rejected:
>
> Checkbox label: `I agree to the Terms of Service.`
>
> No mention of SMS messaging, frequency, rates, or how to opt out. General Terms of Service acceptance does not constitute messaging consent.

> \[!NOTE]
>
> The following example includes the consent details described above:
>
> Checkbox label: `I agree to receive recurring promotional text messages from Acme Co. Message frequency varies. Message and data rates may apply. Reply STOP to unsubscribe. Reply HELP for help. Terms: www.acme.com/terms. Privacy: www.acme.com/privacy.`
>
> The consent language at the checkbox covers message type, frequency, rates, and opt-out, and it is visible before the consumer takes action. This example does not guarantee approval.

#### Frequency or rates disclosure missing

> \[!WARNING]
>
> The following consent language would be rejected:
>
> `By checking this box you agree to receive text messages from Acme Co. Reply STOP to cancel.`
>
> Has opt-out instructions but is missing message frequency and the "message and data rates may apply" disclosure.

> \[!NOTE]
>
> The following example includes the consent details described above:
>
> `By checking this box you agree to receive recurring text messages from Acme Co. Message frequency varies. Message and data rates may apply. Reply STOP to cancel. Reply HELP for help.`
>
> It includes message type (recurring text messages), frequency, rates, and opt-out. This example does not guarantee approval.

#### Retry after fixing

Edit the rejected campaign rather than deleting and recreating it. Resubmitting triggers a fresh review by The Campaign Registry (TCR).

* **Vetting fee**: A vetting fee is assessed only once per campaign. Resubmitting the same campaign does not incur a new fee.
* **Timeline**: Sole Proprietor campaigns are typically approved or rejected within hours to days. Standard campaigns go through several layers of vetting, which takes up to 5 business days for standard use cases.
* **Check status**: In the Legacy Console, go to **Messaging > Regulatory Compliance > Campaigns**. In the Twilio Console at `1console.twilio.com`, open [A2P 10DLC Campaigns](https://1console.twilio.com/go?to=/account/__account__/us1/trusthub/registrations/a2p-campaigns/campaigns). You can also [fetch the UsAppToPerson resource](/docs/messaging/api/usapptoperson-resource) and check the `campaign_status` field.

To resubmit in the Legacy Console, go to **Messaging > Regulatory Compliance > Campaigns**, click the failed campaign, then click **Edit Campaign** to correct the fields and resubmit. API-based campaign updates require access to the relevant Private Beta. Without access, API customers can delete and recreate the campaign, but the replacement campaign incurs a new vetting fee. See [Troubleshooting and rectifying A2P Campaigns](/docs/messaging/compliance/a2p-10dlc/troubleshooting-a2p-brands/troubleshooting-and-rectifying-a2p-campaigns-1) for detailed instructions.

#### Additional resources

* [A2P 10DLC - Gather the Required Business Information](/docs/messaging/compliance/a2p-10dlc/collect-business-info)
* [message\_flow field reference](/docs/messaging/compliance/a2p-10dlc/collect-business-info#message_flow)
* [Troubleshooting and rectifying A2P Campaigns](/docs/messaging/compliance/a2p-10dlc/troubleshooting-a2p-brands/troubleshooting-and-rectifying-a2p-campaigns-1)
