Soft pre-check architecture diagrams
Mermaid · soft ≠ hard approval · volumes elsewhere are simulated
Full architecture prose

Soft pre-check + partner prefill

Same diagrams as the architecture markdown. Soft ranks invite and prefills apply; UW owns hard credit. Soft strong is not “approved for $X.”

1 · Systems and trust boundary

Soft pre-check ranks invite and hydrates apply. It does not mint a hard approval amount. UW and credit models own the hard decision after submit.

flowchart TB
  subgraph PartnerZone["Partner trust zone"]
    PApp["Partner app"]
    PData["Partner features and events"]
  end

  subgraph SoftZone["Kanmon soft layer - design assumption"]
    SoftSvc["Soft pre-check service"]
    Prefill["Prefill token store"]
  end

  subgraph HardZone["Kanmon hard credit - UW owns"]
    Apply["Kanmon apply"]
    SoftPull["Soft bureau pull on apply"]
    UW["UW and credit models"]
    Fund["Fund and service"]
  end

  PApp -->|"customer id plus context"| SoftSvc
  PData --> SoftSvc
  SoftSvc -->|"soft state plus prefill token"| PApp
  SoftSvc --> Prefill
  PApp -->|"open apply with token"| Apply
  Prefill --> Apply
  Apply --> SoftPull
  SoftPull --> UW
  UW --> Fund

  SoftSvc -.->|"does not set hard amount"| UW
    

2 · Who enters soft pre-check

Program eligibility decides who gets a soft check. Cash need decides when to nudge, not whether soft runs.

flowchart TD
  Start["Partner surface in financing program scope"] --> Prog{"Program eligible?"}
  Prog -->|no| Quiet["No soft UI or quiet unavailable"]
  Prog -->|yes| Run["Run soft pre-check for everyone in set"]
  Run --> NeedNote["Need cash is for timing only - not a soft gate"]
  NeedNote --> Soft{"Soft state?"}
  Soft -->|strong| Invite["Invite plus prefill path"]
  Soft -->|weak| Careful["Careful check CTA or quieter invite"]
  Soft -->|unavailable| Std["Invite without soft claim - more fields later"]
  Soft -->|exclude| Suppress["Suppress campaign - no eligibility promise"]
  Invite --> NoNeed{"Merchant needs financing now?"}
  Careful --> NoNeed
  NoNeed -->|yes| ApplyPath["Open apply with prefill"]
  NoNeed -->|no| Dismiss["Dismiss snooze or no-need - no shame"]
    

3 · Where soft plugs into the funnel

Bird 2 helps See and Start. Bird 1 shortens Apply via prefill. Offer and Fund stay on hard UW.

flowchart LR
  See["See"] --> Start["Start"]
  Start --> Apply["Apply"]
  Apply --> Submit["Submit"]
  Submit --> Offer["Offer"]
  Offer --> Fund["Fund"]

  SoftInv["Soft invite Bird 2"] -.-> See
  SoftInv -.-> Start
  Prefill["Prefill shorter form Bird 1"] -.-> Apply
  HardUW["Hard UW unchanged"] -.-> Offer
  HardUW -.-> Fund
    

4 · End-to-end sequence

Partner calls soft; soft returns state + token; apply still goes to UW for the hard path.

sequenceDiagram
  actor SMB as Merchant
  participant Partner as Partner app
  participant Soft as Soft pre-check service
  participant Apply as Kanmon apply
  participant UW as Underwriting

  SMB->>Partner: Works in product
  Partner->>Soft: SoftCheck with partner customer id and context
  Soft-->>Partner: Soft state plus prefill token
  alt Soft strong or weak
    Partner-->>SMB: Soft invite or quiet check CTA
    SMB->>Apply: Open apply with prefill token
    Apply-->>SMB: Prefill form
    SMB->>Apply: Finish and submit
    Apply->>UW: Hard decision path
    UW-->>Apply: Offer or decline
  else No need or not now
    Partner-->>SMB: Dismiss without shame
  else Soft exclude or data unavailable
    Partner-->>SMB: No soft claim or standard apply only
  end
    

5 · Data flow overview

Partner sends features and events, not a raw ledger. Soft returns coarse state, never hard score or approve amount.

flowchart LR
  subgraph In["Partner to Kanmon"]
    ID["Identity seed"]
    Perf["Performance features"]
    Obj["Object cash context"]
    Risk["Partner risk flags"]
    Cons["Consent"]
  end

  Soft["Soft pre-check service"]

  subgraph Out["Kanmon to partner"]
    State["Soft state codes"]
    Tok["Prefill token"]
    Evt["App lifecycle events"]
    Supp["Campaign suppress"]
  end

  ID --> Soft
  Perf --> Soft
  Obj --> Soft
  Risk --> Soft
  Cons --> Soft
  Soft --> State
  Soft --> Tok
  Soft --> Evt
  Soft --> Supp
    

6 · Product overview

Same soft contract; the trigger object and partner moment change by archetype.

flowchart TB
  Soft["Soft pre-check plus prefill"]

  Soft --> A["A Invoice EDI"]
  Soft --> B["B Wallet"]
  Soft --> C["C ERP PO"]
  Soft --> D["D Payments"]
  Soft --> E["E Staffing"]

  A --> ObjA["Object: unpaid invoice"]
  B --> HubB["Hub: Financing tab plus volume spike"]
  C --> ObjC["Object: PO or stock risk"]
  D --> VolD["Volume plus boarding flags"]
  E --> PayE["Payroll vs unpaid client invoice"]
    

A · Invoice / EDI

Object CTA on the unpaid invoice; dismiss leaves invoice work intact. Partner never shows approved advance $.

sequenceDiagram
  actor SMB as Supplier ops
  participant Cleo as Invoice EDI partner
  participant Soft as Soft pre-check
  participant Apply as Kanmon apply
  participant UW as Underwriting

  SMB->>Cleo: Open unpaid invoice
  Cleo->>Soft: SoftCheck with invoice context
  Soft-->>Cleo: Soft state plus prefill token
  alt Soft strong or weak
    Cleo-->>SMB: Finance CTA on this invoice
    SMB->>Apply: Start with prefill
    Apply-->>SMB: Entity and invoice prefilled
    SMB->>Apply: Submit
    Apply->>UW: Hard path
    UW-->>Apply: Offer or decline
  else No need for this invoice
    Cleo-->>SMB: Dismiss - invoice work continues
  end
    

B · Wallet

Financing tab or volume-spike moment; AP vs term picked after soft invite. Cooldown if they leave.

sequenceDiagram
  actor Seller as Seller
  participant PP as Wallet partner
  participant Soft as Soft pre-check
  participant Apply as Kanmon apply
  participant UW as Underwriting

  Seller->>PP: Open Financing or hit volume spike
  PP->>Soft: SoftCheck with wallet tenure and volume
  Soft-->>PP: Soft state plus prefill token
  alt Soft strong or weak
    PP-->>Seller: Check if you qualify CTA
    Seller->>Apply: Start with KYC seed prefill
    Note over Apply: Product pick AP vs term after soft invite
    Seller->>Apply: Submit
    Apply->>UW: Hard path
    UW-->>Apply: Offer or decline
  else Not now
    PP-->>Seller: Leave Financing - cooldown on campaign
  end
    

C · ERP / PO

PO-tied soft invite into Capital hub. Soft UI must not imply stacking products.

flowchart LR
  PO["PO approved or stock risk"] --> Soft["Soft pre-check"]
  Soft --> Hub["Capital hub CTA on that PO"]
  Soft --> Skip["Not now"]
  Hub --> Prefill["Prefill entity plus PO"]
  Prefill --> Submit["Submit"]
  Submit --> UW["Hard UW"]
  UW --> Fund["Fund AP"]
    

D · Payments processor

Volume + boarding features; chargeback or reserve → soft exclude. Less object-tied than invoice/PO.

flowchart TD
  Board["Boarding complete"] --> Soft["Soft pre-check"]
  Vol["Rolling volume features"] --> Soft
  CB["Chargeback or reserve flag"] --> Soft
  Soft -->|exclude| Quiet["No soft claim"]
  Soft -->|strong or weak| CTA["Hub CTA - less object-tied"]
  Soft -->|unavailable| Std["Standard apply only"]
  CTA --> Prefill["Prefill entity plus volume context"]
  Prefill --> UW["Submit then hard UW"]
    

E · Staffing

Soft still runs in program scope during quiet weeks; dismiss is normal when there is no cash pressure.

sequenceDiagram
  actor Agency as Staffing agency
  participant Vert as Staffing partner
  participant Soft as Soft pre-check
  participant Apply as Kanmon apply
  participant UW as Underwriting

  Note over Vert,Soft: Soft still runs if in program scope - even in quiet weeks
  Vert->>Soft: SoftCheck with unpaid client invoice and payroll calendar
  Soft-->>Vert: Soft state plus prefill token
  alt Soft strong or weak and cash pressure
    Vert-->>Agency: Bridge payroll CTA
    Agency->>Apply: Prefill employer entity
    Agency->>Apply: Submit
    Apply->>UW: Hard path
  else Quiet week - no need
    Vert-->>Agency: Dismiss is normal
  end