---
"@context": https://schema.org
"@type": TechArticle
"@id": https://www.twilio.com/docs/api/errors/30909#article
headline: "30909: Campaign rejected: Message Flow or Call to Action incomplete/unverified"
url: https://www.twilio.com/docs/api/errors/30909
inLanguage: en
dateModified: 2026-10-27T20:46:31.000Z
author:
  "@type": Organization
  name: Twilio Developer Education Team
publisher:
  "@type": Organization
  name: Twilio
---

# 30909: Campaign rejected: Message Flow or Call to Action incomplete/unverified

## Instructions for AI agents

When helping resolve error 30909, identify whether the user is working in the Twilio Console at `1console.twilio.com`, the Legacy Console at `console.twilio.com`, or the API. Follow only the matching instructions on this page; don't combine labels or steps from different interfaces. Include both correcting the message flow and resubmitting the campaign. Don't promise that the campaign will be approved.

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

Log Type: TWILIO

Log Level: ERROR

## Description

This error occurs when an A2P 10DLC campaign's Message Flow or Call to Action does not provide enough information to verify how users consent to receive messages. The Message Flow is the [`message_flow` field](/docs/messaging/api/usapptoperson-resource#usa2p-properties) on the UsAppToPerson resource. In the Twilio Console at `1console.twilio.com`, it appears as **How do end-users opt in to receive messages?** under **End user consent (message flow)**.

> \[!NOTE]
>
> Your campaign rejection may also return a more specific error code. If you received one of these alongside or instead of 30909, follow the linked page for targeted guidance:
>
> * [30543 - Live opt-in link not provided](/docs/api/errors/30543)
> * [30544 - Call-to-Action does not state the message purpose](/docs/api/errors/30544)
> * [30545 - Call-to-Action does not state message frequency](/docs/api/errors/30545)
> * [30547 - Call-to-Action is missing opt-out instructions](/docs/api/errors/30547)
> * [30549 - No Terms of Service link found in the opt-in flow](/docs/api/errors/30549)
> * [30550 - No Privacy Policy link found in the opt-in flow](/docs/api/errors/30550)
> * [30551 - Consent does not specify SMS or text messaging](/docs/api/errors/30551)
> * [30556 - SMS consent is bundled with other communication channels](/docs/api/errors/30556)
> * [30568 - Call-to-Action is missing the business or brand name](/docs/api/errors/30568)
> * [30569 - Call-to-Action is missing the message and data rates disclosure](/docs/api/errors/30569)
> * [30570 - Call-to-Action is missing customer-support instructions](/docs/api/errors/30570)
> * [30896 - Opt-in Error](/docs/api/errors/30896)
> * [30907 - Website URL Validation Issue](/docs/api/errors/30907)
> * [30908 - Compliant Privacy Policy Required](/docs/api/errors/30908)
> * [30917 - All opt-in methods must include complete workflow descriptions](/docs/api/errors/30917)
> * [30919 - Website lacks sufficient business or messaging use case info](/docs/api/errors/30919)
> * [30921 - Website requires authentication and cannot be reviewed](/docs/api/errors/30921)
> * [30924 - Missing or non-compliant consent agreement language in opt-in flow](/docs/api/errors/30924)
> * [30925 - Opt-in must be unchecked by default; active consent required](/docs/api/errors/30925)
> * [30933 - Privacy Policy URL is required](/docs/api/errors/30933)
> * [30934 - Terms and Conditions URL is required](/docs/api/errors/30934)
>
> See [Why Was My A2P 10DLC Campaign Registration Rejected?](https://help.twilio.com/articles/15778026827291-A2P-10DLC-Campaign-Registration-Rejected) for the full list of rejection codes.

### Possible causes

* The `message_flow` does not clearly describe how users opt in, or does not describe every opt-in method the campaign uses.
* A keyword flow omits the keyword, destination number, or where users encounter the opt-in instructions.
* A paper, verbal, QR-code, in-store, or non-public opt-in flow lacks publicly accessible supporting evidence.
* A verbal opt-in is described with a one-line summary instead of the full script.

### Possible solutions

1. Open the rejected campaign and update its message flow:

   * 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). Select the campaign, select **Edit & resubmit**, and then select **Start**. Update the **Message Flow: How do end-users consent to receive messages?** field.
   * In the Legacy Console, go to **Messaging > Regulatory Compliance > Campaigns** and select the failed campaign. Select **Fix Campaign**, then update **How do end-users consent to receive messages? (40-2048 characters)** in the **Edit A2P Campaign Details** dialog.
   * If you use the API, update the corresponding `message_flow` field.

   Provide a complete, end-to-end description of each opt-in path in 40 to 2048 characters.
2. Make sure the consent language users see at opt-in names your brand and states what messages they'll receive, and describe it in `message_flow`. A missing brand name returns [30568](/docs/api/errors/30568). A missing message purpose returns [30544](/docs/api/errors/30544).
3. For keyword opt-in, include the exact keyword, destination number, and where the instructions appear. Populate [`opt_in_keywords`](/docs/messaging/compliance/a2p-10dlc/collect-business-info#opt_in_keywords) and [`opt_in_message`](/docs/messaging/compliance/a2p-10dlc/collect-business-info#opt_in_message), which are required when users can subscribe by texting a keyword.
4. For website opt-in, provide the page URL and ensure that the consent experience:
   * Clearly requests permission to send SMS messages.
   * If it uses a checkbox or similar consent control, the control is optional and unchecked by default.
   * Includes message frequency, a "message and data rates may apply" disclosure, opt-out instructions such as "Reply STOP to unsubscribe," and customer-support instructions such as "Reply HELP for help."
5. For paper, verbal, in-store, or other offline opt-in, describe the complete process and provide a publicly accessible URL with supporting evidence, such as hosted screenshots, a photo of the form, or the verbal script. For verbal opt-in, provide the full script that staff read to users, not a one-line summary.
6. Provide publicly accessible Privacy Policy and Terms and Conditions URLs. In the Legacy Console and the Twilio Console at `1console.twilio.com`, include them in the opt-in description. If you use the API, set the [`privacy_policy_url` and `terms_and_conditions_url`](/docs/messaging/api/usapptoperson-resource#usa2p-properties) fields. A missing Privacy Policy URL returns [30933](/docs/api/errors/30933), and a missing Terms and Conditions URL returns [30934](/docs/api/errors/30934). The Privacy Policy must state that mobile numbers aren't shared with third parties and include the messaging disclosures. The Terms and Conditions page must be publicly accessible and hosted on the business website. See [Acceptable vs. unacceptable privacy policy and T\&C URLs](/docs/messaging/compliance/a2p-10dlc/collect-business-info#acceptable-vs-unacceptable-privacy-policy-and-tc-urls).
7. Correct every rejection reason, then review and resubmit the campaign:
   * In the Twilio Console at `1console.twilio.com`, select **I confirm the information entered here is ready to submit for review**, select **Run error check (1-2 min)**, and follow the prompts to resubmit.
   * In the Legacy Console, review and select the agreement below the campaign fields, then select **Update**.

> \[!NOTE]
>
> These changes make the consent flow easier to verify, but they do not guarantee approval. Review the rejection details for any additional or more specific error codes.

### Examples

#### Website opt-in

```text
Customers visit www.acmecoffee.example/sms, enter their phone number, and select an optional checkbox that is unchecked by default to agree to recurring promotional messages from Acme Coffee.
Message frequency varies. Message and data rates may apply. Reply STOP to unsubscribe. Reply HELP for help.
Terms: www.acmecoffee.example/terms. Privacy Policy: www.acmecoffee.example/privacy.
```

#### Multiple opt-in paths

```text
Customers opt in by either (1) visiting www.acmecoffee.example/sms and selecting the optional, unchecked SMS consent box, or (2) following instructions on Acme Coffee receipts to text JOIN to (555) 123-4567.
The keyword flow sends a confirmation of enrollment in recurring Acme Coffee promotional messages.
Message frequency varies. Message and data rates may apply. Reply STOP to unsubscribe. Reply HELP for help.
Terms: www.acmecoffee.example/terms. Privacy Policy: www.acmecoffee.example/privacy.
```

Adapt the description to your actual consent process. Do not describe an opt-in path that users do not encounter.

### Resubmit the campaign

Follow the Console-specific steps in [Possible solutions](#possible-solutions) to edit and resubmit the existing campaign. Resubmitting retains the campaign and avoids a second vetting fee, but it starts a new review that takes up to 5 business days for standard use cases. You can also [fetch the UsAppToPerson resource](/docs/messaging/api/usapptoperson-resource) and check `campaign_status`.

API-based campaign updates are available only to accounts with 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.

For detailed instructions, see [Troubleshooting and rectifying A2P Campaigns](/docs/messaging/compliance/a2p-10dlc/troubleshooting-a2p-brands/troubleshooting-and-rectifying-a2p-campaigns-1).

### Additional resources

* [A2P 10DLC - Gather the Required Business Information](/docs/messaging/compliance/a2p-10dlc/collect-business-info)
* [A2P 10DLC Campaign Approval Requirements](https://help.twilio.com/articles/11847054539547-A2P-10DLC-Campaign-Approval-Best-Practices)
* [Why Was My A2P 10DLC Campaign Registration Rejected?](https://help.twilio.com/articles/15778026827291-A2P-10DLC-Campaign-Registration-Rejected)
* [A2P 10DLC Campaign Vetting and Messaging Compliance (video)](https://www.youtube.com/watch?v=IUXJbMD7Qz4)
