DisputeShield.
A script tag, and the clock starts.

DisputeShield gives your customers a dispute-filing interface and your compliance team an SLA-tracked, immutably audited case system — without you building a ticketing product. One script tag, one server-side call to mint a session token. No database changes.

There is no clock.

Nobody knows which complaint is closest to breaching until it has already breached.

The problem

Complaint handling in fintech is regulated: mandated acknowledgement and resolution windows, mandated record-keeping, and a supervisory expectation that you can produce evidence of exactly how a complaint was handled and when. In practice complaints arrive by email, chat, WhatsApp and phone into a shared inbox; transaction context is not attached, so an agent asks an engineer and waits hours; the audit trail is whatever the email thread happens to contain, and every message in it is editable and deletable.

What it is not

DisputeShield never moves money.

It records an outcome, including a refund amount, and it has no code path to a payment. That is a permanent scope decision, not a v1 limitation, and it is enforced with a call-graph test — because the credibility of an evidence system depends on it having no ability to act on the thing it holds evidence about.

It holds no card data. The SDK strips it at source and the server independently rejects any payload containing a 13–19 digit string that passes a Luhn check. PCI-DSS is out of scope by design, and the claim holds because it is enforced rather than asserted.

It is not an omnichannel helpdesk. The moment it handles “where is my card?” it competes with Zendesk on Zendesk’s terms and loses the regulated-dispute focus that is the entire argument.

How it works

Your appone script tag
Sandboxed iframe~4KB loader
Widget APIsession-scoped
Postgrescases + evidence
SLA enginethe clock
Exportregulator-ready

The widget runs cross-origin and sandboxed, and the publishable key can read nothing.

Seeing it

the case lifecycle, and the clock that runs through it
  submitted            customer files via the widget
    → acknowledged     automatic — the ack clock stops here

  investigating        transaction context already attached
    ⚠ sla_warning      fired BEFORE the breach, not after

  resolved             outcome recorded, refund amount noted
                       — and no code path to a payment
  every transition hash-chained, append-only, exportable

In practice

BeforeWith DisputeShield
Standing up regulated dispute handling3–6 engineer-months30 minutes
SLA breaches per monthunmeasuredmeasured, alerted before breach
Median time to first responsehours to daysminutes — acknowledgement is automatic
Producing a regulatory evidence packdaysone export
Agent time gathering context~40% of handling timenear zero — attached at filing

Decisions that shaped it

Every pause carries a reason

A pausable clock is an abusable clock. The resolution clock does stop while you are legitimately waiting on the customer — and every pause requires a reason, writes an audit record, and is reported as a pause-duration metric by agent.

Sandboxed, cross-origin widget

The iframe cannot reach the host page, and the publishable key can read nothing — every data operation needs a session token your own backend mints, scoped to exactly one customer.

Append-only evidence ADR-0003

Hash-chained on the write path, immutability enforced by database trigger. An admin cannot quietly edit history.

Warned before breach

The alert fires while there is still time to act. An alert after the breach is a report, not a control.

No path to money

Enforced by a call-graph test, not by convention. An evidence system that can act on its own subject is not evidence.

Regulator-ready export

One command produces the pack, rather than assembling it by hand under time pressure after the request arrives.

Getting started

Run it
make up && make hello
Embed it
<script src="https://your-host/loader.js"></script>
<script>DisputeShield.init({ publishableKey: "pk_live_…", sessionToken })</script>