TLDR: Twilio's console has at least three places where the UI says "success," nothing actually happened, and there's no error. Verify state. Don't trust absence of noise.

the setup

I was building a birth-announcement Vercel app that lets parents text everyone in their circle the moment a baby arrives.

US carriers require A2P 10DLC registration (the compliance layer that gates business SMS delivery) before they'll deliver a single message. So I had to grind through the Twilio console: register a brand, file a campaign, buy a number, wire everything to a Messaging Service.

I was driving it all with Arc CDP (Chrome DevTools Protocol — browser automation through a live Arc window). Full automation of a multi-step wizard.

Fast. Clean.

Except when it wasn't.

what broke

The first one hit me on the phone number buy step.

The buy modal shows a number, a price, and a handful of checkboxes. One of them — "I agree to comply with the Emergency calling terms" — is required. I missed it.

I clicked Buy.

The modal closed.

No error. No toast. No confirmation. The number was never purchased. It just… looked like it worked.

That's the worst kind of failure. A crash gives you something to fix. A silent no-op gives you confidence in a lie.

The second trap was React-specific. When I automated the campaign edit modal via CDP, I set field .value programmatically and dispatched input and change events. The Update button stayed disabled. Wouldn't move.

Turns out Twilio's forms use React controlled inputs, which track values separately in an internal _valueTracker. Setting .value without resetting that tracker leaves React's state stale. The fix:

el._valueTracker.setValue('reset_' + Math.random())
el.dispatchEvent(new Event('input', { bubbles: true }))
el.dispatchEvent(new Event('change', { bubbles: true }))

Then the Update button activates.

Third one: the edit modal doesn't prefill the Privacy Policy and Terms of Service URLs — even though the detail view clearly shows them set. If you hit Update without re-entering them, Twilio silently blanks both fields. Your campaign record now has no privacy URL. Carrier approval stalls. No explanation offered.

why this matters

I have a standing rule: HTTP 200 ≠ success. Twilio's console ran me through the same lesson at the browser level.

UI interaction ≠ state change.

Every time you automate a form — or honestly, any time you click a button inside a platform you don't own — read state back. Check the number actually exists. Check the URL is still set. Check the modal actually did something, not just closed.

The signal to trust isn't absence of error.

It's presence of proof.

P.S. The 10DLC campaign got rejected on 2026-06-18 — no privacy policy on the app. I built /privacy and /terms, resubmitted, it cleared. The carriers don't infer. Your automation shouldn't either.