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