> ## 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.

# Core Gift Transaction

> The tables involved in recording and analyzing a gift — from the contact who gave, through the gift record, to the projects it was designated to.

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

Every gift in Virtuous follows this path: a **Contact** makes a **Gift**, which is split into one or more **Gift Designations** that route the money to **Projects**. This diagram covers the tables you need for nearly every giving report.

> **Key rule:** Never query `GIFTS` alone for project-level data. Always join through `GIFT_DESIGNATIONS` — a single gift can be split across multiple projects.

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

    CONTACTS -->|"CONTACT_KEY"| GIFTS
    CONTACTS -->|"CONTACT_KEY"| CONTACT_INDIVIDUALS
    GIFTS -.->|"CONTACT_INDIVIDUAL_KEY"| CONTACT_INDIVIDUALS
    GIFTS -->|"GIFT_KEY"| GIFT_DESIGNATIONS
    GIFT_DESIGNATIONS -->|"PROJECT_KEY"| PROJECTS
    GIFTS -.->|"SEGMENT_KEY"| SEGMENTS

    classDef hub fill:#00A3E0,color:#ffffff,stroke:#081F2C
    classDef entity fill:#CEE7F2,color:#243746,stroke:#41B6E6
    class CONTACTS,CONTACT_INDIVIDUALS,GIFT_DESIGNATIONS,PROJECTS,SEGMENTS entity
```

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

## Table columns

**Tables on this page:** [GIFTS](#gifts) · [CONTACTS](#contacts) · [CONTACT\_INDIVIDUALS](#contact-individuals) · [GIFT\_DESIGNATIONS](#gift-designations) · [PROJECTS](#projects) · [SEGMENTS (boundary)](#segments)

## Related queries

* [Gift history for a contact](/queries/gift-history)
* [Giving summary by project](/queries/giving-by-project)
* [New donors in a date range](/queries/new-donors)
* [Gift designation breakdown](/queries/gift-designation-breakdown)

#### **GIFTS**

One row per posted gift transaction. The amount on `GIFTS` is the total; split across projects via `GIFT_DESIGNATIONS`. For the full gifts hub with all connected tables, see [<u>Gifts — extended reference</u>](https://github.com/jgunkelvirtuous/mintlify-virtuous-data-documentation/blob/main/data-models/reference/gifts).

| **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_DATE_UTC`          | TIMESTAMP | Date the gift was made                                                               |
| `AMOUNT`                 | NUMBER    | Total gift amount                                                                    |
| `GIFT_TYPE`              | NUMBER    | Payment method — decode with TYPE\_REFERENCES (Entity: `Gift`, Property: `GiftType`) |
| `GIFT_IS_DELETED`        | BOOLEAN   | Soft delete flag — always filter `WHERE GIFT_IS_DELETED = FALSE`                     |
| `GIFT_IS_TAX_DEDUCTIBLE` | BOOLEAN   | Gift is tax-deductible                                                               |

#### **CONTACTS**

One row per giving unit (household or organization). Pre-aggregated giving totals are available directly on this table. For all contact-related tables, see [<u>Contacts — extended reference</u>](https://github.com/jgunkelvirtuous/mintlify-virtuous-data-documentation/blob/main/data-models/reference/contacts).

| **Column**            | **Type**  | **Notes**                                                              |
| :-------------------- | :-------- | :--------------------------------------------------------------------- |
| `CONTACT_KEY`         | TEXT      | Primary key                                                            |
| `NAME`                | TEXT      | Contact display name                                                   |
| `CONTACT_TYPE`        | TEXT      | Customizable type — base types are Household, Foundation, Organization |
| `LIFE_TO_DATE_GIVING` | NUMBER    | Pre-aggregated total giving (all time)                                 |
| `YEAR_TO_DATE_GIVING` | NUMBER    | Pre-aggregated total giving (current calendar year)                    |
| `LAST_GIFT_DATE_UTC`  | TIMESTAMP | Date of the most recent gift                                           |
| `CONTACT_IS_DELETED`  | BOOLEAN   | Soft delete flag — always filter `WHERE CONTACT_IS_DELETED = FALSE`    |

#### **CONTACT\_INDIVIDUALS**

One row per person within a contact. Filter `CONTACT_INDIVIDUAL_IS_PRIMARY = TRUE` to get the main person. Email and phone live here, not on `CONTACTS`.

| **Column**                      | **Type** | **Notes**                                  |
| :------------------------------ | :------- | :----------------------------------------- |
| `CONTACT_INDIVIDUAL_KEY`        | TEXT     | Primary key                                |
| `CONTACT_KEY`                   | TEXT     | FK → CONTACTS                              |
| `FIRST_NAME`                    | TEXT     | First name                                 |
| `LAST_NAME`                     | TEXT     | Last name                                  |
| `PRIMARY_EMAIL`                 | TEXT     | Primary email address                      |
| `PRIMARY_PHONE`                 | TEXT     | Primary phone number                       |
| `CONTACT_INDIVIDUAL_IS_PRIMARY` | BOOLEAN  | True for the primary person on the contact |
| `CONTACT_INDIVIDUAL_IS_DELETED` | BOOLEAN  | Soft delete flag                           |

#### **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.

| **Column**                  | **Type** | **Notes**                                                        |
| :-------------------------- | :------- | :--------------------------------------------------------------- |
| `PROJECT_KEY`               | TEXT     | Primary key                                                      |
| `NAME`                      | TEXT     | Project name                                                     |
| `TYPE`                      | TEXT     | Project type                                                     |
| `CURRENT_BALANCE`           | NUMBER   | Current running balance                                          |
| `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                         |

#### **SEGMENTS**

`SEGMENTS` appears in this diagram as the campaign attribution link on `GIFTS.SEGMENT_KEY`. The full campaign hierarchy is documented in [<u>Campaigns — extended reference</u>](https://github.com/jgunkelvirtuous/mintlify-virtuous-data-documentation/blob/main/data-models/reference/campaigns).

| **Column**           | **Type** | **Notes**                                            |
| :------------------- | :------- | :--------------------------------------------------- |
| `SEGMENT_KEY`        | TEXT     | Primary key — also FK on `GIFTS.SEGMENT_KEY`         |
| `COMMUNICATION_KEY`  | TEXT     | FK → COMMUNICATIONS                                  |
| `NAME`               | TEXT     | Segment name (e.g. "Board Members", "Lapsed Donors") |
| `SEGMENT_IS_DELETED` | BOOLEAN  | Soft delete flag                                     |

## **Related queries**

* [<u>Gift history for a contact</u>](https://github.com/jgunkelvirtuous/mintlify-virtuous-data-documentation/blob/main/queries/gift-history)
* [<u>Giving summary by project</u>](https://github.com/jgunkelvirtuous/mintlify-virtuous-data-documentation/blob/main/queries/giving-by-project)
* [<u>New donors in a date range</u>](https://github.com/jgunkelvirtuous/mintlify-virtuous-data-documentation/blob/main/queries/new-donors)
* [<u>Gift designation breakdown</u>](https://github.com/jgunkelvirtuous/mintlify-virtuous-data-documentation/blob/main/queries/gift-designation-breakdown)

<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>
