---
"@context": https://schema.org
"@type": TechArticle
"@id": https://www.twilio.com/docs/api/errors/30917#article
headline: "30917: Campaign rejected: All opt-in methods must include complete workflow descriptions"
url: https://www.twilio.com/docs/api/errors/30917
inLanguage: en
dateModified: 2026-10-27T20:46:31.000Z
author:
  "@type": Organization
  name: Twilio Developer Education Team
publisher:
  "@type": Organization
  name: Twilio
---

# 30917: Campaign rejected: All opt-in methods must include complete workflow descriptions

Log Type: APPLICATION

Log Level: ERROR

## Description

Your A2P 10DLC campaign registration was rejected because one or more selected opt-in methods were not fully described. If you use more than one consent path, such as a website, keyword, paper form, QR code, or verbal consent, include a complete workflow for each method so the opt-in can be reviewed and verified.

### Possible causes

* You selected multiple opt-in methods but described only some of them.
* One or more opt-in descriptions do not explain where the opt-in happens, what the consumer sees, and what action the consumer takes to provide consent.
* The opt-in description is too generic and does not include enough detail to verify the consent flow.
* The opt-in evidence cannot be reviewed because it is behind a login or was not provided as a publicly accessible screenshot, image, or video.
* You indicated SMS keyword opt-in but did not include the related keyword flow or opt-in confirmation details.

### Possible solutions

* For each opt-in method you selected, describe the full end-user journey from the first prompt through the consent action.
* Explain where the opt-in occurs, what disclosure language the consumer sees, and what specific action confirms consent.
* If opt-in happens on a website, provide the public URL and make sure the site includes a privacy policy and terms of service.
* If opt-in happens on a paper form or behind a login, provide a public link to hosted screenshots, images, or a video that shows the consent flow.
* If opt-in happens by SMS keyword, include the opt-in keyword and the opt-in confirmation message. If you do not use SMS opt-in, leave those fields blank instead of providing partial information.
* Remove any opt-in methods you do not actually use, then resubmit the campaign after you update the registration.

### 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).
* `message_flow` includes a link to your privacy policy and a link to your terms and conditions.
* 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.
* Every opt-in method you selected has its own workflow paragraph in `message_flow` explaining where, what, and how consent is collected.
* No opt-in method is selected without a corresponding description. If you do not use a method, deselect it rather than leaving its description empty.

### Fix by cause

#### Incomplete workflow for one of multiple opt-in paths

> \[!WARNING]
>
> The following `message_flow` would be rejected:
>
> `End users opt in on our website or by texting us.`
>
> Two methods are claimed (website and keyword), but neither is described with enough detail to verify.

> \[!NOTE]
>
> The following `message_flow` would pass review:
>
> `End users opt in by (1) visiting www.acme.com/sms-signup and entering their phone number, checking a box agreeing to receive recurring promotional messages from Acme Co, or (2) texting JOIN to (555) 123-4567 and receiving an auto-reply confirming enrollment. Message frequency varies. Msg & data rates may apply. Terms: www.acme.com/terms. Privacy: www.acme.com/privacy.`
>
> Passes because each opt-in path has its own workflow describing where consent happens, what the consumer sees, and what action confirms consent. Both paths include the required disclosures.

#### Gated or non-public opt-in flow with no evidence

> \[!WARNING]
>
> The following `message_flow` would be rejected:
>
> `Customers opt in through our mobile app after logging in.`
>
> Reviewers cannot access a login-gated flow. No public evidence is provided.

> \[!NOTE]
>
> The following `message_flow` would pass review:
>
> `End users opt in through the Acme Co mobile app after signing in. The consent screen asks users to check a box labeled "I agree to receive recurring SMS updates from Acme Co." Message frequency varies. Msg & data rates may apply. Reply STOP to cancel. Screenshots of the full consent screen are hosted at www.acme.com/sms-consent-evidence. Privacy: www.acme.com/privacy. Terms: www.acme.com/terms.`
>
> Passes because it provides a publicly accessible URL where reviewers can verify the consent flow even though the app itself requires authentication.

#### 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**: Monitor your campaign status in **Console > Messaging > Regulatory Compliance > Campaigns**, or [fetch the UsAppToPerson resource](/docs/messaging/api/usapptoperson-resource) and check the `campaign_status` field.

To resubmit in Console, go to **Messaging > Regulatory Compliance > Campaigns**, click the failed campaign, then click **Edit Campaign** to correct the fields and resubmit. To resubmit via API, update the campaign resource with corrected field values. See [Troubleshooting and rectifying A2P Campaigns](/docs/messaging/compliance/a2p-10dlc/troubleshooting-a2p-brands/troubleshooting-and-rectifying-a2p-campaigns) 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)
