Coffer

Contract

What Coffer is being built to do

Every clause of the product Coffer is building toward, and how much of it the code does today. Judged from the code and tests, not from plans.

23 of 135 clauses done

  • 23 done
  • 62 partial
  • 50 missing

Judged at commit 325780f ·

How statuses are judged

Published clauses

8 done · 1 partial · 0 missing

of 9

Target and push further

15 done · 61 partial · 50 missing

of 126

Product target

Category
Nonprofit donor management / fundraising CRM
Replaces
Bloomerang, Blackbaud Raiser's Edge NXT, Little Green Light, Neon CRM, Givebutter, Zeffy
First buyer
A US 501(c)(3) development lead with 500 to 20,000 donor records and a fundraising team of one to ten, moving from Little Green Light or Bloomerang; amounts in USD, IRS receipt rules, the nonprofit's own Cloudflare and Stripe accounts

Progress by area

18 areas

Published · 1 area

Target and push further · 17 areas

All clauses

ClauseTitleStatusEvidence or gap
Released guarantees 8 done · 1 partial · 0 missing
HTTP-001publishedPrivate app boundaryDonetests/coffer.test.mjssrc/coffer/auth.ts
DONOR-001publishedDonors and householdsDonesrc/coffer/donors.tstests/coffer.test.mjstests/browser-journey.mjs
GIFT-001publishedImmutable ledgerDonesrc/coffer/gifts.tssrc/coffer/donor-merge.tssrc/coffer/http.tsmigrations/core/0042_coffer_duplicates.sqltests/coffer.test.mjstests/duplicates.test.mjs
CONSENT-001publishedConsent historyDonesrc/coffer/donors.tstests/coffer.test.mjs
ACK-001publishedAcknowledgment lettersPartialsrc/coffer/acknowledgements.tssrc/coffer/settings.tstests/coffer.test.mjsGap: Reviewed settings, frozen hash approval, CSV export and sent-date recording ship; imported acknowledged/do-not-acknowledge statuses, source goods-value handling and a stored per-gift acknowledged-by-letter method/batch link remain incomplete (RCPT-011). The move-in acknowledge-from cutoff is implemented through prior-acknowledgment exclusions.
APPEAL-001publishedConsent-checked appealsDonesrc/coffer/appeals.tstests/coffer.test.mjs
AGENT-001publishedPrepare, then a person decidesDonesrc/coffer/commands.tssrc/coffer/auth.tstests/coffer.test.mjs
IMPORT-001publishedReviewed Stripe move-inDonesrc/coffer/imports/src/coffer/ui/move-in.tstests/coffer.test.mjstests/import-refunds-journey.mjs
DATA-001publishedCustody and erasureDonesrc/coffer/archive-policy.mjssrc/coffer/imports/erasure.tsscripts/backup-hosted.mjstests/coffer.test.mjstests/hosted-restore.test.mjs
Supporter records 2 done · 6 partial · 6 missing
DONOR-002targetOrganization recordsPartialsrc/coffer/donors.tsGap: Every constituent is a person-shaped donor record; there is no organization type, EIN, website or contact role.
DONOR-003targetRelationshipsPartialsrc/coffer/donor-depth.tssrc/coffer/ui/donor-depth.tsdocs/donor-depth.mdGap: Reciprocal spouse, employer, board member, foundation officer and introduced-by links show on both records and filter donor lists. Household salutations, head and combined totals remain.
DONOR-004targetInteraction timelinePartialsrc/coffer/donor-depth.tssrc/coffer/ui/donor-timeline.tsdocs/donor-depth.mdGap: Calls, meetings and emails record date, participants, notes, next step and author beside gifts, pledges and receipt events in one timeline. Confidential notes, timeline filters and the broader task/event integrations remain.
DONOR-005targetCustom fields and tagsMissingGap: No custom fields, tags or categories.
DONOR-006targetDuplicate detection and mergeDonesrc/coffer/duplicates.tssrc/coffer/donor-merge.tssrc/coffer/merge-journal.tsmigrations/core/0042_coffer_duplicates.sqltests/duplicates.test.mjs
DONOR-007targetSaved searches and listsPartialsrc/coffer/donors.tssrc/coffer/ui/donors.tsGap: Donor search includes reciprocal relationship-type and connected-donor filters. General saved lists and undoable bulk actions remain.
DONOR-008targetDocuments on recordsMissingGap: No attachments.
DONOR-009targetAddress verification and NCOAMissingGap: No address verification or NCOA.
DONOR-010targetVolunteer historyMissingGap: No volunteer records.
DONOR-011targetGiving summaryDonesrc/coffer/giving-summary.tssrc/coffer/ui/giving-summary.tstests/giving-summary.test.mjstests/giving.test.mjs
DONOR-012targetConstituent status: active, inactive and deceasedMissingGap: Constituents have no status; appeals exclude only on consent and address, and erasure is the only way to stop a record being used.
DONOR-013targetSeveral emails, phones and addressesPartialsrc/coffer/donors.tsmigrations/core/0016_coffer.sqlGap: A donor has one email (refused if any other record has it), one phone and one postal address; no further contact points, types, primaries, seasonal ranges or email shared within a household.
DONOR-014targetName parts, salutations and envelope namePartialsrc/coffer/donors.tssrc/coffer/settings.tstests/coffer.test.mjsGap: A donor has one free-text name and letters merge only {{donor_name}}. LGL Prefix, first/middle/last and Suffix are retained in that display name, and first/last-name search finds a middle initial. Separate editable name parts, nickname, computed or overridden salutations/envelope name and admin-set defaults remain unbuilt.
DONOR-015targetSolicitation restrictionsMissingGap: No solicitation restriction: consent is per channel (email and postal) only, and appeals exclude only on consent and address.
Gifts and pledges 2 done · 4 partial · 4 missing
GIFT-002targetBatch gift entry and depositsMissingGap: Gifts are entered one at a time; no batches or deposit totals.
GIFT-003targetCampaign, appeal, fund and channel attributionPartialsrc/coffer/gifts.tsGap: Each gift has one free-text fund; no campaigns, appeals or source as structured references.
GIFT-004targetSplit giftsDonesrc/coffer/gift-splits.tsmigrations/core/0039_coffer_gift_splits.sqlsrc/coffer/fund-report.tstests/split-gifts.test.mjs
GIFT-005targetPledges, installments and balancesPartialsrc/coffer/pledges.tssrc/coffer/ui/pledges.tstests/pledges.test.mjsGap: Dated installments total the pledge, allocations match gifts by donor/fund without overpayment, and reversals reopen balances. Write-offs, reductions, campaign attribution and recurring-plan payment remain.
GIFT-006targetSoft creditsDonesrc/coffer/gift-depth.tssrc/coffer/soft-credit-ack.tssrc/coffer/retention.tstests/soft-credits.test.mjstests/soft-credit-journey.mjs
GIFT-007targetMatching giftsPartialsrc/coffer/gift-depth.tssrc/coffer/ui/gift-depth.tstests/soft-credits.test.mjsGap: Expected employer amount/deadline links the original gift to a received employer ledger gift, with overdue and reversal-aware states. Program lookup, submission workflow, automatic employee recognition and submission reminders remain.
GIFT-008targetTribute giftsPartialsrc/coffer/gift-depth.tssrc/coffer/acknowledgements.tssrc/coffer/year-end.tstests/soft-credits.test.mjsGap: Honor/memory, honoree and notification contact are recorded on gifts and included in approved gift/year-end receipt text. Tribute grouping, notification sending and incumbent tribute imports remain.
GIFT-009targetIn-kind giftsMissingGap: Gifts are monetary only.
GIFT-010targetStock, DAF grants and IRA distributionsMissingGap: No stock, DAF or QCD gift types.
GIFT-011targetAnonymous gifts and recognition namesMissingGap: No anonymity flag or recognition name.
Online giving 0 done · 6 partial · 3 missing
GIVE-001targetDonation formsPartialsrc/coffer/giving/tests/giving.test.mjsGap: Hosted campaign forms collect once/monthly card and Link gifts and retain fund/campaign attribution. Advanced fields, embedding and the specified performance/accessibility acceptance remain outstanding.
GIVE-002targetCampaign pagesPartialsrc/coffer/giving/tests/giving.test.mjsGap: Custom-path public campaign stories, goals, ledger totals, gift counts and recurring donor counts ship. Uploaded media, donor walls and closing dates remain outstanding.
GIVE-003targetRecurring givingPartialsrc/coffer/giving/tests/giving.test.mjsGap: Monthly Stripe subscriptions record successful installments and show status and recovery; donors cancel at period end. Quarterly/annual plans, staff editing, pause/resume and the three-month test-clock acceptance remain outstanding.
GIVE-004targetCard, bank, wallet and PayPal checkoutPartialsrc/coffer/giving/tests/giving.test.mjsGap: Stripe-hosted card and Link checkout ships, with Apple Pay offered on supported devices. ACH is coming soon pending a US test account; Apple Pay device payment, PayPal/Venmo, ACH settlement/returns and staff entry remain outstanding. No card numbers enter Coffer.
GIVE-005targetDonor portalPartialsrc/coffer/giving/tests/giving.test.mjsGap: Emailed single-use links open a donor-only portal to view monthly plans, update cards at Stripe and cancel. Statements, amounts/frequencies, pause, communication preferences and cancellation tasks remain outstanding.
GIVE-006targetFailed recurring paymentsPartialsrc/coffer/giving/tests/giving.test.mjsGap: Stripe schedules retries; verified failure outcomes email private card-update links and successful recovery is recorded. Expiry warnings and staff escalation after exhausted retries remain outstanding.
GIVE-007targetFraud and card-testing protectionMissingGap: No forms to protect.
GIVE-008targetText-to-giveMissingGap: No text-to-give.
GIVE-009targetStaff-entered card and bank paymentsMissingGap: Coffer takes no payments; staff record a gift by hand after the money arrives elsewhere.
Campaigns, events and memberships 0 done · 1 partial · 4 missing
CAMP-001targetCampaigns with goalsPartialsrc/coffer/giving/tests/giving.test.mjsGap: Published campaigns have a goal and fund, with ledger-derived raised/gift totals and distinct recurring donors. Dates, nested campaigns, pledges/soft credits, manual attribution and additional campaign statistics remain outstanding.
CAMP-002targetFundraising eventsMissingGap: No events.
CAMP-003targetPeer-to-peer fundraisingMissingGap: No peer-to-peer pages.
CAMP-004targetMembershipsMissingGap: No memberships.
CAMP-005targetAuction results as giftsMissingGap: No events or auction import.
Payments 1 done · 3 partial · 2 missing
PAY-001targetLive Stripe connectionPartialsrc/coffer/payments/tests/payments.test.mjsGap: Signed live charge, refund, dispute, failure and payout events, external donor matching and replay-safe money entries ship alongside saved-page move-in. OAuth/automatic endpoint registration, scheduled backfill/sweep and an ambiguous-match review queue remain outstanding.
PAY-002targetPayouts with their giftsDonesrc/coffer/payments/tests/payments.test.mjs
PAY-003targetRefunds and disputesPartialsrc/coffer/payments/tests/payments.test.mjsGap: Processor refunds and disputes append immutable contribution reversals and a dispute win reinstates the contribution. No receipt correction, staff-initiated refund, relationship-manager notice or evidence due-date workflow yet.
PAY-004targetProcessing fees and fee coverPartialsrc/coffer/payments/tests/payments.test.mjsGap: Immutable balance transactions record processor gross, fees and net, shown by fund in each payout. Donor fee-cover checkout and form/campaign fee reports remain outstanding.
PAY-005targetOther giving platformsMissingGap: No other platform connections.
PAY-006targetShop orders record only the contributionMissingGap: No shop connection.
Accounting 2 done · 3 partial · 0 missing
FIN-001targetQuickBooks Online syncPartialsrc/coffer/payments/tests/payments.test.mjsGap: Mapped fund, bank and fee accounts export as a balanced QBO journal CSV with fund classes; Desktop IIF is separate. No QBO OAuth/API connection or check-batch posting yet.
FIN-002targetPantry syncPartialsrc/coffer/payments/tests/payments.test.mjsGap: Paid matched USD payouts become evidence-backed Pantry journal proposals; human Pantry approval posts the deposit, and Coffer refresh records its journal ID. Saved submission claims prevent duplicate or uncertain resends. Check batches remain outstanding; live Stripe-to-Pantry acceptance needs a USD-settling Stripe test account.
FIN-003targetRestricted fundsDonesrc/coffer/restricted-funds.tssrc/coffer/ui/restricted-funds.tssrc/coffer/payments/exports.tstests/split-gifts.test.mjstests/payments.test.mjs
FIN-004targetJournal export for other ledgersDonesrc/coffer/payments/exports.tssrc/coffer/payments/period-journal.tstests/payments.test.mjstests/payments-browser.mjs
FIN-005targetReconciliation reportPartialsrc/coffer/payments/tests/payments.test.mjsGap: Per-payout gifts, refunds, fees, net, match difference and Pantry destination/journal ID are visible. Period-wide ledger/processor/deposit reconciliation including pending ACH and check batches remains outstanding.
Receipts and acknowledgments 1 done · 8 partial · 2 missing
RCPT-001targetImmediate email receiptsPartialsrc/coffer/receipt-mail.tstests/receipts.test.mjsGap: Approved per-gift receipts are sent from install SendGrid; automatic online-gift triggers within a minute, domain verification and attached PDFs remain unbuilt. Managed integrations are not available yet.
RCPT-002targetAcknowledgments delivered by emailDonesrc/coffer/letter-delivery.tstests/receipts.test.mjs
RCPT-003targetPrint-ready letters, labels and envelopesPartialsrc/coffer/ui/print-letters.tstests/receipts.test.mjsGap: Single and batch print-styled US Letter documents support window-envelope placement and browser Save as PDF alongside CSV. Labels, envelope-only layouts, Word files, household grouping and Lob remain unbuilt.
RCPT-004targetYear-end giving statementsPartialsrc/coffer/year-end.tstests/receipts.test.mjsGap: Per-donor calendar-year statements itemize all unreversed gifts including imported gifts, goods values and deductible totals, then use approved email or print delivery. Unknown goods answers require review. Portal requests, automatic January scheduling, household grouping, deceased-recipient rules and corrected reissues remain unbuilt.
RCPT-005targetUS receipt rulesPartialsrc/coffer/settings.tssrc/coffer/acknowledgements.tstests/coffer.test.mjsGap: Templates must carry donor, amount, date, organization and the goods-or-services statement, and the $250 threshold works; no quid pro quo rule for payments over $75, token-benefit or religious-benefit wording.
RCPT-006targetDelivery trackingPartialsrc/coffer/letter-delivery.tstests/receipts.test.mjsGap: Signed SendGrid delivered, bounce, dropped and complaint events are recorded per letter, deduplicated and shown on donor and batch; negative results route the donor to print. Configure the signed provider webhook and verification key, or explicitly fetch events with SendGrid Email Logs access. Open tracking, address-fix tasks and print-vendor events remain unbuilt.
RCPT-007targetThank-you templatesPartialsrc/coffer/settings.tstests/coffer.test.mjsGap: One reviewed letter template with required facts exists; no templates per form, campaign or gift type.
RCPT-008targetCorrected and voided receiptsMissingGap: No receipt numbering, voiding or reissue.
RCPT-009targetOne piece per householdMissingGap: Letters and appeal exports are one row per gift or per donor; no household grouping, addressee or combined totals.
RCPT-010targetMerge fields in every templatePartialsrc/coffer/settings.tstests/coffer.test.mjsGap: Letter templates merge a fixed list of nine fields (date, donor name, amount, gift date, fund, goods statement, organization, EIN, deductible amount) and are refused for unknown, missing required or unclosed fields; no name parts, salutations, household, contact-point, giving-summary or custom fields, no fallbacks, field list API or blank check.
RCPT-011targetAcknowledgment status on every gift and soft creditPartialsrc/coffer/soft-credit-ack.tssrc/coffer/acknowledgements.tstests/soft-credits.test.mjstests/receipts.test.mjsGap: Soft credits have independent status, date, method, linked conversation or recorded thank-you note, exclusion reason and audited changes under GIFT-006. Hard gifts still lack stored per-gift acknowledgment status, method or an outside-batch setter; automatic message updates, soft-credit queue settings, importer status and saved-list/report filters remain.
Communication 0 done · 4 partial · 4 missing
COMM-001targetPreferences and unsubscribes everywherePartialdocs/COMMUNICATIONS.mdGap: Email provider opt-outs append withdrawals and Coffer email withdrawals synchronize to Mango or Mailchimp; each marketing submission checks both sides. Receipts remain transactional. SMS/phone, topics, frequency preferences and other providers remain.
COMM-002targetAppeals sent through Mango or MailchimpPartialdocs/COMMUNICATIONS.mdGap: Frozen, hash-approved appeals merge donor names and giving figures into exact-recipient Mango or Mailchimp campaigns, with per-donor submission and provider results. Real local Mango draft/sync paths and hosted appeal/welcome delivery, a real unsubscribe click, reverse withdrawal and a transactional receipt after opt-out are proven. Mailchimp remains fixture-only. Name-part/custom-field merges, tags, engagement/attribution, scheduled appeals and solicitation restrictions remain.
COMM-003targetConstant ContactMissingGap: No Constant Contact connection.
COMM-004targetOne-to-one email and mailbox loggingMissingGap: No mailbox connection or personal email.
COMM-005targetReplies reach the right personPartialdocs/COMMUNICATIONS.mdGap: The actual Email Routing handler logs known-donor replies, assigns and forwards to an active prospect owner (or the installation owner), files automatic replies, and exposes follow-up tasks. Live routing was proven on 17 October 2026 (an Email Routing rule to a hosted Worker turned a donor’s appeal reply into a task for the prospect owner); forwarding a copy needs the assignee verified as an Email Routing destination, and proposed stop-request withdrawals remain.
COMM-006targetSMS outreachMissingGap: No SMS.
COMM-007targetDirect mail appealsPartialsrc/coffer/appeals.tstests/coffer.test.mjsGap: Mail-channel audiences with postal addresses export as CSV; no ask amounts, response codes or mailing history.
COMM-008targetAppeal resultsMissingGap: No appeal results.
Stewardship and follow-up 1 done · 3 partial · 2 missing
STEW-001targetTasks with owners and remindersPartialsrc/coffer/call-tasks.tssrc/coffer/ui/call-tasks.tstests/pipeline.test.mjsGap: Owned, dated call tasks from lapses and unpaid due pledge installments support assignment, reassignment, snooze and atomic donor-timeline call completion. Recurring tasks, reminders, escalation and other task kinds remain.
STEW-002targetRecurring tasksDonesrc/coffer/recurring-tasks.tssrc/coffer/ui/recurring-tasks.tsmigrations/core/0044_coffer_recurring_tasks.sqltests/pipeline.test.mjstests/recurring-browser.mjs
STEW-003targetStewardship journeysPartialdocs/COMMUNICATIONS.mdGap: A person publishes the first-gift thank-you, impact and second-ask series. Durable due steps run through the provider on the minute Worker scheduler; another gift, unavailable email consent, merge or erasure stops pending work. Other triggers, branches, frequency caps, inactive/deceased statuses and solicitation restrictions remain.
STEW-004targetPledge reminders and invoicesPartialsrc/coffer/pledges.tssrc/server.tstests/pledges.test.mjsGap: Self-hosted SendGrid reminders run daily or by staff before each unpaid installment using current email permission, with durable single-attempt submission states. Managed email is not available yet. Unpaid due installments now feed the owned call list. Pay links, printable invoices and automatic overdue follow-up remain.
STEW-005targetGift-triggered rulesMissingGap: No rules.
STEW-006targetMeetings and calendarsMissingGap: No calendar connection.
Major gifts and moves management 2 done · 2 partial · 3 missing
MAJOR-001targetOpportunity pipelinePartialsrc/coffer/major-gifts.tssrc/coffer/ui/major-gifts.tstests/pipeline.test.mjsGap: Identify, qualify, cultivate, ask and stewardship opportunities carry ask amount, expected close, owner and next step; lists filter by owner and stage. Configurable stages, probability, campaign/fund forecasts and closed-won gift linkage remain.
MAJOR-002targetPortfolios and movesDonesrc/coffer/portfolios.tssrc/coffer/ui/portfolios.tstests/pipeline.test.mjstests/portfolios-journey.mjs
MAJOR-003targetAction plans and proposalsMissingGap: No plans or proposals.
MAJOR-004targetEngagement and retention scoresPartialsrc/coffer/major-gifts.tssrc/coffer/ui/major-gifts.tstests/pipeline.test.mjsGap: Prospect scores expose recency, frequency, amount and conversation inputs with their points and the full fixed formula. Configurable weights, broader engagement sources and scores on every constituent remain.
MAJOR-005targetProspect researchMissingGap: No prospect research.
MAJOR-006targetGrants from foundations and corporationsMissingGap: No grant tracking.
MAJOR-007targetPlanned givingDonesrc/coffer/planned-giving.tssrc/coffer/ui/planned-giving.tstests/pipeline.test.mjs
Reporting 1 done · 3 partial · 4 missing
REPORT-001targetDonor retentionPartialsrc/coffer/retention.tssrc/coffer/ui/retention.tstests/pipeline.test.mjsGap: Calendar-year retained, new, lapsed and recaptured counts and net amounts drill to every underlying donor; signed adjustments and erased identities reconcile to the contribution ledger. Fiscal years, list/fund/campaign filters and upgraded/downgraded cohorts remain.
REPORT-002targetLYBUNT and SYBUNT listsPartialsrc/coffer/lapses.tssrc/coffer/ui/lapses.tstests/pipeline.test.mjstests/giving.test.mjsGap: LYBUNT and earlier-year SYBUNT lists show reasons, last gifts and annual amounts at risk, with stopped monthly-plan flags and owned call creation. Direct appeal and journey enrollment remain.
REPORT-003targetFundraising dashboardsPartialsrc/coffer/ui/home.tsGap: Today shows the current calendar year's total and acknowledgment backlog; no breakdowns, goals, comparisons or drill-down.
REPORT-004targetReport builderMissingGap: No report builder.
REPORT-005targetScheduled reportsMissingGap: No scheduled reports.
REPORT-006targetRecurring giving healthDonesrc/coffer/recurring-health.tssrc/coffer/ui/recurring-health.tsmigrations/core/0046_coffer_recurring_health.sqltests/giving.test.mjstests/coffer.test.mjs
REPORT-007targetIRS Form 990 supportMissingGap: No Form 990 reports.
REPORT-008targetRaised by stateMissingGap: Each donor stores a current state, but there is no address history or report by state.
Moving in 0 done · 6 partial · 5 missing
MOVE-001targetFrom Little Green LightPartialsrc/coffer/move-in/service.tssrc/coffer/move-in/plan.tssrc/coffer/ui/crm-move-in.tstests/move-in.test.mjsdocs/MOVE-IN-SOURCES.mdGap: Constituent names (including Prefix/Suffix) are authoritative; display names in gifts and relationships never block for name differences. LGL Appeal maps to the gift appeal, Campaign is retained separately in the note, and Check No. is carried in the reference alongside the source gift ID. Independent blockers are reviewed together, with concrete fixes; one cent per pledge payment is accepted as rounding and actual paid cents are retained. Documented LGL CSV/XLSX constituent and fundraising exports preview donors, households (explicit, or spouses and people at one address; never merged by name), gifts, funds/campaigns, relationships, soft credits, pledges/installments and notes, with source controls, every blocking row listed (paged, filterable, CSV), a preview that plans every part, part-by-part apply that names a failing part's rows, year-by-year re-import by LGL ID, and undo. Full multi-contact/name/custom-field, consent/restriction, acknowledgment, tribute and recurring-vault migration remains outside this export implementation.
MOVE-002targetFrom BloomerangPartialsrc/coffer/move-in/service.tssrc/coffer/move-in/plan.tssrc/coffer/ui/crm-move-in.tstests/move-in.test.mjsdocs/MOVE-IN-SOURCES.mdGap: Documented Bloomerang CSV/XLSX reports import the same donor/gift history and attribution with source-control reconciliation and atomic apply/undo. REST API, full contact/custom-field, task, consent/restriction, acknowledgment, tribute and recurring-vault migration remains unbuilt.
MOVE-003targetFrom Raiser's Edge NXTPartialsrc/coffer/move-in/service.tssrc/coffer/move-in/plan.tssrc/coffer/ui/crm-move-in.tstests/move-in.test.mjsdocs/MOVE-IN-SOURCES.mdGap: Configured NXT database-view CSV/XLSX constituent/gift reports import donor/gift history, households, relationships, soft credits, pledges and notes. Grouped web-list splits and repeated source IDs are explicitly blocked pending designation exports. SKY API, opportunities, full custom fields/contacts, restrictions, acknowledgment and recurring-vault migration remains unbuilt.
MOVE-004targetFrom Neon CRMMissingGap: No Neon CRM importer.
MOVE-005targetFrom Givebutter and ZeffyMissingGap: No Givebutter or Zeffy importer.
MOVE-006targetAny spreadsheetMissingGap: No general importer.
MOVE-007targetTotals checked before the switchPartialsrc/coffer/move-in/service.tssrc/coffer/move-in/plan.tssrc/coffer/ui/crm-move-in.tstests/move-in.test.mjsdocs/MOVE-IN-SOURCES.mdGap: CSV/XLSX move-ins compare received gift counts and cents by year, fund and donor with raw source rows and independently supplied source report controls; existing imported net balances participate. Named differences or unmapped values block until resolved or accepted with a recorded reason. Stable source IDs, resumable part-by-part apply with a recheckable totals check from the gifts in Coffer (per move-in, including gifts an earlier move-in brought), and undo ship; later call tasks and opportunities block undo. The review asks whether gifts before a date (default the move-in date in the organization’s time zone) were already thanked; those never become due or missing receipts. Cross-account vault transfer, per-gift acknowledgment status reconciliation, restriction/tribute controls and cutover sign-off remain unbuilt.
MOVE-009targetRecurring donors move with their cards and bank accountsPartialsrc/coffer/imports/subscriptions.tsdocs/MOVE-IN.mdtests/coffer.test.mjsGap: Supported active fixed-price USD monthly subscriptions from the same Stripe account appear on donors with their existing customer/subscription IDs; Stripe continues billing without a new charge or card transfer. Cross-account vault transfer, ACH mapping and other schedules remain unbuilt.
MOVE-008targetConsent and preferences moved with provenanceMissingGap: No importer carries consent.
MOVE-010targetCustom fields carried acrossMissingGap: No custom fields, and no importer other than Stripe's, which reads no custom data.
MOVE-011targetSwitching guide for each incumbentPartialsrc/coffer/move-in/service.tssrc/coffer/move-in/plan.tssrc/coffer/ui/crm-move-in.tstests/move-in.test.mjsdocs/MOVE-IN-SOURCES.mdGap: The CRM export guide gives vendor report/menu guidance, official source links, required IDs, supported fields and source control interpretation for LGL, Bloomerang and NXT, alongside the Stripe guide. PCI transfer and an installation cutover checklist remain unbuilt.
Team and access 1 done · 2 partial · 0 missing
TEAM-001targetRoles and record-level accessPartialsrc/coffer/commands.tssrc/coffer/auth.tstests/coffer.test.mjsGap: Owner, admin, member and agent roles guard every command; no fundraiser, finance, volunteer or read-only roles, portfolio scoping, confidential fields, managers or call capacity.
TEAM-002targetSingle sign-on and two-step sign-inPartialsrc/modules/operator-auth/identity/oidcGap: Base sign-in supports an OIDC provider; requiring SSO and a second factor are not offered in Coffer.
TEAM-003targetAudit logDonesrc/coffer/audit.tssrc/coffer/ui/audit.tsmigrations/core/0041_coffer_audit.sqlmigrations/core/0043_coffer_access_audit.sqltests/audit.test.mjs
Integrations and API 0 done · 1 partial · 3 missing
API-001targetPublic REST APIPartialsrc/coffer/http.tssrc/coffer/commands.tstests/coffer.test.mjsGap: Authenticated donor reads and a command API exist; no versioned public API, OpenAPI document, scoped keys or idempotency keys.
API-002targetWebhooksMissingGap: No webhooks.
API-003targetZapier and CrankMissingGap: No Zapier app or Crank connector.
API-004targetMCP endpointMissingGap: No MCP endpoint.
Mobile 0 done · 1 partial · 2 missing
MOBILE-001targetPhone-ready web appPartialtests/browser-journey.mjsGap: Every current screen fits 390 pixels with no horizontal scroll; no phone-first views, call logging or task list.
MOBILE-002targetNative iOS and Android appsMissingGap: No native apps.
MOBILE-003targetIn-person givingMissingGap: No in-person payments.
Data and ownership 2 done · 1 partial · 1 missing
DATA-002targetExports by record typePartialsrc/coffer/http.tssrc/coffer/acknowledgements.tstests/coffer.test.mjsGap: The owner downloads the full NDJSON archive, and letters and audiences export as CSV; no per-type or per-list CSV exports.
DATA-003targetA donor's own data on requestMissingGap: No per-donor access export.
OWN-001targetFree, open source and ownedDoneLICENSEwrangler.jsoncREADME.md
OWN-002targetRuns on the nonprofit's own computerDoneRUN-LOCALLY.mdtests/clone-journey.mjs
Development agent 0 done · 7 partial · 5 missing
DEV-001push furtherReconciles every giftPartialsrc/coffer/agent/reconciliation.tstests/agent-reconciliation.test.mjsdocs/DEVELOPMENT-AGENT.mdGap: Stripe charges/payouts, contributions/funds and exact Pantry proposal/journal state are compared with source IDs. Safe contribution and missing-gift corrections have explicit apply and compensating undo; payout/accounting exceptions require Payments/Pantry review. Broader finance-role approvals and QuickBooks integration remain.
DEV-002push furtherRescues failed monthly giftsPartialsrc/coffer/agent/recovery.tstests/agent-recovery.test.mjsdocs/DEVELOPMENT-AGENT.mdGap: Signed failures request one private card-update email; Stripe schedules retries and daily reconciliation records recovery/lapse. Reversible pause/resume and activity explain outcomes. Major-donor approvals, expiring-card notices and per-donor frequency grants remain.
DEV-003push furtherSends missing receiptsPartialsrc/coffer/agent/receipts.tstests/agent-receipts.test.mjsdocs/DEVELOPMENT-AGENT.mdGap: Finds all missing and bounced gift receipts, freezes a batch for human approval and supports undo before dispatch. Unknown goods/services are held. Standing template approvals, migration acknowledgment policies and year-end delivery recovery remain.
DEV-004push furtherDrafts stewardship from the nonprofit's own historyPartialsrc/coffer/agent/stewardship.tstests/stewardship.test.mjsdocs/DEVELOPMENT-AGENT.mdGap: An install-owned sealed AI key enables cited drafts from actual gifts, signed adjustments, funds, conversations and tributes; people edit/review/send, stale sources block sending and discarded drafts restore. Relationship-manager scheduling, event/reply sources and confidential role scoping remain.
DEV-005push furtherShows who needs a human call nextPartialsrc/coffer/call-tasks.tssrc/coffer/lapses.tssrc/coffer/retention.tstests/pipeline.test.mjsGap: Staff review explained lapse/monthly/pledge flags, create owned dated calls, log outcomes on donor timelines and inspect donor-by-donor retention. Weekly agent ranking, capacity overflow, solicitation/status restrictions and called-vs-uncalled outcome attribution remain.
DEV-006push furtherBriefs before a meetingMissingGap: No meetings or briefs.
DEV-007push furtherProves the move-in and the cutoverPartialsrc/coffer/imports/service.tstests/coffer.test.mjsGap: The Stripe move-in reads the connected account or a request-only restricted read key, follows pages for charges, Payment Intents, invoices and monthly plans, resolves customers, previews exact gifts and skips, imports supported existing monthly plans, checks actual gift counts/cents, and supports guarded undo (src/coffer/imports/live-stripe.ts, src/coffer/imports/subscriptions.ts, docs/MOVE-IN.md). No comparison agent, cross-account vault transfer, recurring reauthorization or cutover.
DEV-008push furtherKeeps the database cleanMissingGap: No data hygiene agent.
DEV-009push furtherConfirms appeals actually reached donorsMissingGap: No sender connection.
DEV-010push furtherFollows pledges and grants to the endMissingGap: No installments, grants or matching gifts to follow.
DEV-011push furtherWrites the development reportMissingGap: No reports for the agent to draw on.
DEV-012push furtherAgent grants and autonomyPartialsrc/coffer/auth.tssrc/coffer/commands.tstests/coffer.test.mjsGap: Expiring, revocable agent keys can only read and prepare; no named grants, standing approvals, limits or kill switch.

How statuses are judged

Done
It ships in the default install, and a cited test or journey exercises it.
Partial
Some of it ships, it ships only behind an opt-in, or there is code with no requirement-level test.
Missing
There is no implementation.

Read CONTRACT.md on GitHub