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).
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.
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 · CONTACTS · CONTACT_INDIVIDUALS · GIFT_DESIGNATIONS · PROJECTS · SEGMENTS (boundary)
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 Gifts — extended reference.
| 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 |
One row per giving unit (household or organization). Pre-aggregated giving totals are available directly on this table. For all contact-related tables, see Contacts — extended reference.
| 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 |
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 Campaigns — extended reference.
| 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 |
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.