Recover lost revenue from failed payments
The agent observes failed payments, checks them for fraud with two signals, diagnoses each failure, scores how likely it is to be recovered, drafts the outreach and sends it. Prioritized by the rupees you can win back.
Live pipeline
waiting for trafficLive activity
Where failed payments went
Recovery plan
Drop a failed-payments CSV. Each row is checked by the card-testing detector and (if linked) the graph model, diagnosed, scored, and ranked by expected rupees recovered.
graph_node_id links a payment to a node in the graph model. The sample files include it as a demo link: card payments have no real node in a Bitcoin graph. Rows without it show "no graph link", and no graph signal is applied.Graph model signal
Why payments failed
Recovery plan
| Customer | Amount | Why it failed | Recover? | Likelihood | Expected | Fraud signals |
|---|
Live
Failures arriving from Stripe webhooks (and simulated traffic) run through the same pipeline: fraud check first, then diagnosis and scoring.
Live failures
charge.failed events...metadata.graph_node_id are linked to a random test-period graph node (a labeled demo link) so the graph signal is visible. Set GRAPH_DEMO_ILLICIT_PCT to change how many demo links point at illicit nodes (default 25; real prevalence is far lower).Graph risk of recent live events
Payment router (SmartRoute)
| Node | Amount | Risk | Fraud check | Payment | Recover agent |
|---|
make psps and the fraud service. Customers are made up (@example.com is never emailed). Gateways are mock PSPs.Fraud model
The second fraud signal: a 2-layer graph neural network (GCN) trained on the real Elliptic Bitcoin transaction graph.
graph_node_id) or by a labeled demo link, so a payment's graph score is a demonstration of the pattern, not a claim about that customer.Status
Score a graph node
Neighbourhood (1-2 hops)
Where the model puts each class
Precision vs recall
GCN vs baseline
Model report card
| Model | Features | ROC-AUC | PR-AUC | F1 (illicit) |
|---|
ROC-AUC says how well the model ranks a bad transaction above a good one (0.5 = coin flip, 1.0 = perfect). It is not accuracy. The graph's clear gain is PR-AUC (precision among the top-ranked); on ROC-AUC the GCN and the baseline are close.
Benchmark
Measured, reproducible proof of value, plus the graph model's own test metrics.
Proven results measured
Graph model test metrics
Elliptic Bitcoinfraud/artifacts/results.json. These are fraud-detection metrics on a different dataset; the benchmark on the left does not use the graph model, and its table is unchanged.| Model | ROC-AUC | PR-AUC | F1 |
|---|
Drop-in API
Wire Recover into any stack in two minutes. No dashboard needed.
Drop-in integration
/webhooks/stripe and set AUTO_RECOVER=true. Failures recover themselves; quarantined payments are skipped.Or call the API directly from your code:
curl -X POST /api/recover -d '{
"charge_id":"ch_1","customer_email":"a@b.com","amount":49900,
"currency":"INR","failure_code":"insufficient_funds",
"graph_node_id":136279,"send":true
}'
Returns the diagnosis, recovery probability, the drafted message, and, with send:true, sends it. graph_node_id is optional. New response fields: graph_risk, graph_status, fraud_signals, quarantined. A quarantined payment is never sent.
Try it
Response appears here.