Product Proposal · Customer Support / Product Customer Advocate · Expands GPD-112
Decouple user accounts from recipient verification records · make display names self-serve

Account data should never block a recipient's money. A name should be yours to change.

One User record is doing three unrelated jobs: sign-in security, public display, and the data source for payment verification. Separate them, with the email address as the single locked link, and an entire class of blocked funds, leaked names, and support tickets disappears.

38
engineering issues in this family, Feb–Jul
2.8×
monthly incident rate, Feb–Apr avg vs May–Jul avg (3.3 → 9.3)
174+
name-related tickets, Feb–Jul (subject-search floor)
278+
recipient-blocked tickets, Feb–Jul (subject-search floor)
8+
countries hit by recipient phone validation (engineering + helpdesk)
141
production failure events, two streams unresolved (fixes staged as of Aug 7)
01 · What this looks like at the support desk

The conversations we are forced to have

Most of the cost of this coupling never shows up as an incident. It shows up as guidance, the things support has to say to customers every week because the data model gives us no better answer. Each of these is a real, recurring script.

Finish connecting your bank first. Then write back and we'll change the name.
The standing forced instruction in this family. The account name seeds the verification record: rename too early and it no longer matches the legal name on the locked bank form, verification blocks, and they write us again. And the mirror case: a creator renaming for anonymity, a group, a family, or a business is quietly set up to be blocked later if they become the recipient (#65204's revert/re-revert trap). The coupling dictates the order of our own support scripts.
You can't change your own name. Reach out to us and we'll change it for you.
Every typo, marriage, privacy request, and legal name change is a support contact. 174+ tickets since February, trending up every month. And pre-verification, not even support can change it safely.
Honestly, your best option is to start over with a new fundraiser.
Routine enough that customers pre-empt it: ticket #61051's subject line is “How to change the recipient into my husband's name without starting over.”
You could try getting a US phone number.
A recipient bought a US number from a third-party carrier to receive her own funds after her Thailand security phone auto-filled into a US banking form (TS-482).
You can wait, or we can refund your givers.
Support's honest options for every Trinidad & Tobago recipient while TS-485 was open (blocked Jul 21–27, resolved Jul 27). While it was open, refund and use a competitor was a sentence we said. A resolved instance, but the coupling family that produced it is intact.
Our systems show different emails for this fundraiser. We'll need to check with engineering.
Recipient email drift between the payment processor and our admin, with no audit trail (TS-434), and a legacy flow that silently swallowed a failed user creation, leaving an orphaned recipient record plus duplicate user rows on the owner's email (TS-476).

And the display-name workaround itself, step by step

Set the fundraiser to private so the wrong name isn't shown while we work.
Add the recipient through the normal flow.
Complete verification under the legal name.
Contact support again once bank details are in.Support touch
Support checks the record and edits the display name in the backend.Manual backend edit
This is why the data undercounts. Every run of this procedure logs as routine ticket contact, not as an incident. The cost is absorbed into process and becomes invisible. CS filed this exact thesis as a voice-of-customer ticket in January (#38815: “Decouple User Display Name from Legal Verification Data”), and customers now propose the procedure themselves: #65204 asks us to revert their safety pseudonym to their legal name, add the recipient, then re-revert. None of this needs a study. It needs a boundary.
02 · Root cause

One record, three jobs

Four account fields, first name, last name, phone, and email, seed the payment-verification flow directly today. Because the jobs share fields, the product must either sync them between contexts (and break when validity rules differ) or let them drift (and lose any source of truth). Both failure modes are shipping.

User account record, today

First + Last Name · seeds verification
Phone (required) · seeds verification
Email · seeds verification
Country / State / City / ZIP
Organization Name · maps to nothing
Social Media Link · “for quicker verification”
Sign-in & securityPassword, OTP phone, account ownership. The record's valid job.
Public displayFirst/last is the public name on every fundraiser. Never editable by the user.
Verification seedThe same fields flow into regulated banking forms with different validity rules per country.
Nobody can reliably answer “is this field safe to sync?” because the same value is a security credential in one context and regulated banking data in another. Getting that answer wrong has produced 38 engineering issues since February.
03 · Six months of the same defect

The trend line, three ways

Engineering issues and support volume, February 1 through July 23. The Jira count is a one-time sweep count and the ticket counts are Zoho subject-search floors: search caps and the process-absorbed workarounds above mean true volume is higher. July is a partial month in all three charts.

Coupling-family issues

Jira, created per month
FMAMJJ

Name-related tickets

Zoho, self-service failures, floor
FMAMJJ

Recipient / verification blocked

Zoho, customer-initiated, floor
FMAMJJ
View the numbers as a table
MonthJira family issuesName-change ticketsRecipient blocked
Feb21830
Mar61520
Apr21924
May62941
Jun124247
Jul (to 23rd)1051116
Ticket-created dates understate how long problems ran: production telemetry pushes real customer impact back to April 30 for the bank-country mismatch stream (81 events, DEV-1897) and June 12 for failed ID re-uploads (60 events, 93% mobile, DEV-1896). Both streams remain unresolved, with fixes staged as of Aug 7 (Ready for Deployment / Ready for Testing). Plus 134 replies to automated verification emails and 36 anonymity requests riding the same rails.
04 · Industry practice

We are not inventing this model. We're the outlier without it.

GoFundMe

Public name can be a nickname; the transfer name must be legal, match government ID and the bank exactly, and stays private. The exact two-track model this proposal describes, running at the major competitor.

Patreon

The verified legal name is “internal compliance only” and never displayed on the profile. Verified attributes live out-of-band from public identity.

Our payment processor

KYC lives on a separate account object the platform submits to. Prefilled onboarding data is treated as unconfirmed until the account holder verifies it, and a name mismatch (failed_name_match) disables payouts. Pre-filling verification from unverified profile data is a documented payout-blocking anti-pattern.

Account types

Individual vs company is a first-class fork industry-wide, with the company shape nesting a representative's personal name under the org's legal name. The recommended signup model below is the standard record shape, not an invention.

NIST SP 800-63-3

Formally separates identity proofing from authentication as independent assurance dimensions and calls the separation privacy-enhancing. The standards-body name for this decoupling.

GDPR Art. 5

Purpose limitation and data minimization: data collected for login/display must not silently become payout-verification data. The same principle, as law.

05 · The proposal

Three records, one locked link

One kind of account. Being a recipient is a role on a fundraiser, not a kind of account. Each record owns its own data, and nothing syncs.

User account

Owns: who signs in, what the public sees
  • Display name, freely self-editable, every change logged
  • Email + phone for ownership, sign-in, OTP only
  • Password, preferences

Fundraiser

Owns: where money goes, what rules apply
  • Withdrawal country: the recipient's country, chosen at creation; drives banking + verification; locked to match the processor
  • ZIP/postal: the recipient's local area, for "nearby" discovery — where the recipient lives, not the creator
  • Public display feeds from linked accounts: creator byline, recipient received-by

Recipient verification record

Owns: what the processor validated
  • Created fresh per fundraiser at payment connection
  • We store only: legal or legal business name, email (locked), city/country, phone, banking
  • Tax ID, DOB, street address: processor only. Never stored in our database
  • Locked once verified. Never auto-filled from the account
The identity anchor: email is displayed from the account and locked to match between the user account and their verification record, enforced server-side. That is the only field the two records share. This refines the April email-lock decision rather than reverting it, and gives the invite feature the architecture it was waiting for.
No sync, either directionNothing auto-populates between account profile fields and recipient or banking forms. Verification phone is collected in the recipient-country context, only if the processor requires it.
Invites carry email onlyAny name typed into an invite personalizes the message and never seeds the invitee's identity. Invitees enter their own details under their own account.
Rename audit trailSelf-serve display name edits, full rename log in admin, name-change history included in manual verification review. Guardrails already aligned with Verification in GPD-112.

Public “received by” precedence

Recipient's display name (default)
→ business bank account verifies →
DBA if present
→ else →
Legal business name
never free text

Showing the verified business name publicly stays. It is a deliberate trust feature beyond what competitors show, and the no-DBA fallback becomes a first-class path instead of a privacy leak.

06 · The records, field by field

Every field, its job, its lifecycle

The full proposed data model: what each field is for, where it lives, where it shows, how it changes, and who verifies it. The most sensitive PII never enters our database. Rows marked "spec" are lifecycle details for the engineering spec session.

User account

FieldPurposeStoredShownChangedVerified
Account typeIndividual or Organization/Group; sets the name shapeGSG DBIndirectly, via name shapeSet at signup; conversion path: spec
Display nameThe one public identity. Individual: first + last. Org: org/group nameGSG DBCreator byline + received-by on every fundraiser in the account (disclosed at signup)Self-serve, anytime; every change logged; history feeds verification reviewNot verified (public, not legal, identity)
Owner/manager nameThe human behind an org accountGSG DBNever public; admin onlySelf-serve; loggedNot verified
EmailOwnership, sign-in, receipts; the identity anchorGSG DBNever publicChange-email flow; lock-match re-checked on change (spec)Email verification
PhoneOTP and account security onlyGSG DBNever publicSelf-serve with OTP re-checkOTP
Password, preferencesAuth and settingsGSG DBNever publicSelf-serve
Retired fieldsOrganization Name, Country/State/City/ZIP, Social Media LinkDropped; social link relocates to verification

Fundraiser

FieldPurposeStoredShownChangedVerified
Withdrawal countryThe recipient's country. Drives banking + verification; must match the processorGSG DBFundraiser page location contextLocked at creation (warning already ships)
ZIP/postal codeThe recipient's local area, for "nearby" discovery — where the recipient lives, not the creatorGSG DBFundraiser page location + nearby searchSet at creation; constrained to the withdrawal country; correction path when recipient ≠ creator: spec. Label + validation per-country from maintained address metadata ("ZIP" is US-only vocabulary); optional where a country has no postal system, with "nearby" falling back to city. Never a hand-rolled country list — that's the phone-component mistake in postal formNot verified
Creator bylinePublic "organized by"Derived, not stored — creator's display nameFundraiser pageUpdates automatically when the creator renames
Received-by linePublic "funds go to"Derived, not stored — display name → DBA → legal business nameFundraiser pageAutomatic per precedence; never free textBusiness names from the verified record
Representing (optional)Group/org/cause labelGSG DBAlongside, never replacing, the namesCreator-editableNot verified
Recipient linkWhich account holds the recipient roleGSG DBAdd-recipient and invite flows

Recipient verification record · fresh per fundraiser · Individual and Business/Org variants

FieldPurposeStoredShownChangedVerified
Legal name(s)Individual: legal first + last. Business: legal business name + representative's legal name. Payout identityGSG DBIndividual legal and representative names: never public. Legal business name: public in received-by once the business bank verifies with no DBAEntered fresh; locked once verified; change = re-verificationProcessor identity verification
DBA (business, optional)Public-facing business nameGSG DBWins received-by when presentPre-verification self-serve; after: support with audit (spec)Processor
EmailThe identity anchorGSG DBNever publicDisplayed from the account, locked to match, enforced server-sideLock-match + account email verification
PhoneOnly where the processor requires it for the withdrawal countryGSG DBNever publicEntered fresh in the recipient-country contextPer processor rules
City + countryThe payout context the platform actually needsGSG DBNever publicEntered fresh; editable pre-verificationProcessor
BankingPayout destinationGSG DB (operational reference)Never public; verified state flips the business-name displayEntered fresh; re-enterable after failed transfer (must-have fix)Processor bank validation
Tax ID, DOB, street addressIdentity proofingProcessor only — never in GSG's databaseNeverVia processor flowsProcessor
Social media linkVerification-support signal (relocated from account)GSG DB (verification context)Never publicOptional at verification timeManual review aid
Why the storage column matters: the processor is the system of record for the most sensitive PII, exactly how the major platforms model it (Section 04). Less regulated data in our database means smaller breach surface, simpler compliance, and no second copy to drift.
07 · One open decision

What shape the display name takes

Recommended direction below. Final call belongs in the engineering spec session, and the decoupling is what makes that safe to defer.

Rejected

Repurpose the dead Organization Name field

An account-wide override maps to all of a user's fundraisers. One account running a personal and an org fundraiser shows the wrong name on one of them.

Rejected

Per-fundraiser display name

A third name mapping to build and maintain: overengineering. The optional per-fundraiser “Representing” label serves the group-name case, shown alongside identity, never replacing it.

Recommended

Account type at signup

Individual: first/last name. Organization/Group: org name as the account name, with an owner/manager first/last nested in the record. Fixes the TS-464 class at the root, gives the no-DBA business case a sane public path, and matches the industry-standard record shape. Disclosed plainly at signup: this name is the public creator and received-by on every fundraiser the account creates or receives funds for.

Why this decision is low-stakes now: once verification data lives on its own record, whichever name model wins cannot touch recipient setup. That is the argument for approving the decoupling today and settling the display model in spec.
08 · The honest ledger

What's already fixed, and why the gap remains

Shipped and welcome
  • DEV-1916: name validation relaxed (emoji, numbers, “and”, special characters no longer block)
  • Three per-country phone fixes live: Hong Kong, Morocco, Benin
  • GPD-117 + June recovery batch: many re-verification dead ends fixed
  • DEV-1901: country-lock warning added at fundraiser creation
Why none of it closes the gap
  • Every fix patches a symptom of the shared-field model, one field, one country, one form at a time
  • The phone component failed twice more in July after three patches, exactly as the developer's May 15 note predicted
  • DEV-1896 is still failing at scale after the recovery-UX batch
  • The name is still uneditable and the workaround is still five steps and a backend edit
09 · Ship plan and asks

What we're asking for in this meeting

This sprint · independently shippable

Stop the bleeding

  • Land TS-508, the phone-autofill removal, ticketed and in code review as of Aug 7 (the autofill stays in production until it deploys); freeze any extension of the behavior in the meantime
  • Create the follow-up card the developer recommended May 15: migrate phone validation to the dynamic countries API
  • Unlock recipient form state: allow returning to bank account type selection; re-present options after abandonment
  • Ticket + fix the recipient-form SMS opt-in silent failure (August 7 observation)

The decoupling

  • Three records, server-side email anchor, no cross-sync
  • Self-serve display name with rename audit log
  • Received-by precedence including the no-DBA path
  • Migration path for existing records
  • Proposal nice-to-haves: retire Organization Name and the account location block; relocate the social link to verification
TomProduct
Re-score GPD-112 with this widened scope and move it out of the Parking lot. It scored 3.50 Strong Candidate on June 9 covering the name alone. The window since showed the coupling also spans phone, email, and country, with the monthly incident rate nearly tripled.
Robert / KabeerEngineering
The spec session the June 9 scoring flagged as the open validation step: migration path, the display-name model call, server-side anchor enforcement, and reconciling DEV-1316's Done status against reality.
LydiaVerification
Carry the GPD-112 guardrails into the widened scope; confirm processor and compliance constraints on the locked-once-verified record and the rename-history review.
BenCS
Evidence delivered: six-month Jira sweep, ticket-volume floors, the workaround inventory, and the industry benchmark, all summarized on this page and in the full proposal.
Success looks like: a recipient in any supported country completes fund setup regardless of what their account carries. The “account data blocks or corrupts recipient setup” ticket class goes to zero. Name changes are self-serve with a full audit trail. A profile edit never takes a fundraiser offline. And support never again says “refund and go elsewhere” because a phone field can't validate.
Appendix · The receipts

The full evidence, one click deep

Nothing was cut to lighten the pitch — the complete timelines and tables live here for questions and the follow-up read. Every item traces to the full proposal document.

Phone — six incidents, one component, zero root-cause fixes

Every phone failure below comes from the same place: a phone input that validates against a static in-code country list and silently defaults to +1. Each fix patched one country. The component then failed for the next one.

Feb 4
DEV-1223Global regression blocks all recipient creation.

A hardcoded “at least 10 digits” rule rejected valid numbers from the US, Canada, Australia, France, and Ghana. Caught by QA as a release blocker. The earliest instance of the exact failure shape that hit Trinidad in July.

May 9
TS-402Hong Kong recipients hard-locked to a +1 phone field.

US flag, prohibited symbol, even with an HK campaign country. Real customer blocked from recipient setup. Root cause: the phone component silently defaults to +1 with the country picker disabled. Fixed May 20, for Hong Kong only.

May 19
TS-412Morocco: valid numbers truncated to invalid.

9-digit numbers cut to 8 across signup, profile, and every recipient form. Fixed May 22, for Morocco only.

May 15
Developer commentThe warning that predicted the rest of this timeline.

The developer recommended a follow-up card migrating phone validation to the dynamic countries API “to ensure all phone-country mappings and masks continue to work.” No follow-up card appears in Jira.

Jun 4
TS-433Benin: no valid phone format accepted at all.

The field stops at 8 digits; valid Benin numbers are 10. Both old and new formats rejected. Fixed June 9, for Benin only, with another per-country regex.

Jul 20
TS-482Thailand, and now the autofill makes it worse.

The June phone-autofill deploy (DEV-1661, flagged in comments before ship) pulled her Thailand security phone into a US-validated banking context and silently failed. She bought a US number to receive her own funds.

Jul 21
TS-485Trinidad & Tobago: every recipient blocked Jul 21–27. Resolved Jul 27.

No phone input passed the Recipient Information form until the fix shipped Jul 27. While it was open, support's options were: wait indefinitely, or refund.

On the autofill specifically: it is new, deployed in June, so there is little volume data on it yet, by definition. What has surfaced in its first weeks: one fund-blocking incident of its own (TS-482), the same week the same phone component's Trinidad & Tobago validation block surfaced (TS-485), and in-ticket pressure to extend the autofill to more recipient scenarios. This is the accelerant on top of the six-month pattern, and the window to stop it is now. Related churn: a phone field was added to the invite flow in March (DEV-1366) and removed as “incorrectly added” in April (DEV-1487). Nobody can say which surface owns the field, because ownership is exactly what the shared model erases.
Email — the lock is right, the plumbing around it isn't

Locking the account email into the self-recipient flow was a deliberate April security decision, and it stays: that flow is strictly for the creator's own account, and third parties go through Invite a Recipient. The problems are everything built around the lock.

Mar 25
DEV-1409The lock ships as a high-priority security item. Correct call.

Account email locked into the business self-recipient flow, released April 29. Settled policy: self-flow is the creator's own account; third parties get invited.

May 18
DEV-1602The visual lock is DOM-bypassable and fails silently.

A confusing-UX and defense-in-depth gap only: the server always persisted the canonical account email, so no data-integrity or account-takeover risk. Fixed June 2026 (DEV-1602, Done Jun 8) with a DOM-level lock plus explicit server-side 422 rejection of substituted emails.

Jun 4–5
TS-432 + TS-434Around the lock, email data drifts and traps.

The creator's email auto-populates when re-adding a recipient after deleting one, and recipient email mismatches between the payment processor and our admin with no activity-log record. In July, the legacy flow silently swallowed a failed user creation, orphaning a recipient record with no user account behind it and leaving duplicate user rows on the owner's email; engineering ruled out a migration regression (TS-476). A lock with no single source of truth behind it can't prevent drift.

Jun 9
TS-436The locked field fails its own validation.

An account email with multiple periods auto-filled into the locked recipient field, and the form's own validator rejected it. “Enter a valid email address,” on a field the user cannot edit. Completely blocked from receiving transfers.

Jun 5
DEV-1667A helper-text band-aid ships.

Copy explaining that the creator's email will be used, instead of a data model that makes it impossible to be confused.

Jul 9
DEV-1785The invite feature is cancelled without a recorded reason.

Created June 30, cancelled July 9. The card had been gated on email-lock architectural runway from the day it was filed. The coupling is now costing roadmap, not just tickets.

What the proposal does with this: keeps the lock. Email stays the anchor, and server-side enforcement already ships (DEV-1602, June 2026). The proposal adds one source of truth behind the lock so drift can't happen, and the working invite path for third-party recipients, the architectural runway the cancelled DEV-1785 invite feature was waiting for.
Name — a field nobody can safely touch

The account name is the public name is the verification name. So every edit is dangerous, every validation is invisible, and every privacy need becomes a project.

Blocked because their name contained “and.”
TS-464: an org name split across first/last fields tripped an invisible byline validation. The workaround: an admin edited the user's name directly in the database.
The public page shows the representative's personal name, not the business.
TS-340/TS-339 (March): editing the recipient threw a processor permission error. TS-480 (July): a business with a blank DBA had the representative's personal name published; the admin-side fix didn't propagate.
I need my name hidden. Please.
36 anonymity and privacy requests since February ride the same agent-side edit path. The June case (#56097) needed anonymity; there was no self-serve way to give it.
PLEASE CHANGE MY LEGAL NAME… SYSTEM WOULD NOT ALLOW ME TO CHANGE.
Verbatim from #65835, July 22. Same story in #53646 (typo locked in), #61966/#61974 (same user, twice in one day, name blocking payout), #62481 (name/bank mismatch blocking transfer), #65204 (display name blocking recipient add).
Forward mitigation exists and is welcome: DEV-1916 (July 22) relaxes first/last-name validation. It makes the shared field less explosive. It does not make it editable, private, or safe to change after verification. Note also DEV-1316 is marked Done (“owner display name should be editable”) yet users cannot edit their name today; engineering should reconcile that status during the spec.
Still failing while we read this
StreamImpactStatus
DEV-189781 events Apr 30 – Jul 17: bank-account country from the recipient address form mismatches the country encoded in the IBAN. Multiple recipients.Open — fix Ready for Deployment
DEV-189660 events since Jun 12 as of mid-July, 93% mobile: ID document re-upload failing on the recipient-address endpoint, “likely blocks ability to receive payouts.”Open — fix Ready for Testing
TS-485Every Trinidad & Tobago recipient hard-blocked at the Recipient Information form for a week (Jul 21–27).Resolved Jul 27
TS-479Recipient DOB field accepts no input on any browser, device, or network. One customer tried a library computer.Awaiting deploy
GPD-115Shipped on top of the coupled model. Built before the decoupling, it inherits the defect.Done Jul 28
GPD-120 / GPD-97Parking-lot cards that would build on GPD-115 inherit the defect the same way. Every future recipient-lifecycle card does until the decoupling lands.Parking lot
The account record today, field by field

A July 23 audit of signup and account settings.

FieldWhat it does todayVerdict
First + Last NameThe only name the platform has. Sign-in identity, public name on every fundraiser, and a direct verification seed.Triple duty
EmailAccount ownership and sign-in, and a verification seed via the email lock. The natural identity anchor, currently anchored wrong.The one link
Phone (required)Account security and OTP, and since June auto-fills into country-validated banking forms.Leaks into banking
Country / State / City / ZIPFour location fields with no consumer the fundraiser's withdrawal country doesn't already cover. The major competitor carries no account-level location at all; it collects location per fundraiser, at creation.No consumer
Organization NameCollected at signup, shown in settings, maps to nothing anywhere in the product.Dead field
Social Media LinkUI copy: “For quicker verification times enter a social media profile link.” An account field explicitly recruited for verification duty.Verification duty