River
Y CombinatorBacked by Y Combinator
FREE TEMPLATE

Nonprofit Donation Reconciliation Template

Three documents and three sheets that bridge one month's giving across the processor, the CRM and the bank until both residuals read zero.

Free download  ·  No account needed

Every reconciliation guide starts the same way. Export the processor report, export the CRM gifts, compare the totals, investigate the difference. It works until you try it, because the three systems are not reporting the same thing. The processor reports what donors authorised. The bank reports what settled after fees, on the day it landed. The CRM reports what somebody keyed. Three correct answers to three different questions, and subtracting two of them produces a number with no meaning.

So this pack does not chase a match. It builds two signed bridges and drives each residual to zero. The first walks the bank's deposits back to the processor's charges, carrying fees, refunds, disputes and the two in-transit ends almost nobody carries. The second walks those charges to the CRM's gift rows. Every term is a countable set of transactions you can click into rather than a line labelled timing with nothing behind it, and the whole thing is deposit-first because one bank line is a batch and not a gift.

In the worked example a December file reports $86,686.40 at the processor, $70,788.41 at the bank and $90,615.40 in the CRM, on a row count that matches the charge count exactly. Both bridges close to the cent. What falls out includes four donors who gave $197.05 and hold no gift record, so no acknowledgment and no place in next year's segmentation, plus $2,071.34 of fees that belong in fundraising expense rather than netted away against revenue.

What a two-way tie-out cannot see

Deposit blocks decomposed, both bridges closed, and every leftover typed with an owner against it.

Three-way Reconciliation

Illustrative, for a fictional food collective called Pinemarket. December 2025, 598 charges across two processors, 43 bank deposit lines, 598 CRM gift rows. Deposit-first: one block per bank line, decomposed into the transactions that settled inside it, residual against the bank line. Every figure is a sum over the same transaction file.

Six of the 43 deposit blocks

Bank lineAmountTxnsCharges grossFeesReversalsResidualCharge days in the batch
2025-12-02 stripe$1,492.0526$1,533.59$41.54$0.003 days, 28 to 30 Nov
2025-12-04 stripe$740.088$810.00$19.92-$50.00$0.001 day. Refund reverses a charge deposited 28 Nov
2025-12-23 stripe$9,054.2336$9,388.84$217.05-$117.56$0.003 days, 19 to 21 Dec. Largest line in the month
2025-12-26 stripe$3,062.6222$3,131.34$68.72$0.002 days, 22 to 23 Dec
2025-12-30 paypal$1,183.289$1,209.24$25.96$0.001 day, 26 Dec
2025-12-31 stripe$4,102.0531$4,190.79$88.74$0.002 days, 26 to 29 Dec
All 43 December lines$70,788.41571$72,802.16$1,798.32-$215.43$0.00Every line closes to the cent

These batches are not December's gifts, which is exactly what the bridge below resolves. The 23 December line is worth reading twice: 35 charges created across three days, plus one dispute that reverses a $102.56 charge created on 7 December whose own money was deposited on 9 December. That line is short by $117.56 that arrived fourteen days earlier in a different deposit, so no gift-level match against this batch can ever account for it.

Bridge 1, the bank against the processor

TermCountAmountWhat the set is
Charges created in December, gross598$86,686.40Contribution revenue. Keys to the donor's own gift date
less processor fees on those charges598-$2,071.34Fundraising expense, not a reduction of revenue
less December charges settling in January98-$15,665.22Closing in transit. The largest term after fees
plus November charges settling in December44$3,625.32Opening in transit. Landed inside December's statement
plus refunds settled in December15-$1,554.19At their own settlement dates, not the dates they reverse
plus disputes settled in December2-$232.56Including the dispute fees
Expected December deposits$70,788.41Sum of the terms above
Actual December deposits, per the bank43$70,788.41Total of the 43 blocks
Residual$0.00Every term is a countable set, never a plug

The two in-transit terms are the ones almost nobody carries, and they are the whole difference. All 98 of the closing charges were created on 30 and 31 December, so their deposits land on 1 and 2 January. A card contribution is dated to the day the charge is made, so those 98 donors are owed a 2025 acknowledgment for money the bank shows in 2026. Carrying neither end understates December revenue by $12,039.90 on timing alone and puts 98 receipts in the wrong tax year.

Exception Register

Bridge 2 walks the CRM to the processor, and the terms are the output rather than the total. The CRM row count matches the charge count exactly at 598, which is the coincidence that makes everyone confident and is worth nothing. Every leftover is typed, priced and assigned.

Bridge 2, the CRM against the processor

TermCountAmountKind
CRM gifts dated December, gross598$90,615.40What the development report says
plus charges with no CRM gift at all4$197.05Money arrived, nobody recorded it
less duplicate CRM rows for one charge2-$200.00Two receipts for one gift
plus donor-covered fee held off the gift98$381.40One configuration setting, not 98 errors
plus refunds not reversed in the CRM3-$807.45Refunded at the processor, still a gift
less CRM rows with no charge behind them2-$3,500.00Pledges keyed as gifts
Processor charges created in December, gross598$86,686.40Residual $0.00

The four rows that are not bookkeeping

ChargeCreatedGrossDeposit landedCRM giftAcknowledgmentOwner
ch_003152025-12-22$35.002025-12-24nonenoneDevelopment, this week
ch_004242025-12-27$10.532025-12-30nonenoneDevelopment, this week
ch_005582025-12-30$100.002026-01-01nonenoneDevelopment, this week
ch_006402025-12-31$51.522026-01-02nonenoneDevelopment, this week
Total$197.054 donors0.23% of the month

This is the category that needs the third system. The money arrived, it settled, and every deposit line it settled in reconciles to the cent, so a CRM-to-bank comparison cannot see it. The CRM's total is $3,929.00 higher than the processor's, so a variance check on the totals points the wrong way entirely, and $197.05 in an $86,686.40 month is under any materiality threshold a finance-led reconciliation would set. Two of the four settled in January, which makes them invisible from both ends at once.

Everything the bridge left, typed and owned

TypeCountAmountFixOwnerDue
Charge with no CRM gift4$197.05Create the gift at the charge date, then acknowledgeDevelopmentThis week
Duplicate CRM row2$200.00Delete the second row, check if a receipt already wentDatabaseBefore receipts
Refund not reversed in the CRM3$807.45Reverse against the original gift, reissue the receiptDatabaseThis week
CRM row with no charge2$3,500.00Move to the pledge table. Not December revenueFinanceBefore close
Individual errors to fix11$4,704.50
Donor-covered fee held off the gift98$381.40Decide the policy once, configure one system to matchFinance and DevelopmentPolicy

The 98 covered-fee rows are held separately on purpose. Pinemarket's CRM records the donor's chosen amount rather than the amount charged, so the same gifts read $15,680.00 in the CRM and $16,061.40 at the processor. Working those one at a time treats a setting as 98 mistakes and they all come back next month. The largest number on this list is an accounting error worth 4.0% of the month and the smallest is four people, and the register carries both.

Fee Analysis

The same 598 December charges, grouped by gift size. Pinemarket is contracted at 2.20% plus $0.30 on one processor and 1.99% plus $0.49 on the other, which are this organisation's own rates rather than anybody's published price. The percentage component is identical in every row below.

Gift sizeChargesShare of countGrossShare of grossFeesEffective rateFixed part of the fee
under $156310.5%$636.000.7%$34.405.41%60%
$15 to $3012020.1%$2,707.563.1%$99.333.67%41%
$30 to $7514023.4%$6,641.177.7%$191.792.89%26%
$75 to $20018931.6%$19,702.6122.7%$489.102.48%13%
$200 to $6006210.4%$19,296.7822.3%$437.892.27%5%
over $600244.0%$37,702.2843.5%$818.832.17%1%
All December charges598100.0%$86,686.40100.0%$2,071.342.39%10%

One blended rate of 2.39% is an average of two populations and describes neither. 183 charges under $30 are 30.6% of the count and 3.9% of the gross, and they carry 4.00% against 2.20% on gifts of $200 and up, on the same contract. The spread is the fixed per-transaction component and nothing else.

The comparison a programme decision actually needs

The same $120 to the food programmeChargesFee eachFees a yearEffective rate
$10 monthly, twelve times12$0.52$6.245.20%
$120 once a year1$2.94$2.942.45%
Difference$3.302.12 times the rate

The recurring gift is usually still the better one on retention, and that is exactly the argument this table lets you have with a number in it rather than an impression. What it cannot be is invisible: at Pinemarket's volume the monthly programme is a real line in fundraising expense, and a blended rate reports it as though every gift cost the same.

Donor-covered fees, which are a policy question with a price

The same 98 giftsCountAmountConsequence
As charged at the processor98$16,061.40Donors added $381.40, covering 18% of the month's fees
As recorded in the CRM today98$15,680.00The receipt amount, and the fundraising expense, both $381.40 lower
Difference$381.40One setting, every month, until somebody decides

Both answers are defensible. What is not defensible is not knowing which one your systems are implementing, because the difference is the amount printed on a donor's acknowledgment and it is fundraising expense either way. Recording the base amount understates contribution revenue and fundraising expense by the same $381.40, which is the netting error in miniature and the reason it survives audit after audit.

What is in the pack

01

Three-way Reconciliation

One block per bank line, decomposed into the transactions that settled in it, with a residual column that has to read zero.

02

Both in-transit terms

Charges created in the period that settle after it, and prior-period charges that settled inside it. The two terms nobody carries.

03

Exception Register

Every difference between the CRM and the processor, typed into six categories, priced, and assigned to a named owner with a date.

04

Fee Analysis

Effective rate by gift size band, so a small recurring gift's real price is visible instead of averaged into one blended number.

05

Two Bridges Method Note

A full December close worked end to end, with three conflicting totals, both bridges closing, and the two reporting errors it avoids.

06

Discrepancy Resolution Note

Six categories a gift file actually produces, each with a signature to recognise it, a cause, a fix, and who has to act.

How it works

  1. 1

    Send the three files

    Itemised processor exports rather than summaries, the CRM gift export as recorded, and the bank statement at deposit-line level. Row counts checked against stated totals first.

  2. 2

    Write down the semantics

    Which date each system calls the gift date, whether its amounts are gross or net, and what it does with a donor-covered fee. Every later difference is an instance of one of these.

  3. 3

    Decompose the deposits

    Deposit-first, one block per bank line, charges and fees and reversals until the residual reads zero to the cent. A line that will not close becomes an exception, never a rounding difference.

  4. 4

    Bridge, then work the leftovers

    Both bridges to zero, then the exception list in order of what expires first. The unacknowledged donor outranks the larger accounting error every time, including on the board's own report. A gift keyed against the wrong one of two records reconciles and still lands nowhere useful. A major gift that closed after months of cultivation still has to clear this same bridge before the portfolio that tracked it can mark the ask closed.

Frequently asked questions

Why not just compare the CRM total to the bank total?

Because that comparison cannot find the gift nobody recorded. The money arrived and the deposit tied, so the bank is happy. In the worked example the CRM's total is $3,929.00 higher than the processor's, so a variance check points the wrong way while four donors sit unrecorded and unthanked.

What are the in-transit terms and why do they matter?

Charges created before the period end settle after it, and the prior period's charges settle inside it. Here that is $15,665.22 closing and $3,625.32 opening, the two largest terms after fees. Carrying neither understates December revenue by $12,039.90 on timing alone.

Which date is the gift date?

The charge date, not the deposit date. A contribution charged to a credit card is deductible in the year the charge is made, so the receipt keys to that. The general ledger and the bank reconciliation key to the payout date, which is why the sheet carries all three.

Why can I not match a gift to a bank deposit?

A deposit is a settlement batch. The largest December line here holds 35 charges created across three days plus a dispute reversing a charge deposited two weeks earlier. The processor's own payout reconciliation report groups the batch by category, which is the shape to reconcile against.

Should fees be netted against the gift?

No. Record contribution revenue at gross and the fee as fundraising expense. Netting leaves both figures $2,071.34 light with net assets unaffected, which is why it survives for years, and the fundraising efficiency ratio computed from it is wrong in the flattering direction.

Our donors can cover the processing fee. What do we record?

Either answer is defensible, and not knowing which one your systems implement is not. In the worked example 98 gifts read $15,680.00 in the CRM and $16,061.40 at the processor. That $381.40 is the receipt amount and the fundraising expense, and it recurs every month until somebody decides.

Does this post the journal entries?

No. It produces the figures an entry needs and names them: revenue at gross, fees as fundraising expense, gifts in transit at the period end, cash per the bank. Your finance staff or accountant posts and reviews, and the annual totals feed the Form 990.

Find the gifts your CRM never recorded

Send the processor exports, the CRM gift file and the bank statement. The first thing back is the list of charges with no gift record behind them.

Reconcile my month