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