docs(10dlc): document Brand Identity Verification as a distinct gate - #543
Open
briankwest wants to merge 4 commits into
Open
docs(10dlc): document Brand Identity Verification as a distinct gate#543briankwest wants to merge 4 commits into
briankwest wants to merge 4 commits into
Conversation
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>
Contributor
…op unsourced fees
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
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 untilcompleted, thebrand_activated/brand_unverifiedstatus 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.mdxandregistration/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:34and the 10DLC status callback transition table — ispending/unverified/completed. There is noverifiedand novetted_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_VERIFIEDis omitted throughout; external vetting is documented as a remedy, not as a displayed status.The Brands tab list also gains the
unverifiedstate it was missing entirely.Other fixes
the-campaign-registry/index.mdxlinks to the new section instead of implying resubmission is the only recourse.Verification
fern docs md check— all 2816 MDX files valid.fern/snippets/server-sdks/reference-overview.mdx), so the#brand-identity-verificationand#resolving-an-unverified-brandanchors resolve on both including pages.fern checkpasses 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