ReconcileKitReconcileKit
get pro →

// financial reconciliation for laravel · open-source core

10,000 payments.
33 problems.
Every one explained.

ReconcileKit matches your payments table against your provider's settlements. It finds missing payments, duplicates, fee differences and late settlements, and points to the exact records behind each one.

~/app $ {{ h.typed }}█ ● {{ h.status }}
source: internal-paymentsrulestarget: stripe-settlements
{{ r.lRef }}{{ r.lAmt }}
{{ r.tag }}
{{ r.rRef }}{{ r.rAmt }}
progress{{ h.bar }}{{ h.processed }}/10,000 · {{ h.provProcessed }}/9,995
matched
{{ h.matched }}
discrepancies
{{ h.discTotal }}
■ {{ x.type }}{{ x.count }}
✓ run stored · immutable

Counts and totals are the real output of the seeded demo. The scrolling rows are a sample.

// 01 the problem

Your books say one thing. Stripe says another.

The demo reconciles 10,000 internal payments for September 2026 against a Stripe settlement export. The totals are $215.61 apart, and the total alone can't tell you why.

your_db.totalUSD {{ led.db }}
stripe.totalUSD {{ led.prov }}
Δ difference{{ led.diff }}
9,974 of 10,000 matched exactly · 33 discrepancies by type

$ php artisan reconcile-demo:run

{{ c.count }}
{{ c.type }} [{{ c.sev }}]{{ c.meaning }}

Fixed seed: identical numbers on every run.

// 02 built to be trusted with money

No guessing. No floats. No AI deciding whether money matches.

The dashboard, fee-adjusted and grouped matching, balance reconciliation and notifications are part of Pro. Core is complete on its own.

{{ f.n }}{{ f.tag }}

{{ f.t }}

{{ f.d }}

// 03 the definition

Describe both sides and the rules once.

One class says where your records and the provider's records come from, and which rules decide that two records are the same payment.

app/Reconciliation/StripePaymentsReconciliation.php
{{ ln.n }}{{ sg.t }}
$ php artisan reconcile:run stripe-payments --from=2026-09-01 --to=2026-10-01

Run it from Artisan, the scheduler, a queue or your own code. The quick start builds the same reconciliation against your own table and CSV in about ten minutes.

// 04 pro dashboard

Close every discrepancy with a reason on record.

Inspect runs, resolve, ignore and reopen discrepancies, export to CSV. Every action is a new row in the audit trail, never an edit.

runs / stripe-payments / #418 · 2026-09-01 → 2026-10-01 {{ d.open }} open{{ d.closed }} closedexport csv
typereferenceamountstatus
{{ r.type }}{{ r.ref }}{{ r.amt }}{{ r.status }}
+ 27 more · filter: all types · sort: severity
{{ d.sel.type }}{{ d.sel.meaning }}
source · internal-payments
{{ d.sel.src1 }}
{{ d.sel.src2 }}
{{ d.sel.src3 }}
target · stripe-settlements
{{ d.sel.tgt1 }}
{{ d.sel.tgt2 }}
{{ d.sel.tgt3 }}
resolve ignore reopen
{{ d.note }}▍
save
audit trail
{{ au.what }}
{{ au.meta }}
select a discrepancy
{{ d.caption }}

// 05 see it run

Run the demo on your machine in under ten minutes.

You need PHP 8.3+ and Composer. No database server, no Node, no API keys.

step-by-step instructions on github ↗
terminal
$ {{ tl.text }}{{ tl.comment }}█ ✓
internal
10,000
provider
9,995
matched
9,974
discrepancies
33

// 06 pricing

Start free. Buy Pro when your team needs the dashboard.

{{ p.name }}

recommended
{{ p.price }}
{{ p.period }}

{{ p.tagline }}

+{{ f }}
{{ p.cta }}
Want to buy ReconcileKit?Send your purchase request and preferred plan to skhammari@gmail.com. We’ll reply with the next steps.

// 07 implementation help

Reconciliation inside an existing Laravel system?

Tell us about your providers and your settlement process. We reply by email, usually within one business day.

For purchases or implementation help, email us with your preferred plan and project details.

skhammari@gmail.com →