Overview v1
---
title: "Reggie — full transaction flow v3"
---
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
%% =============================================
%% 1. SELLER ENTRY AND VERIFICATION
%% =============================================
subgraph P1["1 — Seller entry and verification"]
S1([Seller registers]) --> S2[Authenticate<br/>Google / Apple / Email]
S2 --> S3[Upload ownership document<br/>V5C / V778 / V750]
S3 --> S4{Document review}
S4 -->|High confidence OCR| S5[Auto-approved]
S4 -->|Low confidence| S6[Manual ops review — 24hr SLA]
S4 -->|Failed| S7[Rejected with reason — retry]:::err
S7 --> S3
S6 --> S5
S5 --> S_SNAP{Document type?}
S_SNAP -->|V5C| S_VES["VES API snapshot captured:<br/>Vehicle make, colour, year<br/>MOT status + expiry<br/>Tax status<br/>Date of last V5C issued<br/>Stored as baseline"]:::api
S_VES --> S8
S_SNAP -->|V778 or V750| S_NO_VES["No vehicle to snapshot<br/>Record certificate details<br/>Expiry date — 10yr validity"]
S_NO_VES --> S8
S8[Seller verified ✓<br/>Document type + snapshot recorded]
end
KD_OCR["⚠️ DECIDE: OCR provider<br/>Onfido? AWS Textract?<br/>Google Vision? Manual-only MVP?"]:::kd
S4 -.- KD_OCR
%% =============================================
%% 2. LISTING CREATION
%% =============================================
subgraph P2["2 — Listing creation"]
L1{Listing type?}
L1 -->|Active listing| L2[Set asking price]
L2 --> L3["Fee preview shown:<br/>At £5,000 — commission £600<br/>You receive: £4,400"]
L3 --> L4{Set auto-accept /<br/>auto-decline?}
L4 -->|Yes| L5["Configure thresholds<br/>🔹 MAYBE V2"]:::defer
L4 -->|No| LISTED([Plate LIVE<br/>with asking price])
L5 --> LISTED
L1 -->|Would consider selling| L6[Toggle WCS on]
L6 --> L7["⚠️ CRITICAL WARNING shown:<br/>'If you sell your vehicle without<br/>retaining this plate first, you will<br/>permanently lose it'<br/>Seller must acknowledge"]
L7 --> L8{Set minimum<br/>offer threshold?}
L8 -->|Yes| L9["Set reject below £X<br/>+ fee breakdown shown"]
L8 -->|No| L10[All offers forwarded]
L9 --> WCS_LIVE(["Plate visible as<br/>'owner may consider selling'"])
L10 --> WCS_LIVE
end
S8 --> L1
KD1["⚠️ DECIDE: Commission model<br/>Tiered %? Flat %? Flat fee + %?<br/>Seller-side or buyer-side?"]:::kd
L3 -.- KD1
KD2["⚠️ DECIDE: Auto thresholds<br/>Include at launch or keep<br/>manual-only for simplicity?"]:::kd
L4 -.- KD2
KD3["⚠️ DECIDE: No-minimum sellers<br/>Use valuation as soft floor<br/>e.g. block below 50% of estimate?"]:::kd
L10 -.- KD3
%% =============================================
%% 3a. WCS STALENESS MONITORING
%% =============================================
subgraph P3_STALE["3a — WCS staleness monitoring — background"]
direction TB
BG1(["Monthly VES API re-check<br/>all V5C-verified WCS plates"])
BG1 --> BG3["Re-query VES API<br/>for seller vehicle reg"]:::api
BG3 --> BG4{Compare to<br/>stored snapshot}
BG4 -->|All matches| BG5["✓ No change detected<br/>Listing remains active"]:::ok
BG4 -->|V5C date changed| BG6["⚠️ V5C reissued — possible<br/>address change or new keeper"]
BG4 -->|Different vehicle| BG7["🚨 Plate likely transferred<br/>to different vehicle"]
BG4 -->|Not found| BG8["🚨 Vehicle may be scrapped<br/>exported or plate retained"]
BG6 --> BG9["Listing PAUSED<br/>Seller prompted to re-confirm"]
BG7 --> BG9
BG8 --> BG9
BG9 --> BG10{Seller responds<br/>within 14 days?}
BG10 -->|Still on vehicle| BG11["Snapshot refreshed<br/>Listing reactivated"]
BG10 -->|Retained — has V778| BG12["Upload V778 — verification<br/>upgraded — listing reactivated"]
BG10 -->|No longer owns it| BG13["Listing permanently removed"]:::err
BG10 -->|No response| BG14["Listing hidden<br/>Further reminder at 28 days"]
BG_CERT(["V778 / V750 plates"]) --> BG_EXP{Certificate<br/>nearing expiry?}
BG_EXP -->|Within 6 months| BG_WARN["Seller notified to<br/>contact DVLA to renew"]
BG_EXP -->|OK| BG_FINE["✓ Certificate valid"]:::ok
BG_NUDGE(["6-month periodic nudge<br/>ALL WCS plates"]) --> BG_CONFIRM["'Do you still own REG?<br/>Confirm to keep listing active'"]
BG_CONFIRM --> BG_RESP{Response?}
BG_RESP -->|Confirmed| BG_ACTIVE["Listing active<br/>Timestamp updated"]
BG_RESP -->|No response 14d| BG_SOFT_HIDE["Listing flagged<br/>'not recently confirmed'<br/>🔹 MAYBE V2"]:::defer
end
WCS_LIVE --> BG1
WCS_LIVE --> BG_CERT
WCS_LIVE --> BG_NUDGE
KD_EXPIRY["⚠️ DECIDE: WCS listing expiry<br/>Auto-expire 12 months unless renewed?<br/>Or indefinite with nudges?"]:::kd
BG_NUDGE -.- KD_EXPIRY
KD_STALE_VIS["⚠️ DECIDE: Stale listing visibility<br/>Hide? Show with warning?<br/>Lower search ranking?"]:::kd
BG_SOFT_HIDE -.- KD_STALE_VIS
%% =============================================
%% 3b. BUYER DISCOVERY AND PRE-OFFER CHECK
%% =============================================
subgraph P3_BUYER["3b — Buyer discovery and pre-offer check"]
B1([Buyer finds plate<br/>search / browse / SEO])
B1 --> B2{Listing type?}
B2 -->|Active listing| B3{Buy now or<br/>make offer?}
B2 -->|WCS plate| B_OFFER[Make offer only]
B3 -->|Buy now| B4["Show total:<br/>Plate £5,000 + DVLA £80 = £5,080"]
B3 -->|Make offer| B_OFFER
B_OFFER --> B_INTENT{Buyer intent?}
B_INTENT -->|Assign to my vehicle| B_REG["Enter vehicle registration<br/>— single field"]
B_INTENT -->|"Hold on retention<br/>— no vehicle yet"| B_RET_INFO["Info shown:<br/>'Plate will be placed on a V778<br/>retention certificate in your name<br/>Valid 10 years — assign to a<br/>vehicle whenever you are ready'"]
B_REG --> B_API["Silent VES + MOT checks:<br/>• MOT valid?<br/>• Vehicle taxed?<br/>• Age-appropriate for plate?"]:::api
B_API --> B_CHECK{Issues found?}
B_CHECK -->|No issues| B_CLEAR["✓ Vehicle looks eligible"]:::ok
B_CHECK -->|Issues found| B_WARN_BUYER["Advisory warning shown<br/>with specific issue"]
B_WARN_BUYER --> B_ACK{Buyer acknowledges?}
B_ACK -->|Will resolve before transfer| B_CLEAR
B_ACK -->|Abandons| B_EXIT([Buyer exits])
B_RET_INFO --> B_CLEAR_RET["✓ No vehicle check needed<br/>Proceed to offer"]:::ok
end
LISTED --> B1
WCS_LIVE --> B1
KD_PRECHECK["⚠️ DECIDE: Pre-offer vehicle check<br/>Mandatory or advisory?<br/>Block or warn?<br/>Recommendation: advisory"]:::kd
B_WARN_BUYER -.- KD_PRECHECK
KD_BN_VEHICLE["⚠️ DECIDE: Buy-now vehicle check<br/>Require reg before payment?<br/>Or collect after?"]:::kd
B4 -.- KD_BN_VEHICLE
KD_BN_INTENT["⚠️ DECIDE: Buy-now retention<br/>Can buyer buy-now and hold<br/>on retention too? Or only<br/>via offer flow?"]:::kd
B4 -.- KD_BN_INTENT
%% =============================================
%% 4a. OFFER-TIME FRESHNESS CHECK (WCS ONLY)
%% =============================================
subgraph P4_FRESH["4a — Offer-time freshness check — WCS only"]
F1["Before offer forwarded<br/>to WCS seller:"]
F1 --> F2{Seller verified<br/>via V5C?}
F2 -->|Yes| F3["Fresh VES API check<br/>against stored snapshot"]:::api
F2 -->|V778 / V750| F5[Skip vehicle check]
F3 --> F4{Snapshot matches?}
F4 -->|Yes| F6["✓ Ownership looks current"]:::ok
F4 -->|Changes detected| F7["Offer HELD<br/>Seller must re-verify"]:::err
F7 --> F7R{Re-verifies?}
F7R -->|Yes| F6
F7R -->|Cannot verify| F7X["Offer cancelled — buyer notified<br/>Listing removed"]:::err
F5 --> F8
F6 --> F8
F8["Seller must confirm ownership:<br/>'Someone made an offer on REG —<br/>confirm you still own it<br/>to see offer details'"]
F8 --> F9{Seller confirms?}
F9 -->|Yes| F10([Offer forwarded to seller<br/>with full fee breakdown])
F9 -->|No response 72hr| F11["Offer expires<br/>Buyer notified"]:::err
end
B_CLEAR --> F1
B_CLEAR_RET --> F1
%% =============================================
%% 4b. OFFER AND NEGOTIATION
%% =============================================
subgraph P4_NEG["4b — Offer and negotiation"]
O1{Above seller minimum?}
O1 -->|No| O3["Blocked: minimum is £X<br/>— adjust to continue"]
O3 --> O1A[Buyer adjusts]
O1A --> O1
O1 -->|Yes or no minimum| O4{Auto-accept met?}
O4 -->|Yes| ACCEPTED([Offer accepted ✓])
O4 -->|No or not set| O5["Seller sees offer + breakdown:<br/>Offer — commission = net"]
O5 --> O6{Seller responds — 48hr}
O6 -->|Accept| ACCEPTED
O6 -->|Decline| O7[Buyer notified — can resubmit]
O6 -->|No response| O8[Offer expires]
O6 -->|"Counter 🔹 MAYBE V2"| O9["Counter sent to buyer<br/>with updated total<br/>🔹 MAYBE V2"]:::defer
O9 --> O10{Buyer responds — 48hr}
O10 -->|Accept| ACCEPTED
O10 -->|Decline| O11[Negotiation ends]
O10 -->|No response| O12[Counter expires]
end
F10 --> O1
B_CLEAR -->|Active listing offer| O1
B_CLEAR_RET -->|Active listing offer| O1
KD4["⚠️ DECIDE: Counter-offers<br/>Include in v1 or defer?<br/>V1 could be accept/decline only<br/>— much simpler flow"]:::kd
O9 -.- KD4
%% =============================================
%% 5. PAYMENT AND ESCROW
%% =============================================
subgraph P5["5 — Payment and escrow"]
P_PAY["Buyer card charged immediately<br/>Plate price + £80 DVLA fee<br/>Binding offer — agreed to pay if accepted"]
P_PAY --> P_ESC["Funds held in escrow<br/>via third-party provider"]:::esc
P_ESC --> P_NOT["Both parties notified:<br/>Seller: payment secured<br/>Buyer: funds held safely"]
P_NOT --> P_AUTH["Both sign agent authorisation:<br/>'I authorise Reggie to submit DVLA<br/>applications on my behalf'"]
end
B4 --> P_PAY
ACCEPTED --> P_PAY
KD5["⚠️ DECIDE: Escrow provider<br/>Stripe Connect? Mangopay?<br/>Trustshare? Affects fees + build"]:::kd
P_ESC -.- KD5
%% =============================================
%% 6. PRE-TRANSFER — SELLER SIDE
%% =============================================
subgraph P6_SELL["6a — Seller-side preparation"]
T1{Seller document type?}
T1 -->|V778 or V750| T5["Plate on certificate<br/>— ready to transfer"]
T1 -->|V5C — plate on vehicle| T2["Retention required first"]
T2 --> T3["Reggie submits retention<br/>to DVLA as agent — £80 fee"]:::dvl
T3 --> T4["DVLA processes retention:<br/>Online: instant update<br/>V778 by post: 2-4 weeks<br/>Vehicle gets replacement reg"]:::dvl
T4 --> T5
end
P_AUTH --> T1
KD6["⚠️ DECIDE: Retention £80 fee<br/>Who pays? Seller? Buyer?<br/>Reggie absorbs?"]:::kd
T3 -.- KD6
%% =============================================
%% 6b. PRE-TRANSFER — BUYER SIDE (FORKED)
%% =============================================
subgraph P6_BUY["6b — Buyer-side preparation"]
BUY_FORK{Buyer intent<br/>captured earlier}
BUY_FORK -->|Assign to vehicle| BV1["Collect full vehicle details:<br/>Reg, make, model, VIN<br/>Keeper name confirmation"]
BV1 --> BV2["Full eligibility verification:<br/>✓ MOT valid — DVSA API<br/>✓ Vehicle taxed — VES API<br/>✓ Age rule check<br/>✓ Not SORN over 5 years<br/>✓ Not marked for export"]:::ok
BV2 --> BV3{Vehicle eligible?}
BV3 -->|Yes| BV4(["✓ Ready for DVLA assignment"])
BV3 -->|No| BV5["Buyer notified with<br/>specific issue + guidance"]:::err
BV5 --> BV6{Resolved in 14 days?}
BV6 -->|Yes| BV2
BV6 -->|No| BV7["Transaction cancelled<br/>Escrow refunded"]:::err
BUY_FORK -->|Hold on retention| BR1["No vehicle checks needed<br/>Buyer confirms details:<br/>Full legal name for V778<br/>Contact address"]
BR1 --> BR2(["✓ Ready for retention transfer"])
end
T5 --> BUY_FORK
KD7["⚠️ DECIDE: Full buyer verification<br/>API + VIN only? Or V5C upload?<br/>Recommendation: API + VIN"]:::kd
BV2 -.- KD7
%% =============================================
%% 7. DVLA TRANSFER (FORKED BY INTENT)
%% =============================================
subgraph P7["7 — DVLA transfer"]
DA_FORK{Transfer type}
DA_FORK -->|Assign to vehicle| DA1{Online eligible?}
DA1 -->|Yes| DA2["Reggie submits online<br/>assignment via gov.uk"]:::dvl
DA1 -->|No| DA3["Reggie completes V317<br/>Option A — submits by post"]:::dvl
DA_FORK -->|Buyer retention| DB1["Seller nominates buyer as<br/>grantee on V778/V750<br/>OR Reggie submits transfer<br/>of certificate to buyer name"]:::dvl
DA2 --> D4["DVLA processing<br/>Online: instant system update<br/>Postal: 4-6 weeks"]:::dvl
DA3 --> D4
DB1 --> D4B["DVLA processes certificate<br/>transfer — buyer receives<br/>V778 in their name<br/>Valid for 10 years"]:::dvl
D4 --> D5["Status tracking:<br/>Auto-updates every 7-10 days"]
D4B --> D5
D5 --> D6{DVLA outcome}
D6 -->|Approved — assigned| D7A(["✓ Transfer confirmed<br/>Plate on buyer vehicle"]):::dvl
D6 -->|Approved — retention| D7B(["✓ Certificate issued<br/>V778 in buyer name"]):::dvl
D6 -->|Inspection required| D8["Inspection adds 2-4 weeks"]:::dvl
D8 --> D4
D6 -->|Rejected| D9["Review rejection"]:::err
D9 --> D10{Fixable?}
D10 -->|Yes| D11[Reggie corrects + resubmits]
D11 --> D4
D10 -->|No| D12["Transaction cancelled<br/>Full escrow refund"]:::err
end
BV4 --> DA_FORK
BR2 --> DA_FORK
%% =============================================
%% 8. COMPLETION AND PAYOUT
%% =============================================
subgraph P8["8 — Completion and payout"]
C1["DVLA confirmation received<br/>Dispute window opens"]
C1 --> C2{Dispute raised?}
C2 -->|No — window expires| C3["Escrow releases to seller:<br/>Plate price minus commission<br/>Payout to bank account"]:::esc
C2 -->|Yes| C4["Reggie ops reviews:<br/>Check DVLA records<br/>Contact both parties<br/>Review audit trail"]
C4 --> C5{Resolution}
C5 -->|Seller favour| C3
C5 -->|Buyer favour| C6["Escrow refunded to buyer"]:::err
C3 --> C7["SELLER COMPLETE ✓<br/>Payout received"]:::fin
C3 --> C8_FORK{Buyer transfer type?}
C8_FORK -->|Assigned to vehicle| C8A["BUYER NEXT STEPS:<br/>1. Order physical plates<br/> from RNPS supplier<br/>2. V5C arrives 4-6 weeks<br/>3. Update insurance provider<br/>4. Do NOT fit plates<br/> until V5C received"]
C8_FORK -->|Held on retention| C8B["BUYER NEXT STEPS:<br/>1. V778 arrives by post<br/>2. Valid for 10 years<br/>3. Assign to vehicle anytime<br/> via gov.uk or V317<br/>4. Nominate another person<br/> if desired<br/>5. Renew before expiry"]
C7 --> C9
C8A --> C9
C8B --> C9
C9["TRANSACTION ARCHIVED<br/>Full audit trail stored"]:::fin
end
D7A --> C1
D7B --> C1
KD8["⚠️ DECIDE: Release trigger<br/>DVLA confirmation + 72hr window?<br/>Verification method?<br/>Auto-release on timeout?"]:::kd
C1 -.- KD8
KD_DISPUTE["⚠️ DECIDE: Dispute process<br/>Valid grounds? Time limit?<br/>Evidence required? Arbitration?"]:::kd
C4 -.- KD_DISPUTE
KD_RETENTION_NEXT["⚠️ DECIDE: Buyer retention guidance<br/>Offer to manage future assignment?<br/>Portfolio tracking for bought plates?<br/>Renewal reminders?<br/>🔹 MAYBE V2"]:::kd
C8B -.- KD_RETENTION_NEXT
%% =============================================
%% POTENTIALLY DEFERRABLE — V2 CANDIDATES
%% =============================================
subgraph DEFER_LIST["🔹 Potentially deferrable to v2"]
direction LR
DF1["Auto-accept/decline<br/>thresholds"]:::defer
DF2["Stale listing visibility<br/>ranking logic"]:::defer
DF3["Counter-offers<br/>launch accept/decline only?"]:::defer
DF4["Certificate expiry<br/>monitoring"]:::defer
DF5["Buyer portfolio tracking<br/>for retention purchases"]:::defer
DF6["Automated OCR<br/>manual review for v1?"]:::defer
DF7["Physical plate<br/>supplier integration"]:::defer
DF8["RNPS partner<br/>referral system"]:::defer
end
%% =============================================
%% AUDIT TRAIL
%% =============================================
subgraph AUDIT["AUDIT TRAIL — captured throughout"]
direction LR
AU1["Verification:<br/>Documents + OCR scores<br/>VES snapshots<br/>Staleness checks<br/>Re-confirmations"]
AU2["Commercial:<br/>Offers + counters<br/>Timestamps + expiries<br/>Fee calculations<br/>Agent authorisations<br/>Dual agency disclosure<br/>Buyer intent recorded"]
AU3["Financial:<br/>Payment captures<br/>Escrow movements<br/>Commission deductions<br/>Payouts + refunds"]
AU4["DVLA:<br/>All submissions<br/>Assignments + retentions<br/>Confirmations + rejections<br/>V317 references<br/>Certificate transfers"]
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