> ## Documentation Index
> Fetch the complete documentation index at: https://docs.virtuous.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Gifts

> All tables in the gifts hub — transactions, designations, commitments, batches, grants, tributes, and premiums.

<Note>
  **Grain:** `GIFTS` — one row per posted gift transaction. `GIFT_DESIGNATIONS` — one row per project split within a gift (a gift can have multiple rows).
</Note>

`GIFTS` is the central financial fact table. This page maps every table that connects to it — how money arrives (recurring commitments, pledges), where it goes (designations to projects), and what is attached to it (grant records, tributes, premium fulfillments, entry batches).

> **Solid lines** — required join (FK always populated). **Dotted lines** — optional join (FK is nullable; always use `LEFT JOIN`).

```mermaid theme={null}
flowchart TD
    GIFTS:::hub

    RECURRING_GIFT_DESIGNATIONS -->|"RECURRING_GIFT_KEY"| RECURRING_GIFTS
    RECURRING_GIFTS -->|"RECURRING_GIFT_KEY"| RECURRING_GIFT_PAYMENTS
    RECURRING_GIFT_PAYMENTS -.->|"GIFT_KEY"| GIFTS

    PLEDGES -.->|"GIFT_ASK_KEY"| GIFT_ASKS
    PLEDGES -->|"PLEDGE_KEY"| PLEDGE_PAYMENTS
    PLEDGE_PAYMENTS -.->|"GIFT_KEY"| GIFTS
    GIFT_ASKS -.->|"GIFT_ASK_KEY"| GIFTS

    GIFTS -->|"GIFT_KEY"| GIFT_DESIGNATIONS
    GIFTS -->|"GIFT_KEY"| GIFT_PREMIUMS
    GIFTS -->|"GIFT_BATCH_KEY"| GIFT_BATCHES
    GIFTS -.->|"GRANT_KEY"| GRANTS
    GIFTS -.->|"TRIBUTE_KEY"| TRIBUTES
    GIFT_DESIGNATIONS -->|"PROJECT_KEY"| PROJECTS
    RECURRING_GIFT_DESIGNATIONS -->|"PROJECT_KEY"| PROJECTS

    classDef hub fill:#00A3E0,color:#ffffff,stroke:#081F2C
    classDef entity fill:#CEE7F2,color:#243746,stroke:#41B6E6
    class RECURRING_GIFT_DESIGNATIONS,RECURRING_GIFTS,RECURRING_GIFT_PAYMENTS,PLEDGES,GIFT_ASKS,PLEDGE_PAYMENTS,GIFT_DESIGNATIONS,GIFT_PREMIUMS,GIFT_BATCHES,GRANTS,TRIBUTES,PROJECTS entity
```

## Table columns

**Tables on this page:** [GIFTS](#gifts) · [GIFT\_DESIGNATIONS](#gift-designations) · [PROJECTS](#projects) · [GIFT\_BATCHES](#gift-batches) · [GIFT\_ASKS](#gift-asks) · [PLEDGES](#pledges) · [PLEDGE\_PAYMENTS](#pledge-payments) · [RECURRING\_GIFTS](#recurring-gifts) · [RECURRING\_GIFT\_PAYMENTS](#recurring-gift-payments) · [RECURRING\_GIFT\_DESIGNATIONS](#recurring-gift-designations) · [GRANTS](#grants) · [TRIBUTES](#tributes) · [GIFT\_PREMIUMS](#gift-premiums)

#### **GIFTS**

One row per posted gift transaction. The amount on `GIFTS` is the total; split across projects via `GIFT_DESIGNATIONS`.

| **Column**               | **Type**  | **Notes**                                                                            |
| :----------------------- | :-------- | :----------------------------------------------------------------------------------- |
| `GIFT_KEY`               | TEXT      | Primary key                                                                          |
| `CONTACT_KEY`            | TEXT      | FK → CONTACTS — the giving unit                                                      |
| `CONTACT_INDIVIDUAL_KEY` | TEXT      | FK → CONTACT\_INDIVIDUALS (optional) — specific person if recorded at entry          |
| `SEGMENT_KEY`            | TEXT      | FK → SEGMENTS (optional) — campaign attribution entry point                          |
| `GIFT_ASK_KEY`           | TEXT      | FK → GIFT\_ASKS (optional) — the ask this gift fulfills                              |
| `GIFT_BATCH_KEY`         | TEXT      | FK → GIFT\_BATCHES (optional) — entry batch this gift was part of                    |
| `GRANT_KEY`              | TEXT      | FK → GRANTS (optional) — linked grant record                                         |
| `TRIBUTE_KEY`            | TEXT      | FK → TRIBUTES (optional) — in-honor-of or in-memory-of tribute                       |
| `GIFT_DATE_UTC`          | TIMESTAMP | Date the gift was made                                                               |
| `RECEIPT_DATE_UTC`       | TIMESTAMP | Date the gift was receipted                                                          |
| `THANK_YOU_DATE_UTC`     | TIMESTAMP | Date a thank-you was sent                                                            |
| `AMOUNT`                 | NUMBER    | Total gift amount                                                                    |
| `GIFT_TYPE`              | NUMBER    | Payment method — decode with TYPE\_REFERENCES (Entity: `Gift`, Property: `GiftType`) |
| `FAIR_MARKET_VALUE`      | NUMBER    | Fair market value of any premium received — typically non-tax-deductible             |
| `CHECK_NUMBER`           | TEXT      | Check number for check gift types                                                    |
| `ACCOUNTING_CODE`        | TEXT      | External accounting code                                                             |
| `TRANSACTION_SOURCE`     | TEXT      | Source platform name (e.g. third-party processor)                                    |
| `CREDIT_CARD_TYPE`       | TEXT      | Credit card type for credit gifts                                                    |
| `CURRENCY_CODE`          | TEXT      | Currency code                                                                        |
| `TICKER_SYMBOL`          | TEXT      | Stock ticker symbol (stock gifts)                                                    |
| `NUMBER_OF_SHARES`       | NUMBER    | Shares received (stock gifts)                                                        |
| `CRYPTOCOIN_TYPE`        | TEXT      | Cryptocurrency type (crypto gifts)                                                   |
| `GIFT_IS_DELETED`        | BOOLEAN   | Soft delete flag — always filter `WHERE GIFT_IS_DELETED = FALSE`                     |
| `GIFT_IS_PRIVATE`        | BOOLEAN   | Gift is marked private                                                               |
| `GIFT_IS_TAX_DEDUCTIBLE` | BOOLEAN   | Gift is tax-deductible                                                               |

#### **GIFT\_DESIGNATIONS**

One row per project split within a gift. A single gift can have multiple designation rows. `AMOUNT_DESIGNATED` across all rows for a gift sums to `GIFTS.AMOUNT`.

| **Column**                    | **Type** | **Notes**                                                                    |
| :---------------------------- | :------- | :--------------------------------------------------------------------------- |
| `GIFT_DESIGNATION_KEY`        | TEXT     | Primary key                                                                  |
| `GIFT_KEY`                    | TEXT     | FK → GIFTS                                                                   |
| `PROJECT_KEY`                 | TEXT     | FK → PROJECTS — the fund this portion goes to                                |
| `AMOUNT_DESIGNATED`           | NUMBER   | Amount allocated to this project                                             |
| `CURRENCY_CODE`               | TEXT     | Currency code                                                                |
| `GIFT_DESIGNATION_IS_DELETED` | BOOLEAN  | Soft delete flag — always filter `WHERE GIFT_DESIGNATION_IS_DELETED = FALSE` |

#### **PROJECTS**

One row per fund or program. The destination for gift designations and recurring gift designations.

| **Column**                  | **Type**  | **Notes**                                                        |
| :-------------------------- | :-------- | :--------------------------------------------------------------- |
| `PROJECT_KEY`               | TEXT      | Primary key                                                      |
| `NAME`                      | TEXT      | Project name                                                     |
| `DESCRIPTION`               | TEXT      | Extended description                                             |
| `TYPE`                      | TEXT      | Project type                                                     |
| `REVENUE_ACCOUNTING_CODE`   | TEXT      | Accounting code for revenue recognition                          |
| `EXTERNAL_ACCOUNTING_CODE`  | TEXT      | External system accounting code                                  |
| `BEGINNING_BALANCE`         | NUMBER    | Opening balance                                                  |
| `CURRENT_BALANCE`           | NUMBER    | Current running balance                                          |
| `START_DATE`                | TIMESTAMP | Project start date                                               |
| `END_DATE`                  | TIMESTAMP | Project end date                                                 |
| `PROJECT_IS_ACTIVE`         | BOOLEAN   | Whether the project is currently active                          |
| `PROJECT_IS_DEFAULT`        | BOOLEAN   | Whether this is the default project for unspecified designations |
| `PROJECT_IS_DELETED`        | BOOLEAN   | Soft delete flag                                                 |
| `PROJECT_IS_TAX_DEDUCTIBLE` | BOOLEAN   | Gifts to this project are tax-deductible                         |

#### **GIFT\_BATCHES**

One row per entry batch — a named group of gifts entered together. Useful for reconciliation and audit workflows.

| **Column**              | **Type** | **Notes**                               |
| :---------------------- | :------- | :-------------------------------------- |
| `GIFT_BATCH_KEY`        | TEXT     | Primary key                             |
| `BATCH`                 | TEXT     | Batch reference ID or name              |
| `TOTAL`                 | NUMBER   | Total gift count or amount in the batch |
| `GIFT_BATCH_IS_DELETED` | BOOLEAN  | Soft delete flag                        |

#### **GIFT\_ASKS**

One row per formal solicitation made to a contact. Linked optionally to `GIFTS` (when the ask is fulfilled) and `PLEDGES` (when the ask results in a pledge).

| **Column**                  | **Type**  | **Notes**                                                |
| :-------------------------- | :-------- | :------------------------------------------------------- |
| `GIFT_ASK_KEY`              | TEXT      | Primary key                                              |
| `CONTACT_KEY`               | TEXT      | FK → CONTACTS — the contact being solicited              |
| `PROJECT_KEY`               | TEXT      | FK → PROJECTS — project the ask is for                   |
| `SEGMENT_KEY`               | TEXT      | FK → SEGMENTS (optional) — campaign segment for this ask |
| `ASK_DATE`                  | TIMESTAMP | Date the ask was made                                    |
| `EXPECTED_FULFILLMENT_DATE` | TIMESTAMP | Expected date the ask will be fulfilled                  |
| `ASK_AMOUNT`                | NUMBER    | Amount requested                                         |
| `ASK_TYPE`                  | TEXT      | Type of ask (e.g. Major Gift, Annual Fund)               |
| `PROBABILITY_TO_CLOSE`      | NUMBER    | Likelihood of fulfillment (0–100)                        |
| `STATUS`                    | TEXT      | Current status text                                      |
| `DECLINED`                  | BOOLEAN   | True if the ask was declined                             |
| `GIFT_ASK_IS_DELETED`       | BOOLEAN   | Soft delete flag                                         |

#### **PLEDGES**

One row per pledge commitment. A pledge can exist without a gift ask — always use `LEFT JOIN` when connecting to `GIFT_ASKS`. Track fulfillment via `PLEDGE_PAYMENTS`.

| **Column**                  | **Type**  | **Notes**                                                                                 |
| :-------------------------- | :-------- | :---------------------------------------------------------------------------------------- |
| `PLEDGE_KEY`                | TEXT      | Primary key                                                                               |
| `CONTACT_KEY`               | TEXT      | FK → CONTACTS                                                                             |
| `GIFT_ASK_KEY`              | TEXT      | FK → GIFT\_ASKS (optional) — the ask that generated this pledge; always LEFT JOIN         |
| `PROJECT_KEY`               | TEXT      | FK → PROJECTS                                                                             |
| `PLEDGE_DATE`               | TIMESTAMP | Date the pledge was made                                                                  |
| `EXPECTED_FULFILLMENT_DATE` | TIMESTAMP | Expected date pledge will be fully paid                                                   |
| `CANCEL_DATE_TIME_UTC`      | TIMESTAMP | Date the pledge was cancelled                                                             |
| `WRITE_OFF_DATE_TIME_UTC`   | TIMESTAMP | Date the pledge was written off                                                           |
| `AMOUNT_PLEDGED`            | NUMBER    | Total commitment amount                                                                   |
| `BALANCE`                   | NUMBER    | Remaining unfulfilled amount                                                              |
| `FREQUENCY`                 | NUMBER    | Payment schedule — decode with TYPE\_REFERENCES (Entity: `Pledge`, Property: `Frequency`) |
| `STATUS`                    | NUMBER    | Current status — decode with TYPE\_REFERENCES (Entity: `Pledge`, Property: `Status`)      |
| `WRITE_OFF_AMOUNT`          | NUMBER    | Amount written off                                                                        |
| `WRITE_OFF_REASON`          | TEXT      | Reason for write-off                                                                      |
| `PLEDGE_IS_DELETED`         | BOOLEAN   | Soft delete flag — always filter `WHERE PLEDGE_IS_DELETED = FALSE`                        |

#### **PLEDGE\_PAYMENTS**

One row per scheduled installment against a pledge. A null `GIFT_KEY` means the installment was expected but not yet received.

| **Column**                      | **Type**  | **Notes**                                                            |
| :------------------------------ | :-------- | :------------------------------------------------------------------- |
| `PLEDGE_PAYMENT_KEY`            | TEXT      | Primary key                                                          |
| `PLEDGE_KEY`                    | TEXT      | FK → PLEDGES                                                         |
| `GIFT_KEY`                      | TEXT      | FK → GIFTS (nullable) — null = installment expected but not received |
| `EXPECTED_PAYMENT_DATE`         | TIMESTAMP | Date the installment was expected                                    |
| `FULFILL_PAYMENT_DATE_TIME_UTC` | TIMESTAMP | Date the installment was actually paid                               |
| `EXPECTED_AMOUNT`               | NUMBER    | Amount expected for this installment                                 |
| `ACTUAL_AMOUNT`                 | NUMBER    | Amount actually received                                             |
| `PLEDGE_PAYMENT_IS_DELETED`     | BOOLEAN   | Soft delete flag                                                     |

#### **RECURRING\_GIFTS**

One row per standing recurring commitment — the amount, frequency, and current status. Individual payment instances are tracked in `RECURRING_GIFT_PAYMENTS`.

| **Column**                   | **Type**  | **Notes**                                                                                        |
| :--------------------------- | :-------- | :----------------------------------------------------------------------------------------------- |
| `RECURRING_GIFT_KEY`         | TEXT      | Primary key                                                                                      |
| `CONTACT_KEY`                | TEXT      | FK → CONTACTS                                                                                    |
| `SEGMENT_KEY`                | TEXT      | FK → SEGMENTS (optional) — campaign attribution                                                  |
| `RECURRING_GIFT_DATE`        | TIMESTAMP | Date the recurring gift was established                                                          |
| `NEXT_EXPECTED_PAYMENT_DATE` | TIMESTAMP | Date of the next scheduled payment — key field for lapse detection                               |
| `LAST_PAYMENT_DATE`          | TIMESTAMP | Date of the most recent received payment                                                         |
| `CANCEL_DATE_TIME_UTC`       | TIMESTAMP | Date the recurring gift was cancelled                                                            |
| `AMOUNT`                     | NUMBER    | Per-payment commitment amount                                                                    |
| `BALANCE`                    | NUMBER    | Running balance (if applicable)                                                                  |
| `FREQUENCY`                  | NUMBER    | Payment schedule — decode with TYPE\_REFERENCES (Entity: `RecurringGift`, Property: `Frequency`) |
| `STATUS`                     | NUMBER    | Current status — decode with TYPE\_REFERENCES (Entity: `RecurringGift`, Property: `Status`)      |
| `AUTOMATED_PAYMENTS`         | BOOLEAN   | Payments are processed automatically                                                             |
| `CANCELLATION_REASON`        | TEXT      | Reason for cancellation                                                                          |
| `RECURRING_GIFT_IS_DELETED`  | BOOLEAN   | Soft delete flag — always filter `WHERE RECURRING_GIFT_IS_DELETED = FALSE`                       |

#### **RECURRING\_GIFT\_PAYMENTS**

One row per scheduled payment instance against a recurring gift. A null `GIFT_KEY` means a payment was expected but not received — the primary signal for lapsed giving.

| **Column**                          | **Type**  | **Notes**                                                        |
| :---------------------------------- | :-------- | :--------------------------------------------------------------- |
| `RECURRING_GIFT_PAYMENT_KEY`        | TEXT      | Primary key                                                      |
| `RECURRING_GIFT_KEY`                | TEXT      | FK → RECURRING\_GIFTS                                            |
| `GIFT_KEY`                          | TEXT      | FK → GIFTS (nullable) — null = payment expected but not received |
| `EXPECTED_PAYMENT_DATE`             | TIMESTAMP | Date the payment was expected                                    |
| `FULFILL_PAYMENT_DATE`              | TIMESTAMP | Date the payment was actually made                               |
| `DISMISS_PAYMENT_DATE`              | TIMESTAMP | Date the payment was dismissed (skipped intentionally)           |
| `EXPECTED_AMOUNT`                   | NUMBER    | Amount expected based on the commitment                          |
| `ACTUAL_AMOUNT`                     | NUMBER    | Amount actually received                                         |
| `RECURRING_GIFT_PAYMENT_IS_DELETED` | BOOLEAN   | Soft delete flag                                                 |

#### **RECURRING\_GIFT\_DESIGNATIONS**

One row per project split on a recurring gift commitment. Mirrors `GIFT_DESIGNATIONS` but lives on the commitment, not individual transactions.

| **Column**                       | **Type** | **Notes**                                                   |
| :------------------------------- | :------- | :---------------------------------------------------------- |
| `RECURRING_GIFT_DESIGNATION_KEY` | TEXT     | Primary key                                                 |
| `RECURRING_GIFT_KEY`             | TEXT     | FK → RECURRING\_GIFTS                                       |
| `PROJECT_KEY`                    | TEXT     | FK → PROJECTS                                               |
| `AMOUNT_DESIGNATED`              | NUMBER   | Portion of the per-payment amount allocated to this project |

#### **GRANTS**

One row per grant record. Grants are linked to a gift (`GIFT_KEY`) when funds are received, and to a project (`PROJECT_KEY`) for the purpose.

| **Column**                 | **Type**  | **Notes**                                                                                    |
| :------------------------- | :-------- | :------------------------------------------------------------------------------------------- |
| `GRANT_KEY`                | TEXT      | Primary key                                                                                  |
| `GIFT_KEY`                 | TEXT      | FK → GIFTS — the gift that records the received funds                                        |
| `PROJECT_KEY`              | TEXT      | FK → PROJECTS — project the grant is for                                                     |
| `TITLE`                    | TEXT      | Grant title                                                                                  |
| `STATUS`                   | TEXT      | Current status                                                                               |
| `GRANT_TYPE`               | NUMBER    | Incoming or outgoing — decode with TYPE\_REFERENCES (Entity: `Grant`, Property: `GrantType`) |
| `TOTAL_ANTICIPATED_AMOUNT` | NUMBER    | Expected total award                                                                         |
| `AWARDED_AMOUNT`           | NUMBER    | Actual awarded amount                                                                        |
| `AWARDED_DATE_UTC`         | TIMESTAMP | Date the grant was awarded                                                                   |
| `DUE_DATE_UTC`             | TIMESTAMP | Application or reporting due date                                                            |
| `SUBMISSION_DATE_UTC`      | TIMESTAMP | Date the application was submitted                                                           |
| `AWARDED_GRANT`            | BOOLEAN   | True if the grant was awarded                                                                |
| `DESCRIPTION`              | TEXT      | Extended description                                                                         |
| `GRANT_IS_DELETED`         | BOOLEAN   | Soft delete flag                                                                             |

#### **TRIBUTES**

One row per tribute record — gifts made in honor of or in memory of an individual. Linked to the honoree via `CONTACT_INDIVIDUAL_KEY`.

| **Column**               | **Type** | **Notes**                                                                                            |
| :----------------------- | :------- | :--------------------------------------------------------------------------------------------------- |
| `TRIBUTE_KEY`            | TEXT     | Primary key                                                                                          |
| `CONTACT_INDIVIDUAL_KEY` | TEXT     | FK → CONTACT\_INDIVIDUALS — the person being honored                                                 |
| `TRIBUTE_TYPE`           | NUMBER   | In Honor Of or In Memory Of — decode with TYPE\_REFERENCES (Entity: `Gift`, Property: `TributeType`) |
| `FIRST_NAME`             | TEXT     | First name of the honoree                                                                            |
| `LAST_NAME`              | TEXT     | Last name of the honoree                                                                             |
| `TOTAL_GIFTS`            | NUMBER   | Count of gifts associated with this tribute                                                          |
| `TOTAL_GIFT_AMOUNT`      | NUMBER   | Total giving associated with this tribute                                                            |
| `TRIBUTE_IS_DELETED`     | BOOLEAN  | Soft delete flag                                                                                     |

#### **GIFT\_PREMIUMS**

One row per premium item fulfilled as part of a gift (e.g. a thank-you gift sent to the donor). Links the gift to the premium catalog item.

| **Column**                | **Type** | **Notes**                                  |
| :------------------------ | :------- | :----------------------------------------- |
| `GIFT_PREMIUM_KEY`        | TEXT     | Primary key                                |
| `GIFT_KEY`                | TEXT     | FK → GIFTS                                 |
| `PREMIUM_KEY`             | TEXT     | FK → PREMIUMS — the catalog item fulfilled |
| `QUANTITY`                | NUMBER   | Number of items sent                       |
| `TOTAL_VALUE`             | NUMBER   | Total value of premiums sent               |
| `GIFT_PREMIUM_IS_DELETED` | BOOLEAN  | Soft delete flag                           |

<Tip>
  **Data freshness:** These tables sync continuously from Virtuous CRM. Typical lag is under 4 hours. To check when a record was last updated, inspect the `SF__ROW_SYNCED_DATE_TIME_UTC` column on any table.
</Tip>
