Donation Reconciliation
Multi-rail donation reconciliation — card, NFC, Zelle, check, ACH, and cash — with AI-assisted matching, confidence tiers, auto-receipts, and full audit trail.
The Reconciliation Command Center is where every gift across every donation rail meets every donor record. Card transactions from Stripe, NFC taps from Muin kiosks (QuickPay and other kiosk modes), Zelle and ACH rows from your bank statement import, photographed checks from Muin Go, and cash counts from services — all in one review queue with one set of confidence tiers and one audit trail.
The short version
- Six rails, one queue. Card, NFC, Zelle, check, ACH, cash.
- Four confidence tiers. Auto-link (high), flagged (borderline one-click confirm), suggestion (possible match), guest record (low).
- Continuous close. Gifts reconcile at the moment of capture — not at month-end.
- Full audit trail. Every match, override, and correction logged with who, when, and confidence score.
Accessing the Command Center
Navigate to Nonprofit → Donations → Reconciliation. The default view is the review queue sorted by needs-your-attention first: flagged rows (borderline confidence), guest records (low confidence), and rail exceptions.
The top of the page shows:
- Period selector — current month by default; change to any prior period
- Rail filter chips — toggle card / NFC / Zelle / check / ACH / cash
- Confidence filter — show only auto-linked, flagged, suggestion, or guest
- Campaign filter — narrow to a single campaign or fund
The four confidence tiers
Every row that enters the queue gets a confidence score based on matching signals — name similarity, email / phone match, amount pattern against donor history, memo substring, pledge alignment, and temporal proximity.
| Tier | Threshold | Behavior |
|---|---|---|
| Auto-link | High confidence | Matched silently; receipt generated; no staff action required |
| Flagged | Borderline | Surfaces as a one-click confirm card; staff spends 2–3 seconds |
| Suggestion | Possible | Shows the proposed donor as a hint; staff can accept, reject, or search |
| Guest record | Low confidence | Auto-creates a guest Person record; gift posts to the guest; staff resolves identity later |
Auto-link and guest-record rows do not block the books — the ledger posts immediately. Flagged and suggestion tiers post after confirmation.
Reconciliation per rail
Card (Stripe)
Card and wallet transactions (Apple Pay, Google Pay) land via Stripe webhook at the moment of charge. The cardholder’s typed name, email, and campaign selection provide high-confidence matching signals.
Fee-covering: if the donor chose to cover the processing fee, the Stripe payout is larger than the donor’s intent. Muin posts two ledger entries — the gift amount to the fund, the fee reimbursement as a separate row — so restricted-fund accounting stays correct.
Recurring failures: when a recurring charge fails (expired card, insufficient funds), Muin fires a donor-facing email with a magic-link to update payment + a staff review task.
NFC / Tap-to-Pay
Muin kiosks (QuickPay single-tap, payment-kiosk multi-amount, and other modes) and iPhone Tap-to-Pay all feed the same Stripe pipeline. Non-QuickPay kiosks optionally prompt for a donor phone or email; when provided, matching is high-confidence against existing Person records. When not provided, the gift posts to a guest record pending identity resolution. QuickPay’s single-tap flow intentionally skips the prompt to stay at three-second speed — identity is resolved later if needed.
Zelle
Zelle rows come in via bank-statement import. The donor’s bank nickname controls the memo string, so the same donor may appear as “JOHN SMITH,” “J SMITH,” or “JOHN A SMITH.” Muin’s fuzzy matcher scores name similarity, amount pattern, and frequency pattern together.
Common workflow: upload the monthly bank statement CSV → Muin parses Zelle rows → the queue shows each row with a proposed match → staff reviews flagged rows.
Check
Checks are captured via photo in Muin Go at intake. OCR extracts check number, amount, payor name, memo, and date. The extracted fields land in the reconciliation queue with the same confidence tiers.
When the physical deposit clears the bank, Muin reconciles the deposit against the sum of photographed checks — flagging any missing check that was photographed but not deposited (sitting in someone’s desk).
ACH / Wire
ACH through Stripe: webhook fires with full identity. ACH from bank statement: temporal matching — the row is compared against open pledges, recent invoices, or donor history within the 5-business-day clearing window.
Cash
Cash flow is first-class. Staff enters a two-person verified count at the end of a service or event, photographs the deposit slip, and Muin reconciles the count against the deposit when it clears. Discrepancies surface on the same review screen.
Workflow — a typical review session
- Open the queue. The first Monday of the month. The queue shows 180 gifts for October across all rails.
- Scan the auto-link tier. Confirm the count looks right. No action required — these are already reconciled.
- Work the flagged tier. 13 rows. One click each to confirm the proposed donor. Total time: 60 seconds.
- Work the suggestion tier. 8 rows. Some accept the suggestion, some search for a different match, some create new donor records.
- Work the guest tier. 7 rows. Leave for later; the development director will follow up with the putative donors by email.
- Close the period. Click Close October. The books are closed. Unresolved guest records stay open — they don’t block close.
Total time: about 15 minutes per 200 gifts, down from several days.
Audit trail and exports
Every match, override, dismissal, and manual correction writes an audit log entry with:
- User who performed the action
- Timestamp
- Before/after state
- Confidence score at time of action
- Reason (if manually provided)
Exports available:
- Reconciliation journal — CSV of every match decision for the period, suitable for auditor review
- 990 donor list — aggregate giving per donor, filtered by tax year
- Fund ledger — per-fund contributions with rail breakdown
Keyboard shortcuts
| Shortcut | Action |
|---|---|
j / k | Next / previous row |
Enter | Accept proposed match |
r | Reject / search for different match |
g | Create guest record |
n | Add manual note |
/ | Focus search |
Troubleshooting
| Issue | Cause | Resolution |
|---|---|---|
| A Stripe charge did not appear in the queue | Webhook delivery failure | Check Settings → Webhooks for failed deliveries; Muin retries automatically |
| Zelle rows not parsing from bank statement | Unsupported bank format | Upload a sample statement via Support so the parser can be extended |
| Check OCR misread the amount | Poor photo quality, unusual handwriting | Edit the extracted amount inline; OCR feedback loop improves over time |
| Cash count does not match bank deposit | Counting error or deposit-slip discrepancy | Open the two-person count record; compare to deposit-slip photo; flag for manager review |
| Guest record created but staff recognizes the donor | Matching signals were below threshold | Click Link to existing donor on the guest record; the system merges |
Related
- Donation Intents — pre-gift pledge and post-gift claim flows
- Muin Go Check Capture — mobile check-capture setup and guidance
- Donor Portal — donor-facing self-service
- Product page: /platform/reconciliation — marketing overview of the capability
- Guide: How to reconcile 500+ donations without a spreadsheet
- Guide: 4 donation rails, 1 reconciliation dashboard