Easy A2P

The A2P 10DLC rejection code index for GoHighLevel (2026)

Every GoHighLevel A2P rejection surfaces as a Twilio error code, and this index maps all of them: the broad 308xx codes, the 30910 to 30937 policy and consent codes (including 30923, consent required for service use), the March 2026 granular 30940 to 30964 range, each code's verbatim Twilio label, the exact Trust Center field it points to, and whether you can resubmit or the campaign is terminal. Dated and kept current.

By Gary Vogt · · 11 min read

In GoHighLevel, every A2P 10DLC rejection comes back as a numeric Twilio error code, and the code tells you both what tripped and whether you can fix it. This index lists all of them: the code, its verbatim Twilio label, the exact Trust Center field it points to, and whether resubmitting will work.

Last verified: 2026-07-22 against Twilio’s full error dictionary. That sweep pulled every documented code in the 30880 to 30972 range (85 of them) and each code’s own page, which is how the 30910 to 30937 policy codes below joined this index. This page is a living reference. When Twilio adds or relabels a code, the row and the date change with it.

How to read a GHL rejection

GoHighLevel runs A2P registration on Twilio underneath, so a rejection in Trust Center arrives as a Twilio error code in the 308xx or 309xx range. Each code maps to one of three outcomes:

  • Fixable. Correct the named field and resubmit. Resubmitting a rejected campaign is free, per GHL’s Help Center; the cost is the wait (1 to 3 days for Sole Prop, 3 to 15 days for Standard).
  • Formatting near-fix. The rejected campaign cannot be resubmitted, but the cause is a URL choice, not a prohibited activity. Fix the URL and register a clean new campaign.
  • Terminal. The business activity itself is ineligible for 10DLC. No rewrite clears it; the realistic path is toll-free messaging.

And a handful of codes are none of the three: they are pipeline statuses, not rejections at all. Those get their own table below.

The full explanation of each cause, with example copy and the field-by-field fix, lives in the narrative pillar, Every TCR rejection reason in GoHighLevel, explained. This page is the lookup layer: find your code, get the field and the verdict, then jump to the pillar for the walk-through.

One structural fact worth knowing before you start: the review stops at the first problem it finds and reports only that one. Your submission may have more issues waiting behind the cited code. Fix the whole thing, not just the line in the email.

Fixable codes (correct the field, resubmit free)

These are the procedural rejections. The field named is the GHL Trust Center field where the fix goes.

CodeTwilio labelGHL Trust Center fieldResubmit?
30880Unknown ErrorNo single field named; check for companion codesYes, after fixing whatever the companion codes name
30881Invalid Brand Support EmailBrand Registration (support email)Yes, with a real business-domain email, never the agency’s
30882Terms & ConditionsTerms of Service page + URLYes, after publishing a public Terms page with the SMS clauses
30886Invalid Campaign DescriptionCampaign Description (Use Case Description)Yes, after rewriting the description
30887Opt-out ErrorSample Messages (STOP language)Yes, after adding opt-out wording
30888Age Gate Not Present / Not AcceptableOpt-In Flow (age verification)Yes, after adding a real age gate
30889Embedded Phone NumberSample Messages vs the embedded phone number settingYes, after matching the setting to the samples (numbers in samples if enabled, setting off if not)
30890Subscriber Help info inadequateSample Messages (HELP reply)Yes, after improving the HELP message
30892Invalid Sample Message - Public URL ShortenersSample Messages (links)Yes, after swapping to a branded HTTPS domain
30893Inconsistency between Sample Message and Use-caseSample Messages vs use caseYes, after aligning samples with the declared use case
30894Invalid Brand InformationBrand Registration vs Campaign DescriptionYes, after registering under the client’s brand, not the agency’s
30895Direct Lending - Campaign and Content Attribute ErrorCampaign attributes (Direct Lending)Yes, after declaring the direct-lending option or removing lending language
30896Opt-in ErrorOpt-In Flow DescriptionYes, after spelling out exactly how consent is collected
30898Excessive EINBrand RegistrationYes, after consolidating brands or justifying the reuse
30899Campaign registration failed due to carrier rejection(s)Whichever field the attached carrier codes nameYes, after fixing the specific carrier findings
30902A DCA2 rejected this campaign registration requestNo single field named; review the whole submissionYes, after a full pass over description, samples, and opt-in
30906Campaign Rejected by TwilioNo single field named; review the whole submissionYes, after a full pass over description, samples, and opt-in
30903Incorrect Sole Prop Brand RegistrationBrand Registration (tier)Yes, after re-registering at the correct tier
30908Compliant Privacy Policy RequiredPrivacy PolicyYes, after adding or making verifiable the non-sharing clause
30909Message Flow or Call to Action incomplete/unverifiedOpt-In Flow Description + consentYes, after fixing the opt-in form and consent disclosure
30932Privacy policy must disclose third-party data sharingPrivacy PolicyYes, after adding the non-sharing clause

These arrived alongside the granular content range and cover submission policy, consent structure, and identity matching. Unlike the 30940s, nearly every one is fixable: correct the named field (or re-scope the use case) and resubmit. Labels are verbatim from Twilio’s dictionary.

CodeTwilio labelGHL Trust Center fieldResubmit?
30900The campaign use case is ineligible for registrationCampaign Use CaseYes, after re-scoping to an eligible use case
30910A2P 10DLC campaigns must be submitted in EnglishWhole submissionYes, in English (you can still send in other languages)
30911Duplicate template text; each field must be uniqueSample MessagesYes, after making each field distinct
30912A2P 10DLC is for application-to-person messaging onlyCampaign Use CaseYes, after describing an actual A2P program
30913Marketing and informational consent must be separateOpt-In CheckboxesYes, after splitting into two separate checkboxes
30914Sole proprietor campaign title does not match sole proprietor nameBrand Registration (Sole Prop)Yes, after matching the title to the registered individual
30915Sole proprietor must use individual’s name, not business nameBrand Registration (Sole Prop)Yes, under the person’s legal name
30916Use case mismatch between lead generation and lead nurtureCampaign Use CaseYes, after aligning the use case with the actual program
30917All opt-in methods must include complete workflow descriptionsOpt-In Flow DescriptionYes, after describing every method end to end
30918DBA name does not match the legal business name on fileBrand RegistrationYes, after reconciling DBA and legal name
30923Message consent cannot be required for service useOpt-In Flow / CheckboxesYes, after unbundling consent from signup (details below)
30924Missing or non-compliant consent agreement language in opt-in flowOpt-In Flow / CheckboxesYes, after adding the full consent disclosure
30925Opt-in must be unchecked by default; active consent requiredOpt-In Checkboxes (live form)Yes, after fixing the live form
30926Multiple companies cannot share a single campaignCampaign / Brand structureYes, one brand and one campaign per client
30927Opt-in evidence is for a different companyOpt-In Flow (brand match)Yes, with proof that names this brand
30928Social influencer/public figure use case not permittedCampaign Use CaseYes, after re-scoping away from influencer promotion
30929Emergency alert notifications are not a permitted use caseCampaign Use CaseYes, under the EMERGENCY special use case (extra carrier review) or re-scoped
30930Brand campaign limit of 100 reachedBrand RegistrationNo; consolidate campaigns or register another brand
30931Opt-in process must allow consumers to declineOpt-In FlowYes, after giving users a real way to say no
30933Privacy Policy URL is required for A2P 10DLC campaign registrationPrivacy Policy URLYes, after publishing and linking the policy
30934Terms and Conditions URL is required for A2P 10DLC campaign registrationTerms of Service URLYes, after publishing and linking the terms
30936HELP keyword response must meet requirementsHELP responseYes, with brand name, support contact, and instructions
30937Phone number limit exceeded for registrationCampaign phone numbersYes, after reducing the numbers on the campaign

30933 and 30934 are the codes behind the Privacy Policy URL and Terms & Conditions URL fields that became required in GHL’s Campaign Details, the change we covered when it landed. 30913 is the two-separate-checkboxes rule wearing its own number.

Website verification codes

The reviewer visits your website. If it cannot be verified, these fire. They are website fixes, not copy fixes.

CodeTwilio labelWhat trippedResubmit?
30891Invalid Website URLSite down, unreachable, or opt-in not findableYes, once the site is live and shows the opt-in
30907Website URL Validation IssueURL could not be verifiedYes, once the URL loads publicly
30919Website lacks sufficient business or messaging use case infoReviewer could not tell what the business doesYes, after adding real business and messaging context
30920Website is only a form; insufficient business contextLanding-page-only siteYes, after adding business content beyond the form
30921Website requires authentication and cannot be reviewedLogin wallYes, after making a public page available (or hosting an opt-in screenshot at a public URL)
30922Website does not meet campaign verification requirementsGeneral website failureYes, after addressing the above

Statuses, not rejections

Four codes in this range are pipeline states. Nothing in your copy caused them and no copy change clears them.

CodeTwilio labelWhat it meansWhat to do
30901The campaign registration request timed outProcessing timeout, though reviews often stall on thin or inconsistent submissionsTighten anything incomplete, then resubmit
30904Campaign Not Shared with TwilioThe campaign never reached the reviewing platformContact GHL support to re-share it
30905Campaign Review Pending by TwilioStill in reviewWait it out
30935Verification - Requested CancellationA cancellation you asked for was processedNothing, unless you want to re-register

Terminal content codes (broad)

These predate the granular range and are still active. A content rejection may surface as one of these or as a specific 30940 to 30964 code below.

CodeTwilio labelGHL Trust Center fieldResubmit?
30883Content Violation (SHAFT, cannabis/CBD, prohibited categories)Campaign content and declared business activityNo, terminal
30884Spam/Phishing (known spam or phishing pattern)Campaign Description + Sample MessagesNo in current form; rework materially or appeal
30885High Risk (potentially fraudulent activity)Campaign contentNo in current form; appeal or a substantially different approach
30897Disallowed ContentCampaign content and declared business activityNo, terminal

The March 23, 2026 granular codes (30940–30964)

On March 23, 2026, GoHighLevel and The Campaign Registry rolled out per-reason content codes in the 30940 to 30964 range. Per GHL’s Understanding A2P campaign rejection reasons and required fixes article, the granular codes “provide more precise rejection reasons compared to previous general codes.”

Two things to hold onto. They are additive, not a rename: the broad codes above are still live, so treat this as a crosswalk. And almost every one is terminal, because the code keys off your declared business activity and website, not the wording of a single message. A wellness brand that gets 30940, deletes “CBD” from its samples, and resubmits gets 30940 again. Each label below is quoted verbatim from its own page in Twilio’s error dictionary.

Prohibited business activity or content (30940–30952):

CodeTwilio labelResubmit?
30940Cannabis, CBD, or illegal substance content detectedNo
30941Prescription drug or controlled substance content detectedNo
30942Loan marketing content detectedNo
30943Third-party debt collection content detectedNo
30944Gambling or betting content detectedNo
30945Sweepstakes or contest content detectedNo
30946Stock alert content detectedNo
30947Cryptocurrency content detectedNo
30948High-risk investment content detectedNo
30949Debt reduction or consolidation content detectedNo
30950Credit repair content detectedNo
30951Third-party lead generation or MLM content detectedNo
30952Non-federally compliant use case detectedNo

SHAFT content (30953–30958):

CodeTwilio labelResubmit?
30953Sex or adult content violation detectedNo
30954Hate speech or violent content detectedNo
30955Alcohol promotion content detectedNo
30956Alcohol content without required age verification detectedNo
30957Firearms or explosives content detectedNo
30958Tobacco or vape content detectedNo

High-risk or deceptive (30959–30964):

CodeTwilio labelResubmit?
30959Fraudulent or misleading content detectedNo
30960Known phishing campaign detectedNo
30961High-risk domain reputation detectedNo
30962Deceptive marketing practices detectedNo
30963Public URL shortener detected in campaignNo
30964Non-secured URL (http) detectedNo

The last two are the only easy escapes. Twilio still marks the rejected campaign not eligible for resubmission, but the cause is a formatting choice. 30963 fires on public link shorteners like bit.ly or tinyurl, so swap to a branded or dedicated domain. 30964 fires on non-secure http links, so switch to https. Correct the URL, register a clean new campaign, and you are through.

Per-code fixes for the ones you can actually fix

The terminal codes have no fix on this platform. These do. Each links to the full walk-through in the pillar.

30909, message flow or CTA incomplete

The most common opt-in and consent rejection. It fires when consent collection is not documented at the opt-in URL you submitted, or a required CTA disclosure element is missing. Fix the opt-in form itself: two separate unchecked consent checkboxes, the mandatory disclosures, and links to your Privacy Policy and Terms of Service on the form. See the opt-in and consent pillar for the full CTA disclosure list.

30932 and 30908, the Privacy Policy non-sharing clause

30932 fires when your Privacy Policy says opt-in data is shared with third parties for marketing, or omits the non-sharing statement. 30908 (“Compliant Privacy Policy Required”) is the same requirement when the policy is missing, cannot be verified, or leaves the clause out. The fix for both is the TCR non-sharing clause: state that mobile information will not be shared with third parties or affiliates for marketing or promotional purposes, and that sharing with support subcontractors such as customer service is permitted. The exact paragraph and where it goes are in the Privacy Policy and Terms of Service templates guide.

30903, incorrect Sole Prop registration

Your registration tier does not match your entity. You filed Sole Prop but the business has an EIN (should be Standard), or you filed Standard but the EIN cannot be verified. Re-register at the tier that matches reality. If you have no EIN, register Sole Prop and drop any LLC, Inc, or Corp suffix from the name. The Sole Proprietor guide covers the full walkthrough.

30886, invalid campaign description

The Use Case Description is generic or echoes the dropdown label. Name the actual message types the business sends. “Appointment reminders for property tours, listing alerts, and open-house follow-ups” passes where “various updates” does not.

30890, subscriber HELP inadequate

Your HELP reply lacks the brand name, a support contact, or clear assistance instructions. Add all three to the HELP auto-response and resubmit. The related 30936 fires on the same requirement when the HELP keyword response itself falls short.

The most misunderstood code in the range, because it regularly hits businesses doing something completely normal: requiring phone verification at signup. The error text names the trigger directly: consent to receive messages cannot be a required condition for “using your service, creating an account, or completing a transaction.”

Here is the part that trips people. Reviewers never see your app. They read your opt-in description and message_flow, and if those say “user agrees to receive SMS to sign up,” it reads as a gate whether the payload is a marketing blast or a one-time passcode. The fix is wording plus structure:

  • For marketing and notification streams, make consent optional and separate from signup, and say so: “Consent is not a condition of purchase.”
  • For user-requested verification codes (2FA, login, account recovery), drop the consent checkbox entirely. The user entering their number and tapping the button is the consent. A checkbox that gates a required code is required by definition, which manufactures the exact violation you are trying to clear.
  • Describe the flow as a literal action with the URL: “User enters their number at [url] and taps Send verification code. One code is sent in direct response. No recurring or promotional messages.”
  • Register strictly as 2FA if that is what the campaign is. Broader use cases invite the bundled-consent read.

Requiring phone verification to create an account is fine. Every bank does it. What cannot be required is standing consent to a message stream.

Four codes, one theme: consent has to be a real, separate, active choice. 30913 fires when marketing and informational consent share a checkbox, so split them — it is common enough that we gave it its own write-up. 30924 fires when the consent disclosure is missing or does not cover what you send, so put the full disclosure at the point of opt-in. 30925 fires when the live form’s box is pre-checked, and reviewers check the actual form at your URL, not just your pasted copy. 30931 fires when there is no way to decline at all. If you fix one, check the other three while you are in there, because the review stops at the first problem it finds.

Brand rejections that arrive without a granular code

Not every rejection carries a 309xx number. Brand-side vetting failures (a legal name that does not match IRS records, a PO Box address, a DUNS number entered where an EIN belongs, a non-US entity) often come back as a plain “vetting failed” or “unverified” state. When brand problems do carry codes, they are 30881 (support email), 30894 (brand information mismatch), 30898 (excessive EIN), 30903 (Sole Prop tier), 30914 and 30915 (Sole Prop naming), 30918 (DBA mismatch), and the two contact codes 30971 (business email must use the official domain) and 30972 (contact must be an authorized business representative). The other brand causes, and their fixes, are numbered 1 through 10 in the rejection pillar.

If you want this in a form you can keep beside you

This page is organised by code, which is what you want when you have a number in front of you. If you would rather work from the wording of the email itself, the TCR Rejection Decoder is a free PDF that starts from the rejection message and walks to the field that caused it. For the underlying causes in full prose — all of them, with the fix for each — see every TCR rejection reason explained.

Where Easy A2P fits

Easy A2P reads your Trust Center copy before you submit and reports back what tripped a rule and how to fix it, across all ten Trust Center sections (Brand Registration, Campaign Description, both Sample Messages, Opt-In Flow Description, Opt-In Confirmation Message, both consent checkboxes, and the Privacy Policy and Terms of Service SMS sections). A Review (1 credit) gives you findings plus specific remediation guidance. When you want the rewritten copy handed to you paste-ready, Draft mode (2 credits) or Fix My Copy (1 credit) does that. We do not approve anything; the carriers and their review chain do that. We help you ship it clean the first time. Review your submission with 3 free credits.

Frequently Asked Questions

Why was my A2P 10DLC campaign rejected in GoHighLevel? +
GHL runs registration on Twilio, so the rejection arrives as a Twilio error code. Find your code in the tables above: the fixable 308xx codes and the 30900 to 30937 policy and consent codes mean you correct the named Trust Center field and resubmit for free, while the 30940 to 30964 content codes usually mean the business activity is ineligible for 10DLC.
What does TCR error 30932 mean? +
Your Privacy Policy either says opt-in data is shared with third parties for marketing, or it omits the non-sharing statement. Add the non-sharing clause (mobile information will not be shared with third parties or affiliates for marketing) and resubmit. The related code 30908 covers the same requirement when the policy is missing or unverifiable.
Are the granular codes 30940 to 30964 eligible for resubmission? +
On their own Twilio pages, every code in this range states the rejected campaign is not eligible for resubmission. For the content and activity codes the underlying activity is prohibited, so no rewrite helps. The two near-exceptions are 30963 (public URL shortener) and 30964 (http link): fix the URL and register a clean new campaign.
Can I resubmit a rejected A2P campaign for free? +
Yes for the fixable codes. Per GHL's Help Center, resubmitting a rejected campaign carries no additional Campaign Vetting Fee. The real cost is the wait: 1 to 3 days for Sole Prop, 3 to 15 days for Standard, which multiplies if you fix one issue at a time.
Which A2P rejection codes are terminal? +
30883 (content violation), 30897 (disallowed content), and the content and activity codes in the 30940 to 30962 range. These reject the business activity itself, so no copy edit clears them; the realistic path is toll-free messaging.
What does Twilio error 30923 mean? +
Your opt-in flow makes consent to receive messages a condition of creating an account, using the service, or completing a purchase. Make messaging consent optional and separate from signup. For user-requested verification codes (2FA/OTP), drop the checkbox entirely: the user requesting the code is the consent, and a checkbox that gates a required code creates this exact violation.

Get notified when we publish new guides

Pillar guides on TCR rejection codes, GHL Trust Center walkthroughs, and industry-specific A2P 10DLC registration — delivered when they go live. No spam, unsubscribe anytime.

Stop guessing whether your A2P submission will pass.

Easy A2P reviews your full submission against current TCR and GHL standards before you submit. Catch the rejection causes others miss — including the Sole Proprietor traps in this guide.

Try Easy A2P with 3 free credits →

No credit card · ~90 seconds to review · pay-as-you-go after