Skip to content

docs(10dlc): document Brand Identity Verification as a distinct gate - #543

Open
briankwest wants to merge 4 commits into
mainfrom
august-20260806-brand-identity-verification
Open

docs(10dlc): document Brand Identity Verification as a distinct gate#543
briankwest wants to merge 4 commits into
mainfrom
august-20260806-brand-identity-verification

Conversation

@briankwest

Copy link
Copy Markdown
Collaborator

Problem

Brand Identity Verification was effectively undocumented. The only mention anywhere was one clause on the CSP page — "The information entered will be submitted for Brand Identity Verification" — with no statuses, no failure modes, and no recovery path.

The consequence is a predictable support pattern. A customer with a freshly issued EIN registers a Brand, every field correct, and it comes back unverified because the EIN hasn't propagated into the third-party datasets TCR checks. They search the docs, find nothing about brand identity, and land on "DCA Election: The Final Step" — which reads as though the DCA is the last remaining gate. It isn't. They're blocked upstream of DCA election entirely: campaigns cannot be created for an unverified Brand, and that sentence appeared nowhere in the docs.

The two gates are genuinely different:

Brand Identity Verification DCA election
Who TCR + third-party identity data Direct Connect Aggregator
Validates EIN, Brand Legal Name, EIN Issuing Country Website, use case, content, CTIA compliance
When Before a Campaign can exist After the Campaign is loaded into a Space
CP 575 relevant Yes, as appeal documentation No — the DCA never sees it

This is also a retrieval problem for the docs assistant: "vetting", "manual", and "business days" all lexically live in the DCA section, and there was no competing chunk about brand identity for the retriever to prefer. Adding the section fixes the agent as a side effect of fixing the docs.

Changes

Two new shared snippets under fern/snippets/common/messaging/:

  • _brand-identity-verification.mdx — what TCR validates, the statuses, a warning that campaigns are blocked until completed, the brand_activated / brand_unverified status callbacks, why a correct Brand still comes back unverified (recently issued EIN, non-US entity, 501(c) tax exempt status), and the three remedies: correct and resubmit, identity status appeal with supporting documentation, or external vetting.
  • _identity-verification-vs-dca.mdx — the two gates stated side by side, with the CP 575 point made explicitly.

Included on both csps/index.mdx and registration/index.mdx, each with a short page-specific paragraph on who actually files the appeal — the CSP does it themselves from the TCR portal; for Managed Brands, SignalWire files it via a Support Ticket.

Status vocabulary

The three TCR pages used three different sets of names for one field. Worth flagging what the normalization is based on: the enum SignalWire actually exposes — specs/signalwire-rest/relay-rest/campaign-registry/models/core.tsp:34 and the 10DLC status callback transition table — is pending / unverified / completed. There is no verified and no vetted_verified.

So the registration page's Brands section (Pending/Completed) was the correct vocabulary and Creating a new brand (Verified/Unverified) was the wrong one. The snippet resolves this with a mapping table from TCR's Identity Status to SignalWire's state rather than adopting TCR's raw enum, since the two pages have different audiences — a CSP reads TCR's portal, a managed customer reads the SignalWire Dashboard. VETTED_VERIFIED is omitted throughout; external vetting is documented as a remedy, not as a displayed status.

The Brands tab list also gains the unverified state it was missing entirely.

Other fixes

  • CSP fees section: brand submission and vetting fees were absent, so the docs implicitly encouraged looping on resubmission. Now points to the appeal path when details are already correct.
  • "DCA Election: The Final Step" gets a line clarifying it's the final step of connecting a Campaign, not of registration overall.
  • the-campaign-registry/index.mdx links to the new section instead of implying resubmission is the only recourse.

Verification

  • fern docs md check — all 2816 MDX files valid.
  • Snippets-with-headings is an established pattern in this repo (fern/snippets/server-sdks/reference-overview.mdx), so the #brand-identity-verification and #resolving-an-unverified-brand anchors resolve on both including pages.
  • fern check passes apart from the auth-gated redirects check, which is skipped locally.

Worth a reviewer's eye

The following came from the reported customer case rather than from anything in this repo, and should be confirmed by someone with TCR portal access before merge: that appeals and external vetting are both initiated from the Brand Details page; that a standard vet can unlock additional MNO classes and tiers; and the "allow several business days" turnaround. The status enum, fee amounts, and campaign-blocked-until-verified behavior are all grounded in the specs and existing pages.

🤖 Generated with Claude Code

Brand identity verification was never documented. The only mention was one
clause on the CSP page ("will be submitted for Brand Identity Verification"),
with no statuses, no failure modes, and no recovery path. Readers with an
unverified Brand landed on "DCA Election: The Final Step" and concluded the DCA
was the gate they were waiting on — it isn't. Identity verification runs at TCR
against third-party identity data before a Campaign can exist; DCA election
reviews campaign content after the Campaign is loaded into a Space. Different
parties, different remedies, and a CP 575 is only ever relevant to the former.

Adds two shared snippets:

- _brand-identity-verification.mdx — what TCR validates, the statuses, why a
  correct Brand still comes back unverified (recently issued EIN, non-US entity,
  501(c) tax exempt status), and the three remedies: resubmit, identity status
  appeal with supporting documentation, or external vetting.
- _identity-verification-vs-dca.mdx — the two gates, stated side by side.

Also normalizes the Brand status vocabulary. The three pages used three
different sets of names; the enum SignalWire actually exposes via the API and
status callbacks is pending / unverified / completed, with no `verified` and no
`vetted_verified`. The registration page's "Verified or Unverified" wording is
replaced with a mapping from TCR's Identity Status to that state, and the
Brands tab list gains the unverified state it was missing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

hey-august and others added 3 commits August 7, 2026 17:31
…figures

Follow-up to the Brand Identity Verification docs, correcting three
classes
of claims against primary sources.

Scope brand states and callbacks to the managed flow (verified in
prime-rails): partner (CSP-registered) Brands can never become
`unverified` —
the internal completion op selects the CompletePartner contract for
them,
which only ever sets `completed` and fires `brand_activated`. Nothing in
the
platform consumes TCR's identityStatus enum; a specialist relays the
verdict,
so the shared snippet no longer promises a mechanical
TCR-status-to-state
mapping or same-moment availability. The state mapping and
status_callback_url
events move to the registration page, the only flow where
brand_unverified can
fire. This also resolves the CSP page contradicting itself ("SignalWire
is not
involved in this step" directly after a SignalWire-webhooks paragraph).

Drop fee figures whose only source was earlier revisions of these pages:
the
$4 brand fee, $7.50 DCA vetting fee, and $1.50 low-volume-mixed monthly
fee.
Amounts live in the wallet rate deck and TCR's fee schedule, and current
external sources contradict the $7.50 (DCAs bill $15 per vetting event
today).
Pages now state that a fee applies and link TCR's published fee schedule
where
TCR is the billing party.

Remove two 2021/migration artifacts on the CSP page: "as broken down in
the
table below" referred to a fee-sheet screenshot dropped in the Fern
migration,
and the "minimum of 48 hours" vetting turnaround becomes "several
business
days", matching current DCA review times. Also decouple "you initiate
all
three" from the snippet's remedy-list length.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants