Chart of accounts mapping for grant integrations
A nonprofit chart of accounts that works with a grants system has a short list of natural accounts (what kind of money) and a handful of dimensions (whose money, for what). The grant itself is a dimension, not an account. This post gives you a template and a field-by-field mapping for four common ledgers. It sits under our grant-to-accounting integration field guide, which covers the wider architecture.
Why one account per grant fails
It’s the most common thing we see in organisations that grew grant by grant. Each new award gets its own income and expense accounts. After a few years the chart has hundreds of lines and three problems appear:
- Functional expense reporting breaks. US nonprofits report expenses by nature and function (programme, management and general, fundraising). If the grant is baked into the account, you can’t cut by function without a spreadsheet.
- Connectors break. Every new grant needs a new account created before the integration can post, so someone does it by hand, or forgets.
- Year-on-year comparison breaks. Closed grants leave dead accounts that still appear in reports.
A template: natural accounts plus dimensions
Natural accounts (examples, renumber to your scheme):
| Range | Account | Used by |
|---|---|---|
| 1200 | Grants / contributions receivable | Grantee |
| 2100 | Grants payable | Funder |
| 2150 | Refundable advances (conditional cash received) | Grantee |
| 2160 | Deferred contributions (Canada, deferral method) | Grantee |
| 4100 | Contributions and grants, without donor restrictions | Grantee |
| 4110 | Contributions and grants, with donor restrictions | Grantee |
| 4200 | Government grants | Grantee |
| 5100 | Grants awarded | Funder |
| 6xxx | Salaries, travel, supplies, professional fees, occupancy | Both |
Dimensions (tag every line):
| Dimension | Example values | Source of truth |
|---|---|---|
| Grant / award ID | G-2026-0142 | Grants system |
| Fund / restriction | Without restriction · Purpose · Time · Endowment | GL policy, set from grant record |
| Programme | Youth employment · Literacy | Programme MIS |
| Function | Programme · Management & general · Fundraising | GL policy |
| Funder | Foundation name / ID | Grants system |
| Location (optional) | State, province, district | Grants system |
Five or six dimensions is enough for most organisations. Every extra one is a field someone must fill on every line.
Field-by-field mapping
| Grants-system field | QuickBooks Online | Sage Intacct | NetSuite | Zoho Books |
|---|---|---|---|---|
| Organisation ID | Vendor (custom field for ID) | Vendor ID | Vendor (external ID) | Vendor (custom field) |
| Grant ID | Class or Project | Project or user-defined dimension | Custom segment or Project | Reporting tag "Grant" or Project |
| Fund / restriction | Class (if grant uses Project) | User-defined dimension or Class | Class or custom segment | Reporting tag "Fund" |
| Programme | Class / custom field | Department or Class | Department | Reporting tag "Programme" |
| Function | Account sub-type or class | Dimension | Department/segment | Reporting tag "Function" |
| Location | Location (transaction level) | Location | Location / Subsidiary | Branch or reporting tag |
| Approved budget lines | Budget by class | Budget by dimension | Budget by segment | Budget filtered by tags |
A few platform notes, all worth checking against your edition:
- QuickBooks Online allows one class per line and one location per transaction, and class tracking needs a Plus or Advanced plan. If you need more than two dimensions, plan for custom fields or a different ledger.
- Sage Intacct is built around dimensions, which is why many US foundations use it. RSM describes tagging grant transactions with dimensions so commitments can be tracked as they’re paid down.
- NetSuite offers department, class and location as standard segments, plus custom segments.
- Zoho Books gives you up to 10 reporting tags with 500 options each, applied on line items for invoices, bills, expenses and journals.
Worked example: one grant through the mapping
Grant G-2026-0142, $150,000, unconditional, restricted to youth employment, from a US foundation, delivered in two locations.
- Grants system fires “Award approved” with org ID, grant ID, amount, restriction = purpose, programme = youth employment.
- Connector finds the vendor or customer by org ID in the cross-reference table (never by name), and creates it if missing.
- Grantee GL posts Dr 1200 Grants receivable / Cr 4110 Contributions with donor restrictions, tagged Grant = G-2026-0142, Fund = Purpose, Programme = Youth employment, Funder = foundation ID.
- Every expense on the programme is tagged with the same Grant and Programme values, plus Function and Location.
- Monthly, a report filtered by Grant = G-2026-0142 gives budget vs actual, and the release of restriction is posted for the amount spent.
When we set this up on Zoho, the grant record lives in a Zoho Creator app and the tags are pushed to Zoho Books by the same ID, so a programme manager never types a grant code by hand. That’s how FundZola builds utilisation reports straight from tagged lines.
Two adjacent reads: for when tranches should post at all, see conditional vs unconditional grants under ASU 2018-08. If your grantees include individuals, their bank details are personal data, and our DPDP compliance checklist covers how to handle them in India.
Checklist before you build
- Natural accounts describe the type of money, not the funder.
- Grant ID exists in both systems and is required on every line that touches a grant.
- Restriction is a dimension, consistent with your net asset or fund policy.
- Function is captured at entry, not reconstructed at year end.
- Budgets use the same dimensions as actuals.
- Closed grants are deactivated as dimension values, not deleted.
Map one grant, end to end
Bring one grant agreement and last month’s GL export. In a 45-minute working session we’ll map that grant from approval to audit and hand you the field mapping.
