Skip to main content
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.

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 Contacts — extended reference.

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.

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.

PROJECTS

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

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.
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.
Last modified on May 22, 2026