01/ 26
Prologue

Janus · Automated Disputes

Money, quietly
leaking.

Every day, delivery platforms charge restaurants for orders that went wrong — and most of those charges are never challenged. This is the story of the machine that challenges them.

The story moves this way
01

The problem

The customer gets a refund.
The restaurant gets the bill.

When a delivery order goes wrong — a missing item, the wrong item, a quality complaint — DoorDash or Uber Eats refunds the customer and charges the restaurant for it. These are error charges. Many are wrong, exaggerated, or perfectly disputable.

But clawing the money back means logging into every platform's portal, finding every charge, and filing each dispute before a deadline — across dozens or hundreds of outlets. Nobody has the time.

So the money is silently written off.

Order gone wrong“Fries never arrived”
Missing item · charged to you
Order gone wrong“This isn’t what I ordered”
Wrong item · charged to you
Order gone wrong“Arrived cold”
Quality · charged to you
02

Enter Janus

An automated disputes engine that recovers that money at scale — safely.

In one line: it signs in like a human would, finds every disputable charge, decides which ones are actually worth fighting, files them with a human-sounding explanation and evidence, and tracks whether the money came back.

Access
Detect
Decide
File
Track
03
01Onboard — the handover

A business opts in, picks its platforms,
and four keys fall into place.

Encrypted at rest

A delegated login

Not their password — they never hand it over. The business invites an identity we mint into their portal, as a team member on their own account. We provision and run that account; its password is ours — generated by us, sealed with AES-256-GCM the moment it exists, never plaintext, never logged. Session cookies get the same treatment.

Makes login automatic

The code channels

One-time codes by email land in a dedicated alias inbox we mint — one real mailbox, a unique alias per account. Codes by SMS land on a dedicated phone number we assign per business. Both are read by machine — logins complete without a person watching an inbox or a phone.

Nothing moves without it

The invitation

The invitation itself is the authorization: the business admits our identity into their portal and switches the account on. Until both have happened, nothing is filed in their name.

Every outlet accounted for

The store mapping

Which of their outlets on each platform correspond to which real-world locations — joined on the platform's own restaurant ID, so every charge, tracked to the cent, lands against the right store.

04
02Access — through the front door

Janus signs into the portal.
The twist is the verification code.

Fully hands-off

Code arrives by email

Janus reads it automatically from the dedicated alias inbox and carries on — a timestamp guard rejects any code older than the login that asked for it. No human ever sees it.

Also fully hands-off

Code arrives by SMS

It lands on a dedicated number assigned to the business and is read automatically — the message's origin verified, the code matched to the login that asked for it by number and time, and spent exactly once. After the first success the device becomes trusted, and future logins are smooth.

The crucial nuance

Whether a login gets challenged is decided per account — does it have a phone or 2-step verification enrolled — not because the device is new. A brand-new machine can walk straight in on password alone, if the account has no 2FA.

05
03Detect — the sweep

Every order carrying an error charge, read and measured.

Janus scans the store's activity and pulls out each order that carries an error charge. For every one of them, it learns exactly three things — the three facts that make a dispute possible.

Fact oneIs it eligible?

Can this charge actually be disputed at all?

Fact twoHow much?

The money on the table for this charge.

Fact threeWhat's the deadline?

The last day a dispute will still be accepted.

Order · Tue 19:42error charge
Order · Tue 20:05
Order · Tue 20:31error charge
Order · Tue 21:14
Order · Wed 12:02error charge
Order · Wed 12:48
Order · Wed 13:22error charge
06
04Decide — the smart part

It does not dispute everything.
That's the point.

Every filing spends something scarce — on one platform, headroom under a tripwire; on the other, one of a handful of monthly slots. Volume is a trap either way.

expected value = amount × odds of winning

So Janus ranks every charge by expected value and files only the best. The odds are no guess — they come from a model trained on the store's own record: how many disputes are already in flight, how much budget is left, whether it's on a losing streak. Every verdict re-tunes it, and every month-end the win-rates are re-measured.

Overfile → the store loses the right to dispute at all
the cutoff
file
file
file
file

Charges ranked by expected value · file the best, not the most

Count the whole board

The odds are computed from the store's complete dispute history — including the ones the merchant filed by hand. Off a partial view, the model once promised a 93% win worth ~$104; rebuilt from the full record it read 15% and ~$10 — and the real outcome, zero for six, sat exactly where the honest model said it would.

07
05File — the submission

Written to sound human.
Reviewed before it's filed.

Each dispute goes in with a reason, evidence, and a short appeal written by a language model to read like a busy owner typed it — natural, direct, unpolished. It's drafted the moment a charge is detected, so a person can review it long before anything goes live — and a plain template stands in if the model ever falters.

Live filing · three switches, all off

Real submissions sit behind three independent switches — global, per-business, per-store — every one off by default. And there are no pretend filings: off means Janus scans and drafts but files nothing; on means a real submission or nothing at all.

Dispute · appealdrafted at detection

“We packed and sealed this order ourselves before handoff. Every item on the receipt was checked and included — the missing-item claim doesn’t match what left our kitchen. Happy to share the prep record for this order.”

📎 evidence attached reason: item was included

— written the moment the charge appeared, ready for human eyes before anything is filed.

08
06Track — the outcome

Every dispute is followed
until the money answers back.

Janus polls every filed dispute every few hours — and any pending one can be re-checked on demand. A win means money recovered — credited back to the restaurant. And then it reports, so the business sees exactly what came home.

Won

The charge is reversed. Money recovered, back to the restaurant.

Lost

The platform held its ground — and Janus's win-rate model just got smarter.

Pending

Still with the platform. Janus keeps checking until there's an answer.

09

The fork in the road

Two platforms,
two personalities.

The lifecycle is the same. The mechanics are not. Pick a door — you can switch or come back to this fork at any time.

or keep scrolling — the road runs through both

DoorDash track

Platform one

DoorDash
the two-step fortress.

A corporate-style sign-in, a captcha you never see, and no monthly quota — just a tripwire: file too fast, and a store loses the right to file at all. Here's how Janus works the red door.

Account-based 2FA Invisible captcha handshake 14-day filing window Tripwire, not a quota
DD
DoorDash · the door

The door

Who gets challenged?
The account decides. Not the device.

DoorDash runs a corporate-style sign-in. Many accounts get in on password alone. Others hit a 2-step verification wall. The difference isn't where you're logging in from — it's what the account has enrolled.

Account · no phone on file

Straight through

passwordsigned in

Even from a completely fresh browser — no history, no trust — password alone was enough.

Account · phone number on file

Pushed to the wall

password2-step: SMS codesigned in

The same flow, a different account — and the platform demanded a code by SMS.

And the browser never leaves

DoorDash screens every read and every write behind Cloudflare plus a rotating in-page key — a bare scripted request is turned away with an HTTP 418: “I'm a teapot.” So Janus lives inside a real, signed-in browser, re-discovers the key after every deploy, and alarms the moment it stops matching.

Both behaviors verified live
01
DoorDash · the code

When a code is needed

You can ask for email.
The account overrules you.

DoorDash decides the delivery channel — the account's own settings control it, and they override whatever you request. Ask for email, and an SMS-only account still gets SMS. So Janus reads back which channel the platform actually chose, and routes there.

Code by email

Read automatically

The code lands in the dedicated alias inbox and Janus lifts it out on its own. No hands, no waiting.

Code by SMS

Also read automatically

The code lands on a dedicated number assigned to the business, arrives over a signature-verified line, is matched to the very login that asked — right number, right moment — and is spent exactly once. No person watches a phone.

Five wrong codes and the account locks for 30 minutes. Janus treats every attempt as precious. Once verified, the device is trusted — and the wall stays down.

The only time a person is asked for anything: an SMS-only account that was never assigned a number — a setup gap, not a step in the flow.

02
DoorDash · the side door

A side door

The magic link —
charming, but not a way in.

DoorDash also offers a passwordless sign-in: click a link sent by email — good for about a day — and you're in. No password, no code.

The catch: it only works on devices DoorDash already trusts. It's a returning-user convenience — not a cold start. A brand-new machine still has to earn its way in through the front door first.
03
DoorDash · finding charges

Finding the charges

Fourteen days.
Then the door closes.

Same sweep as Uber Eats — but on harder ground. Every DoorDash read rides inside a warm, logged-in browser, carrying the invisible att-key pass. No shortcut over the wire.

01 · ListRead the transactions ledger, filtered to error charges — one call per store, merged into a single stream (last 30 days).
02 · Open eachPull the itemized detail for each charge — one at a time; two att-key reads at once trip DoorDash's rate limit.
03 · GateKeep only what's still fightable: eligible, and inside the 14-day window. Past the deadline is dropped before anything else.
04 · ConfirmA second, keyless call on a different host reads the charge's authoritative status — so a re-scan never re-files what's already in flight.
05 · RecordOne row — amount to the cent, per-item reason, day-14 deadline, status — idempotently stored, appeal drafted at ingest.
One error charge, as Janus sees it
Eligible to disputeyes Amount at stake$ ●●.●● Last day to disputeday 14
charge lands~14 days · deadline

And not every charge fights alike — missing-item claims win ~90%, wrong-item ~25%, quality barely 15% — which shapes what Janus files next.

04
DoorDash · pacing

The pace

No monthly quota.
A tripwire — and nobody says where.

File too fast and the whole store is locked out of disputing — high-value charges included. So Janus paces the way the internet paces an unknown pipe: grow gently while it holds, retreat hard the instant it trips — filings spaced 20–45 unpredictable minutes apart, never a machine-gun burst.

Open

Grow while it's quiet

Start at a burst of six. Every clean run earns two more, up to about twelve.

Throttled

Trip → halve

The moment a store trips the threshold: the burst is cut in half and everything holds for 3–4 days.

Frozen

Twice burned → a week off

Two blocks inside a fortnight and the store rests a full week. Patience is cheaper than a lockout.

Before each burst, a costless read asks whether the store may still dispute — a blocked write is never the first signal. And a charge running out of time — three days left, ten dollars or more — jumps the queue.

Store over dispute threshold — filing locked
05
DoorDash · filing

Filing — a two-step handshake

First, prove you're human.
Without a single click.

Before accepting a dispute, DoorDash demands proof of humanity — Cloudflare Turnstile, running in “managed” mode. On Janus's warm, logged-in browser it solves itself in the background: no image grid, no traffic lights, no puzzle at all.

1Declare intent

Ask DoorDash to open a dispute; it answers with a challenge, not a form.

2Face the gate

The invisible Turnstile challenge stands between Janus and the submit.

3Mint the token

It auto-solves mid-handshake, minting an ~800-character pass that lives barely five minutes.

4Submit

The dispute goes in: amount, per-item reason, the written appeal, evidence files.

Two calls. One captcha. No clicks.

And if the gate ever changes shape, Janus fails closed — no token, no submit, no guessing.

06
DoorDash · the verdict

The verdict

Three ways a red dispute
comes home.

Charge status: refunded

Won

The error charge is reversed — money recovered for the restaurant.

Charge status: denied

Lost

DoorDash upheld the charge. The outcome feeds the win-rate model.

Charge status: created

Pending

Filed and waiting. Janus keeps polling until it resolves.

Every outcome is surfaced back to the business — nothing disappears into the portal.

07
Uber Eats track

Platform two

Uber Eats
the fast lane.

A door where the server chooses your next step, a cold start that handles itself, and a filing flow with no captcha wall at all. The green track moves quicker.

Identifier-first sign-in Cold device → email code Single-step filing No captcha wall Monthly dispute budget
UE
Uber Eats · the door

The door

You type the email.
The server picks the next screen.

Uber Eats runs an identifier-first sign-in. You enter the email — and only then does the server decide what comes next: a password screen, or a one-time email code.

Step oneenter emailserver decides
Known deviceserver decidespasswordsigned in
Cold deviceserver decidesone-time email codesigned in
Why this is great news

A new, cold device typically triggers the email code — and Janus reads that code automatically from the shared alias inbox. So even the very first login on a brand-new machine is completely hands-off. And the sign-in is the only part that needs a browser at all — once the session exists, every read runs as plain, fast HTTP.

01
Uber Eats · finding charges

Finding the charges

Read the ledger,
surface the leaks.

One sweep, entirely over the wire — no browser needed past the front door. Janus walks the order ledger, opens every charged order, and turns each real error charge into one clean, reviewable row.

01 · ListPull the order ledger, filtered to charged orders only, over a rolling six-week window.
02 · Open eachFetch the full record for every flagged order — many at once, and one bad record never halts the sweep.
03 · Read statusEligibility and the dispute's own id ride inside the record. Eligible & unfiled → queued; the rest marked ineligible, with the reason.
04 · NormalizeCollapse it to one row — amount to the cent, item(s) hit, the customer's own words, the disputable total.
05 · De-dupeIdempotent write, keyed to the order — re-scanning never double-counts. The reviewer-ready appeal is drafted here, at ingest.
One order, as Janus records it
Order · workflow idstitched Issuemissing item Customer said“fries never came” Amount at stake$ ●●.●● Statusqueued
The quiet deadline

Uber Eats prints no deadline — but a dispute filed after the order's calendar month tends to be declined. Month-end is the real wall, so every row carries the month it belongs to.

02
Uber Eats · the budget

Spending the slots

Two or three slots a month —
and the biggest charge hasn't happened yet.

Spend the slots on day one and you can't bid on the $80 charge that lands on day twenty. So Janus holds a bar that only the exceptional clear early — and lets it fall as the month runs out. The lesson isn't “file early.” It's spend your few slots on the biggest charges the month will produce.

Early monthA high bar

A slot is spent only on a charge too big to gamble against the future.

Mid monthThe bar decays

Fewer days left means less future to protect — the threshold slides down daily.

Day ~26The flush

Whatever budget remains goes to the best charges still standing. No slot dies unused.

Month endRe-measure

Where was the wall, really? Each month's answer re-budgets the next.

It smooths to about two filings a day — and a win followed by two straight denials is read as the wall itself: stop, keep the powder dry, start fresh next month.

03
Uber Eats · filing

Filing

One action.
No wall in front of it.

Uber Eats is refreshingly direct: filing is a single “submit dispute” action carrying the reason, the same human-sounding appeal, and the evidence. No handshake, no challenge, no wall in front of it.

Submit dispute →

No captcha wall.
Nothing like DoorDash's handshake.

One honest footnote: this last mile is still being finalized — and the safety rule already covers it. Live filing stays off by default, and Janus never fakes a success: until the real submission is wired end-to-end, it files nothing, and says so.

04
Uber Eats · the verdict

The verdict

Same scoreboard,
same payoff.

Tracked to

Won

Money recovered — credited back to the restaurant.

Tracked to

Lost

Held by the platform — and fed back into the win-rate model.

Tracked to

Pending

Janus keeps polling until the answer lands.

Every status is followed through to a final answer, and every answer is reported back.

05

Under the hood

Built to run beside the product,
never in its way.

Its own engine roomAn isolated worker

Daily scheduled jobs on a dedicated worker with its own queue — so heavy browser automation never starves the product it serves.

One contractPluggable platforms

DoorDash and Uber Eats are interchangeable handlers behind a single contract. A third platform is an addition, not surgery.

Zero syncThe dashboard lights up free

Janus writes straight into the product's existing disputes dashboard. No copying, no syncing — recoveries simply appear where merchants already look.

And everything sensitive stays sealed

Credentials and session cookies are encrypted with AES-256-GCM at rest — keys never logged, never in an audit trail. Every filing job is idempotent: a retry can never file the same dispute twice, and a dispute never moves backwards.

10

The payoff

While you run the restaurant, Janus runs the claims.

On a quiet schedule, it logs in, scans, ranks, files the ones worth fighting, and banks the wins — turning a pile of ignored error charges into recovered revenue. Across every outlet. On both platforms. End to end, hands off — no one watching an inbox, no one relaying a code.

log inscanrankfilebank the winrepeat

The money was always yours.
Janus just goes and gets it back.