Skip to main content

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?
}) → grantId

Update

updateGrantReceivable(grantId, updates) → void

Record Payment

recordGrantReceivablePayment(grantId, amount, paymentDate, depositId?, checkNumber?, memo?) → void

Write Off

writeOffGrantReceivable(grantId, reason, userId) → void

Database 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_restricted flag and restriction_details field track these requirements
  • Restricted grants may require separate fund tracking

Related Documentation


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

Ready to get started?Start Plus Trial