Muin is in private beta.Watch the public release announcement —talk to us.
Falaah Falaah AI

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.

TierThresholdBehavior
Auto-linkHigh confidenceMatched silently; receipt generated; no staff action required
FlaggedBorderlineSurfaces as a one-click confirm card; staff spends 2–3 seconds
SuggestionPossibleShows the proposed donor as a hint; staff can accept, reject, or search
Guest recordLow confidenceAuto-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

  1. Open the queue. The first Monday of the month. The queue shows 180 gifts for October across all rails.
  2. Scan the auto-link tier. Confirm the count looks right. No action required — these are already reconciled.
  3. Work the flagged tier. 13 rows. One click each to confirm the proposed donor. Total time: 60 seconds.
  4. Work the suggestion tier. 8 rows. Some accept the suggestion, some search for a different match, some create new donor records.
  5. Work the guest tier. 7 rows. Leave for later; the development director will follow up with the putative donors by email.
  6. 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

ShortcutAction
j / kNext / previous row
EnterAccept proposed match
rReject / search for different match
gCreate guest record
nAdd manual note
/Focus search

Troubleshooting

IssueCauseResolution
A Stripe charge did not appear in the queueWebhook delivery failureCheck Settings → Webhooks for failed deliveries; Muin retries automatically
Zelle rows not parsing from bank statementUnsupported bank formatUpload a sample statement via Support so the parser can be extended
Check OCR misread the amountPoor photo quality, unusual handwritingEdit the extracted amount inline; OCR feedback loop improves over time
Cash count does not match bank depositCounting error or deposit-slip discrepancyOpen the two-person count record; compare to deposit-slip photo; flag for manager review
Guest record created but staff recognizes the donorMatching signals were below thresholdClick Link to existing donor on the guest record; the system merges