Overview v2
---
title: "Reggie — full transaction flow v4"
---
flowchart TD
classDef kd fill:#e74c3c,stroke:#c0392b,color:#fff,stroke-width:3px,stroke-dasharray:5 5
classDef ok fill:#2ecc71,stroke:#27ae60,color:#fff
classDef esc fill:#f39c12,stroke:#e67e22,color:#fff
classDef dvl fill:#9b59b6,stroke:#8e44ad,color:#fff
classDef fin fill:#1abc9c,stroke:#16a085,color:#fff
classDef err fill:#e67e22,stroke:#d35400,color:#fff
classDef api fill:#1a5276,stroke:#154360,color:#fff
classDef defer fill:#bdc3c7,stroke:#7f8c8d,color:#2c3e50,stroke-width:2px,stroke-dasharray:8 4
classDef decided fill:#27ae60,stroke:#1e8449,color:#fff,stroke-width:2px
classDef email fill:#2c3e50,stroke:#1a252f,color:#fff
%% =============================================
%% 1. SELLER ENTRY AND VERIFICATION
%% =============================================
subgraph P1["1 — Seller entry and verification"]
S1([Seller registers]) --> S2[Authenticate<br/>Google / Apple / Email]
S2 --> E_WELCOME["📧 BOTH: Welcome email<br/>What Reggie is, what to do next"]:::email
E_WELCOME --> S3["Upload ownership document<br/>V5C / V778 / V750<br/>All claims require document"]
S3 --> S4{Document review}
S4 -->|High confidence| S5[Auto-approved]
S4 -->|Low confidence| S6[Manual ops review — 24hr SLA]
S4 -->|Failed| S7[Rejected with reason — retry]:::err
S7 --> E_REJECT["📧 SELLER: Verification rejected<br/>Specific reason + how to retry"]:::email
E_REJECT --> S3
S6 --> S5
S5 --> S_SNAP{Document type?}
S_SNAP -->|V5C| S_VES["VES API snapshot captured:<br/>Make, colour, year, engine<br/>MOT/tax status<br/>V5C issue date"]:::api
S_VES --> S8
S_SNAP -->|V778 or V750| S_NO_VES["Record certificate details<br/>+ expiry date"]
S_NO_VES --> S8
S_SNAP -->|Q plate detected| S_Q["Blocked: Q plates are<br/>non-transferable — cannot<br/>be claimed on Reggie"]:::err
S_SNAP -->|V5C special notes:<br/>non-transferable| S_NT["Blocked: V5C shows<br/>'non-transferable' in section 3<br/>This plate cannot be sold<br/>or retained — must stay<br/>with the vehicle"]:::err
S8["Seller verified ✓"]
S8 --> E_VERIFIED["📧 SELLER: Verification approved<br/>Plate claimed — choose your<br/>listing status"]:::email
end
KD_OCR["⚠️ DECIDE: OCR vs manual<br/>Spike needed on cost/effort<br/>Manual admin queue for v1?"]:::kd
S4 -.- KD_OCR
%% =============================================
%% 2. LISTING CREATION
%% =============================================
subgraph P2["2 — Listing creation — owner must pick a state"]
L1{Plate status?<br/>Must choose one}
L1 -->|Active listing| L_ID["ID check required<br/>before listing goes live<br/>Onfido / Veriff"]
L_ID --> L2[Set asking price]
L2 --> L3["Fee preview — seller sees:<br/>'At £5,000 asking price<br/>Buyer pays: £5,250 + £80 DVLA<br/>Reggie fee: £250 — 5%<br/>You receive: £5,000'"]
L3 --> LISTED([Plate LIVE<br/>Buy now + offers enabled])
LISTED --> E_LISTED["📧 SELLER: Plate listed<br/>Asking price, link to listing,<br/>what happens when someone bids"]:::email
L1 -->|Would consider selling| L6["WCS selected<br/>No ID check yet"]
L6 --> L7["⚠️ WARNING acknowledged:<br/>'Sell your vehicle without retaining<br/>= permanently lose your plate'"]
L7 --> L8{Set minimum<br/>offer threshold?}
L8 -->|Yes| L9["Set reject below £X<br/>+ fee breakdown shown"]
L8 -->|No| L10["Default soft floor applied:<br/>50% of Reggie valuation<br/>User can adjust this"]
L9 --> WCS_LIVE(["Plate visible as<br/>'owner may consider selling'"])
L10 --> WCS_LIVE
WCS_LIVE --> E_WCS["📧 SELLER: WCS confirmed<br/>What to expect, how offers work,<br/>reminder about retention warning"]:::email
L1 -->|Not interested in offers| NIO["Plate claimed on Reggie<br/>Offers blocked<br/>Other users can register interest"]
NIO --> NIO_LIVE(["Plate visible as claimed<br/>Interest count shown to owner"])
end
E_VERIFIED --> L1
DECIDED_FEES["✅ DECIDED: Buyer-side fees<br/>5% up to £5k / 4% up to £25k / 3% above<br/>No minimum fee<br/>+ £80 DVLA on buyer<br/>All shown upfront — DMCCA compliant"]:::decided
L3 -.- DECIDED_FEES
DECIDED_FLOOR["✅ DECIDED: Soft floor<br/>50% of valuation by default<br/>User can adjust or switch to<br/>'not interested in offers'"]:::decided
L10 -.- DECIDED_FLOOR
DECIDED_STATES["✅ DECIDED: Three plate states<br/>Active listing / WCS / Not interested<br/>Every claim must pick one<br/>Can change anytime"]:::decided
L1 -.- DECIDED_STATES
%% =============================================
%% 3a. STALENESS MONITORING — BACKGROUND
%% =============================================
subgraph P3_STALE["3a — Staleness monitoring — background"]
direction TB
BG1(["Monthly VES re-check<br/>V5C-verified plates"])
BG1 --> BG3["Query VES API<br/>compare to snapshot"]:::api
BG3 --> BG4{Changes?}
BG4 -->|No change| BG5["✓ Listing active"]:::ok
BG4 -->|V5C date / vehicle changed / not found| BG9["Listing PAUSED"]
BG9 --> E_STALE["📧 SELLER: Change detected<br/>'We noticed a change on your<br/>vehicle — confirm you still<br/>own this plate within 14 days'"]:::email
E_STALE --> BG10{Response in 14d?}
BG10 -->|Still owns| BG11["Snapshot refreshed"]
BG10 -->|Has V778 now| BG12["Upload V778 — upgraded"]
BG10 -->|No longer owns| BG13["Listing removed"]:::err
BG10 -->|No response| BG14["Listing hidden"]
BG_NUDGE(["6-month nudge<br/>ALL claimed plates"]) --> E_NUDGE["📧 SELLER: Periodic check<br/>'Still own this plate?<br/>Confirm to keep listing active'"]:::email
E_NUDGE --> BG_RESP{Response?}
BG_RESP -->|Yes| BG_ACTIVE["Listing active"]
BG_RESP -->|No response| BG_HIDE["Flagged"]:::defer
BG_NIO_DIGEST(["Weekly check<br/>NIO plates with new interest"]) --> E_INTEREST["📧 SELLER: Interest digest<br/>'X new people registered interest<br/>in your plate this week —<br/>consider switching to WCS?'"]:::email
end
WCS_LIVE --> BG1
WCS_LIVE --> BG_NUDGE
NIO_LIVE --> BG1
NIO_LIVE --> BG_NUDGE
NIO_LIVE --> BG_NIO_DIGEST
LISTED --> BG1
%% =============================================
%% 3b. BUYER DISCOVERY
%% =============================================
subgraph P3_BUYER["3b — Buyer discovery"]
B1([Buyer finds plate<br/>search / browse / SEO])
B1 --> B2{Plate status?}
B2 -->|Active listing| B3{Buy now or<br/>make offer?}
B2 -->|WCS plate| B_OFFER[Make offer only]
B2 -->|Not interested in offers| B_NIO["Offers blocked<br/>CTA: 'Register your interest'<br/>Logged in users only"]
B_NIO --> B_NIO_REG["Interest registered ✓<br/>Owner sees updated count"]
B3 -->|Buy now| B_BN_START([Buyer starts buy-now])
B3 -->|Make offer| B_OFFER
B_OFFER --> B_OFF_START([Buyer starts offer])
end
LISTED --> B1
WCS_LIVE --> B1
NIO_LIVE --> B1
DECIDED_ASSIGN["✅ DECIDED: Assignment to<br/>vehicle only for v1<br/>No retention/certificate option<br/>for buyers"]:::decided
B_OFF_START -.- DECIDED_ASSIGN
%% =============================================
%% 4. PRE-CHECKS — SELLER FIRST, THEN BUYER
%% =============================================
subgraph P4_CHECKS["4 — Pre-checks — seller first, then buyer"]
direction TB
CHK1["Step 1: Check SELLER<br/>before buyer invests any effort"]
CHK1 --> CHK2{Seller verified<br/>via V5C?}
CHK2 -->|Yes| CHK3["Fresh VES check on<br/>seller plate against snapshot"]:::api
CHK2 -->|V778/V750| CHK5A["Skip — certificate based"]
CHK3 --> CHK4{Snapshot matches?}
CHK4 -->|Yes| CHK5["✓ Seller plate confirmed"]:::ok
CHK4 -->|Changes detected| CHK_HOLD["HOLD — seller issue"]:::err
CHK_HOLD --> E_HOLD_BUYER["📧 BUYER: 'We're confirming<br/>this plate is still available —<br/>we'll notify you when ready'"]:::email
E_HOLD_BUYER --> E_HOLD_SELLER["📧 SELLER: 'Someone wants your<br/>plate but we detected a change —<br/>confirm within 7 days'"]:::email
E_HOLD_SELLER --> CHK_SELLER_RESP{Seller responds?}
CHK_SELLER_RESP -->|Resolved| E_HOLD_CLEAR["📧 BUYER: 'Plate confirmed —<br/>you can now proceed'"]:::email
E_HOLD_CLEAR --> CHK5
CHK_SELLER_RESP -->|No response / lost| CHK_DEAD["📧 BUYER: 'This plate is<br/>no longer available'"]:::err
CHK5A --> CHK6
CHK5 --> CHK6
CHK6["Step 2: Buyer ID check<br/>— plates valued over £5k only"]
CHK6 --> CHK6A{Over £5k?}
CHK6A -->|Yes| CHK6B["Buyer completes ID check<br/>Onfido / Veriff"]
CHK6A -->|No| CHK7
CHK6B --> CHK6C{Passes?}
CHK6C -->|Yes| CHK7
CHK6C -->|No| CHK6D["Cannot proceed"]:::err
CHK7["Step 3: Buyer enters<br/>vehicle registration"]
CHK7 --> CHK8["VES + MOT checks on<br/>buyer vehicle"]:::api
CHK8 --> CHK9{Vehicle eligible?}
CHK9 -->|"All checks pass"| CHK10(["✓ All clear<br/>Proceed to offer/buy"]):::ok
CHK9 -->|"Failed"| CHK11["BLOCKED:<br/>'Your vehicle isn't eligible —<br/>[specific reason]<br/>Resolve and try again'"]:::err
end
B_BN_START --> CHK1
B_OFF_START --> CHK1
DECIDED_BLOCK["✅ DECIDED: Hard block<br/>Vehicle fails = cannot proceed<br/>No advisory. Resolve and return."]:::decided
CHK11 -.- DECIDED_BLOCK
%% =============================================
%% 5a. OFFER AND NEGOTIATION
%% =============================================
subgraph P5_NEG["5a — Offer and negotiation"]
O1{Above seller minimum?}
O1 -->|No| O3["Blocked: minimum is £X"]
O3 --> O1A[Buyer adjusts]
O1A --> O1
O1 -->|Yes or no minimum| O_SUBMIT["Offer submitted"]
O_SUBMIT --> E_OFFER_CONF["📧 BUYER: Offer submitted<br/>'You offered £3,500 for [REG]<br/>Seller has 48hr to respond'"]:::email
E_OFFER_CONF --> E_OFFER_RECV["📧 SELLER: Offer received<br/>'Someone offered £3,500<br/>Reggie fee: £175 — You receive: £3,500<br/>Accept, decline or counter'"]:::email
E_OFFER_RECV --> O6{Seller responds — 48hr}
O6 -->|Accept| ACCEPTED([Deal agreed ✓])
O6 -->|Decline| O7["📧 BUYER: Offer declined<br/>'The seller declined — you can<br/>submit a new offer anytime'"]:::email
O6 -->|No response| O8["📧 BOTH: Offer expired<br/>BUYER: 'Seller didn't respond<br/>in time — submit again anytime'<br/>SELLER: 'An offer expired<br/>because you didn't respond'"]:::email
O6 -->|"Counter 🔹 MAYBE V1"| O9["📧 BUYER: Counter received<br/>'Seller countered at £4,200<br/>Total: £4,410 + £80 DVLA<br/>Accept or decline — 48hr'"]:::defer
O9 --> O10{Buyer responds — 48hr}
O10 -->|Accept| ACCEPTED
O10 -->|Decline| O11["📧 SELLER: Counter declined"]:::email
O10 -->|No response| O12["📧 BOTH: Counter expired"]:::email
end
CHK10 -->|Offer flow| O1
%% =============================================
%% 5b. BUY NOW — DIRECT
%% =============================================
subgraph P5_BN["5b — Buy now — direct"]
BN1["Show total upfront:<br/>Plate + Reggie fee + £80 DVLA"]
BN1 --> BN2["Buyer confirms purchase"]
BN2 --> BN4([Buy now confirmed ✓])
end
CHK10 -->|Buy-now flow| BN1
%% =============================================
%% 6a. WCS SELLER ID GATE
%% =============================================
subgraph P6_SID["6a — Seller ID gate — WCS only"]
SID1["Seller clicked accept on offer<br/>but before buyer is notified:"]
SID1 --> SID2{ID already verified?}
SID2 -->|Yes — returning seller| SID3(["Acceptance confirmed ✓<br/>Buyer notified — payment proceeds"])
SID2 -->|No — first transaction| SID4["'Complete a quick identity check<br/>to finalise your acceptance'"]
SID4 --> SID5{Passes?}
SID5 -->|Yes| SID3
SID5 -->|"No / not completed"| SID6["Acceptance NOT sent to buyer<br/>Offer remains open — buyer unaware<br/>Seller prompted to resolve ID<br/>Offer expires normally at 48hr<br/>if not finalised"]:::err
end
ACCEPTED -->|WCS listing| SID1
ACCEPTED -->|Active listing| P_PAY
%% =============================================
%% 6b. PAYMENT AND ESCROW
%% =============================================
subgraph P6["6b — Payment and escrow"]
P_PAY["Buyer card charged:<br/>Plate price + Reggie fee + £80 DVLA<br/>Binding — agreed at offer/buy-now"]
P_PAY --> P_ESC["Funds in escrow<br/>via Stripe Connect"]:::esc
P_ESC --> E_PAY["📧 BOTH:<br/>SELLER: 'Payment secured in escrow<br/>— here's what happens next'<br/>BUYER: 'You've paid £X — funds<br/>held securely until transfer completes'"]:::email
E_PAY --> P_AUTH["Both sign agent authorisation:<br/>'I authorise Reggie to submit<br/>DVLA applications on my behalf'"]
P_AUTH --> E_AUTH["📧 BOTH: Agent authorisation<br/>confirmed — link to sign if<br/>not completed in-app"]:::email
E_AUTH --> P_COLLECT["📧 BUYER: 'Provide your V5C<br/>document reference number<br/>so we can complete the transfer'"]:::email
end
SID3 --> P_PAY
BN4 --> P_PAY
DECIDED_ESCROW["✅ DECIDED: Stripe Connect<br/>for escrow"]:::decided
P_ESC -.- DECIDED_ESCROW
%% =============================================
%% 7. SELLER-SIDE: RETENTION (IF NEEDED)
%% =============================================
subgraph P7["7 — Seller-side: get plate onto certificate"]
T1{Seller document type?}
T1 -->|V778 or V750| T5["Plate already on certificate<br/>Seller provides V778/V750<br/>reference to Reggie"]
T1 -->|V5C — plate on vehicle| E_RET_GUIDE["📧 SELLER: Retention guide<br/>'Complete these steps on gov.uk<br/>to remove the plate from your<br/>vehicle — step by step instructions<br/>enclosed. Pay £80 to DVLA.'"]:::email
E_RET_GUIDE --> T2A["Reggie provides step-by-step<br/>instructions in-app:<br/>1. Go to URL<br/>2. Enter reg<br/>3. Enter V5C ref<br/>4. Confirm postcode<br/>5. Pay £80"]
T2A --> T2B["Seller authenticates<br/>and completes retention<br/>— must do this themselves"]:::dvl
T2B --> T2C["Seller receives online<br/>retention reference number<br/>+ V778 issued"]:::dvl
T2C --> T2D["Seller provides Reggie<br/>with V778 reference"]
T2D --> E_RET_DONE["📧 BOTH:<br/>SELLER: 'Retention complete —<br/>we'll now assign to the buyer'<br/>BUYER: 'Seller has completed<br/>their side — assignment starting'"]:::email
E_RET_DONE --> T5
T5 --> T6([Reggie has V778 reference<br/>+ buyer vehicle details<br/>Ready for assignment])
end
P_COLLECT --> T1
DECIDED_RETENTION["✅ DECIDED: Seller pays £80<br/>retention to DVLA directly<br/>Buyer reimburses as part of<br/>total payment through Reggie"]:::decided
T2A -.- DECIDED_RETENTION
%% =============================================
%% 8. REGGIE DOES BUYER ASSIGNMENT
%% =============================================
subgraph P8["8 — Reggie assigns plate to buyer vehicle"]
D1["Reggie ops logs into gov.uk<br/>'Assign a private number<br/>to a vehicle'<br/>Enter buyer email for eV948"]:::dvl
D1 --> D2["Enters:<br/>• Plate being assigned<br/>• V778 reference from seller<br/>• Buyer vehicle reg<br/>• Buyer V5C doc reference<br/>• Buyer postcode<br/>• Buyer email for eV948"]:::dvl
D2 --> D3{DVLA accepts?}
D3 -->|Yes — instant| D4["Assignment confirmed ✓<br/>eV948 generated by DVLA<br/>Reggie downloads eV948<br/>DVLA emails buyer copy"]:::dvl
D3 -->|No — rejected| D5["Review rejection reason"]:::err
D5 --> D6{Fixable?}
D6 -->|Yes — data error| D7["Reggie corrects + retries"]
D7 --> D2
D6 -->|"No — vehicle ineligible<br/>despite pre-checks"| D8["📧 BOTH: Transaction cancelled<br/>BUYER: Full refund from escrow<br/>SELLER: 'Transfer couldn't complete<br/>— plate remains yours'"]:::err
end
T6 --> D1
DECIDED_ONLINE["✅ DECIDED: Online only for v1<br/>No V317 postal fallback<br/>Graceful exit if DVLA rejects<br/>Pre-checks should catch most issues"]:::decided
D3 -.- DECIDED_ONLINE
%% =============================================
%% 9. AUTOMATED VERIFICATION + INSTANT RELEASE
%% =============================================
subgraph P9["9 — Automated verification and instant release"]
V1["Poll VES API using<br/>transferred plate number"]:::api
V1 --> V2{Result?}
V2 -->|"Vehicle details changed<br/>from seller snapshot AND<br/>match buyer vehicle"| V3["✓✓ Transfer confirmed<br/>Escrow released IMMEDIATELY"]:::ok
V2 -->|"Vehicle details changed<br/>from seller BUT don't<br/>exactly match buyer"| V4["⚠️ Flag for admin review"]
V2 -->|"No change yet"| V5["Continue polling<br/>Check hourly"]
V5 -->|"48hr+ no change"| V6["Alert ops team"]:::err
V5 -->|"Change detected"| V2
V3 --> V7["Escrow releases:<br/>Seller receives plate price<br/>+ £80 DVLA reimbursement<br/>Reggie retains fee"]:::esc
V4 --> V4R{Admin confirms?}
V4R -->|Yes| V7
V4R -->|No — issue found| V8["Escalate — hold escrow<br/>Contact both parties"]:::err
end
D4 --> V1
DECIDED_VES["✅ DECIDED: VES API verification<br/>+ immediate escrow release<br/>No dispute window needed —<br/>plate is legally on buyer vehicle<br/>Transfer is irreversible"]:::decided
V3 -.- DECIDED_VES
%% =============================================
%% 10. COMPLETION
%% =============================================
subgraph P10["10 — Completion"]
E_SELLER_DONE["📧 SELLER: Payout sent<br/>'£X + £80 DVLA reimbursement<br/>sent to your bank account.<br/>Transaction complete —<br/>thank you for using Reggie.'"]:::email
E_BUYER_DONE["📧 BUYER: Transfer complete<br/>'Your plate [REG] is now on<br/>your vehicle. Attached: eV948<br/><br/>NEXT STEPS:<br/>1. eV948 expires in 3 working days<br/> — get plates made ASAP<br/>2. Take eV948 + ID to any RNPS<br/> supplier for physical plates<br/>3. Fit new plates BEFORE driving<br/>4. Update your insurance provider<br/>5. New V5C arrives 4-6 weeks<br/><br/>Questions? We are here to help.'"]:::email
E_SELLER_DONE --> C9
E_BUYER_DONE --> C9
C9["TRANSACTION ARCHIVED"]:::fin
end
V7 --> E_SELLER_DONE
V7 --> E_BUYER_DONE
%% =============================================
%% LEGAL FLAG
%% =============================================
LEGAL["⚖️ LEGAL REVIEW NEEDED:<br/>Reggie completing gov.uk<br/>assignment as agent —<br/>clicking 'I am the grantee'<br/>on buyer's behalf.<br/>Industry standard practice<br/>but get solicitor sign-off"]:::kd
D1 -.- LEGAL
%% =============================================
%% DEFERRABLE TO V2
%% =============================================
subgraph DEFER["🔹 Deferred to v2"]
direction LR
DF1["Counter-offers"]:::defer
DF2["Auto-accept/decline<br/>thresholds"]:::defer
DF3["Buyer retention<br/>option"]:::defer
DF4["V317 postal<br/>fallback"]:::defer
DF5["Automated OCR"]:::defer
DF6["Certificate expiry<br/>monitoring"]:::defer
DF7["Physical plate<br/>supplier partnership"]:::defer
DF8["Browse / discover<br/>/ filter"]:::defer
DF9["Stale listing<br/>ranking logic"]:::defer
end
%% =============================================
%% EMAIL SUMMARY
%% =============================================
subgraph EMAILS["📧 Email touchpoint summary"]
direction LR
EM1["Registration:<br/>• Welcome<br/>• Verification approved/rejected<br/>• Listing/claim confirmed"]
EM2["Monitoring:<br/>• Staleness alert<br/>• 6-month ownership nudge<br/>• Interest digest for NIO plates"]
EM3["Offer cycle:<br/>• Offer submitted confirmation<br/>• Offer received by seller<br/>• Accepted/declined/countered<br/>• Expired notifications"]
EM4["Transaction:<br/>• Payment confirmed<br/>• Agent auth request<br/>• V5C reference collection<br/>• Retention guide for seller<br/>• Retention complete update"]
EM5["Completion:<br/>• Assignment complete<br/>• eV948 to buyer<br/>• Payout sent to seller<br/>• Transaction summary"]
end
%% =============================================
%% AUDIT TRAIL
%% =============================================
subgraph AUDIT["AUDIT TRAIL — captured throughout"]
direction LR
AU1["Verification:<br/>Documents + OCR/manual<br/>VES snapshots<br/>ID check results<br/>Staleness logs<br/>Re-confirmations"]
AU2["Commercial:<br/>Offers + counters<br/>Timestamps + expiries<br/>Fee calculations<br/>Agent authorisations<br/>Dual agency disclosure"]
AU3["Financial:<br/>Payment captures<br/>Escrow movements<br/>Reggie fee deductions<br/>Seller payouts + £80 reimb<br/>Refunds + reasons"]
AU4["DVLA:<br/>Retention submissions<br/>V778 references<br/>Assignment confirmations<br/>Rejections + reasons<br/>VES verification polls<br/>eV948 generation + delivery"]
AU5["Retention periods:<br/>Financial: 6 years<br/>Documents: 3 years<br/>Transactions: 6 years<br/>Comms: 2 years<br/>VES snapshots: listing life"]
end