Grants Receivable Manager
Grants Receivable Manager
Component: GrantsReceivableManager.tsx Location: src/features/accounting/components/GrantsReceivableManager.tsx Route / navigation: Path /fund-accounting, Zustand accountingTool = grants-receivable. See 00-ACCOUNTING-HUB.md.
Overview
The Grants Receivable Manager tracks awarded grants that haven't been received yet. It enables organizations to record expected grant income before funds arrive. The JE behavior varies by accounting method:
- Full Accrual: Grant award creates A/R JE (DR Grants Receivable, CR Grant Revenue). Payment reduces A/R. Write-off reverses A/R.
- Modified Accrual (Hybrid): Grant is tracked without A/R JE. Revenue recognized at payment time (DR Cash, CR Grant Revenue). Write-off creates no JE.
- Cash: Same as Modified Accrual — revenue at payment, no A/R entries.
The createGrantReceivable(), recordGrantReceivablePayment(), and writeOffGrantReceivable() functions in grants.ts check getOrgAccountingBasis() and only create A/R JEs when basis === 'accrual'. This mirrors the pledges.ts pattern (fixed March 17, 2026).
Visibility: This tool is hidden only when the organization's accounting basis is Cash. It remains available for Accrual and Modified Accrual (Hybrid) configurations.
Recent Updates
Calculator-style amount entry (Apr 9, 2026)
- The Grants Receivable screen is part of the live fund-accounting calculator-input rollout.
- Calculator math is enabled in both the Add/Edit Grant amount field and the Record Payment amount field.
- Expressions commit to numeric values on blur or
Enter; this does not broaden calculator behavior to unrelated non-accounting screens.
UI Features
Summary Cards
- Open Grants - Count of grants with status 'awarded' or 'partial'
- Total Awarded - Sum of all open grant amounts
- Received - Sum of payments received against open grants
- Outstanding - Remaining balance due on open grants
Controls
- Search - Filter by grantor name, grant name, or grant number
- Status Filter - Filter by grant status (All, Awarded, Partial, Received, Written Off, Cancelled)
- Add Grant - Opens dialog to create new grant receivable
Grants Table
| Column | Description |
|--------|-------------|
| Grantor | Grantor name and grant number |
| Grant Name | Name of the grant (with lock icon if restricted) |
| Expected Date | When payment is expected |
| Amount | Total grant amount |
| Received | Amount received so far |
| Balance | Remaining amount due |
| Status | Current grant status |
| Actions | Record payment, edit, write off |
Status Badges
- Awarded (blue) - Grant awarded, no payments received
- Partial (yellow) - Some payments received
- Received (green) - Fully received
- Written Off (gray) - Marked as uncollectible
- Cancelled (red) - Grant cancelled
Overdue Highlighting
Grants past their expected date are highlighted in red with an "X days overdue" badge.
Restricted Grant Indicator
Grants marked as restricted show a lock icon next to the grant name.
Dialogs
Add/Edit Grant Dialog
- Fund - Select organization (multi-org only)
- Grantor Name - Required
- Grantor Contact - Contact person name
- Grantor Email - Contact email
- Grant Name - Required
- Grant Number - Reference number
- Amount - Grant amount (required)
- Award Date - When grant was awarded
- Expected Date - When payment is expected (required)
- Restricted Grant - Checkbox for restricted funds
- Restriction Details - Details if restricted
- Report Due Date - When grant report is due
- Description - Notes about the grant
Record Payment Dialog
- Payment Amount - Amount received (defaults to balance due)
- Payment Date - Date of payment
- Check # - Check number if applicable
- Memo - Reference or notes
Write Off Dialog
- Reason - Required explanation for write-off
Data Flow
Fetch
fetchGrantsReceivable(entityId, status?) → GrantReceivableRecord[]Create
createGrantReceivable({
entityId, grantor_name, grantor_contact?, grantor_email?,
grant_name, grant_number?, award_date, expected_date, amount,
description?, is_restricted, restriction_details?, report_due_date?
}) → grantIdUpdate
updateGrantReceivable(grantId, updates) → voidRecord Payment
recordGrantReceivablePayment(grantId, amount, paymentDate, depositId?, checkNumber?, memo?) → voidWrite Off
writeOffGrantReceivable(grantId, reason, userId) → voidDatabase Schema
grants_receivable table
| Column | Type | Description |
|--------|------|-------------|
| id | uuid | Primary key |
| organization_id | uuid | FK to organizations |
| grantor_name | text | Grantor organization name |
| grantor_contact | text | Contact person |
| grantor_email | text | Contact email |
| grant_name | text | Name of the grant |
| grant_number | text | Reference number |
| award_date | date | When grant was awarded |
| expected_date | date | Expected payment date |
| amount | numeric | Total grant amount |
| amount_received | numeric | Amount received so far |
| description | text | Notes |
| fund_id | uuid | Optional FK to funds |
| status | text | awarded/partial/received/written_off/cancelled |
| is_restricted | boolean | Whether funds are restricted |
| restriction_details | text | Details of restrictions |
| report_due_date | date | When report is due |
| report_submitted_at | timestamp | When report was submitted |
| accrual_journal_entry_id | uuid | FK to journal entry |
| created_by | uuid | FK to users |
| written_off_at | timestamp | When written off |
| written_off_by | uuid | Who wrote it off |
| write_off_reason | text | Reason for write-off |
| created_at | timestamp | Record created |
| updated_at | timestamp | Record updated |
grant_receivable_payments table
| Column | Type | Description |
|--------|------|-------------|
| id | uuid | Primary key |
| grant_receivable_id | uuid | FK to grants_receivable |
| payment_date | date | Payment date |
| amount | numeric | Payment amount |
| deposit_id | uuid | Optional FK to deposits |
| check_number | text | Check number |
| journal_entry_id | uuid | FK to journal entry |
| memo | text | Notes |
| created_by | uuid | FK to users |
| created_at | timestamp | Record created |
| updated_at | timestamp | Record updated |
Integration with A/R Aging
Grants with status 'awarded' or 'partial' appear in the A/R Aging Report:
- Grouped by grantor
- Aged based on expected_date
- Balance = amount - amount_received
Restricted vs Unrestricted Grants
- Restricted grants have specific use requirements set by the grantor
- The
is_restrictedflag andrestriction_detailsfield track these requirements - Restricted grants may require separate fund tracking
Related Documentation
- 00-fund-accounting.md - Accounting Hub overview
- 12-PLEDGES-MANAGER.md - Pledges (A/R counterpart)
- 11-BILLS-MANAGER.md - Bills (A/P)
- ../reports/11-AGING-REPORT.md - A/P and A/R Aging Report
Synced from IFMmvp-Frontend documentation: pages/accounting/13-GRANTS-RECEIVABLE-MANAGER.md
Ready to Get Started?
See how Alignmint can simplify your nonprofit's operations. Schedule a free demo with our team and we'll walk you through everything.
Questions? Email us at steven@getalignmint.org