Inspiration
Urgent-payment scams all work the same way: pressure. "It's me, I'm in trouble, please pay right now." The one step that defeats them is checking with the real person, and pressure is exactly what makes people skip it. Most tools in this space focus on detection: they score messages, monitor activity, or alert you after the money is gone. We wanted a checkpoint, not a watchdog, with no surveillance and no model deciding alone.
What it does
Pause builds that missing check into checkout:
- The payment waits. The senior records the exact purchase and approves it in PayPal. PayPal places a hold, so nothing is charged.
- The person asking answers. The person the message claims to be from sees that exact amount and merchant in their own account and answers yes, I asked for this or no. A "no" cancels the hold.
- A reviewer decides. They see the answer, the person's recent requests, an AI and rule-based reading of the message, and matching public scam patterns. Pause collects the money only if every check passes.
The senior starts the check, sees everything the reviewer sees, and can cancel at any time. Pause says a payment went through or was cancelled only after PayPal confirms it.
How we built it
- Backend: Go API and worker (payments, reconciliation, notifications), PostgreSQL, and a React + TypeScript web app.
- PayPal Sandbox: authorize, hold, void and capture are the core of the product, because the hold is what makes a verification window possible.
- AI as an advisor, never a decider: Gemini reads the message (with URLs, emails and phone numbers stripped) and flags four pressure signals. Every flag must quote the exact words it relied on, and flags with no matching quote are dropped. A flag can raise the reviewer's attention but never lower it, and no AI output can release money.
- Evidence: a small private TF-IDF classifier, Elasticsearch search over public scam patterns, and a "related requests" story such as \$40 → \$180 → \$900, which is 5× the previous request and \$1{,}120 in 7 days.
- Judge mode: a disposable household of three synthetic accounts, so anyone can play all three roles in one browser window.
- Deployment: Docker, Compose and Caddy (HTTPS), plus a 40-case executable safety catalog and race-detector runs.
Challenges we ran into
- Keeping money state honest. Holds, voids, captures and webhooks can disagree with what the UI thinks. We built durable jobs and reconciliation so "cancelled" is shown only after PayPal confirms it.
- Making AI trustworthy. Free-form model output is easy to over-trust. Forcing grounded quotes and making the model unable to lower scrutiny took iteration.
- Honest evaluation. On our synthetic validation split (80 messages, 136 signal labels), Gemini scored precision $0.992$, recall $0.941$ and $$F_1 = \frac{2PR}{P+R} \approx 0.966.$$ Its misses all came from API rate limits (HTTP 429), which we counted as misses. The data is synthetic and written by one author, so these are not real-world fraud rates.
- Respecting the person. We refused to lock an older adult's money or report to family behind their back. Request history is opt-in and deletable, and messages are never used for training.
What we learned
- Detection arrives after the pressure has landed. Changing when the payment completes works better than guessing better.
- An independent human answer about the exact payment is a stronger signal than any message score.
- AI is most useful when it helps people read a situation and is constrained so it can't decide one.
What's next
Public HTTPS hosting and acceptance testing, more merchants beyond the sandbox store, and wider language support beyond English.