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.
ColumnTypeNotes
GIFT_KEYTEXTPrimary key
CONTACT_KEYTEXTFK → CONTACTS — the giving unit
CONTACT_INDIVIDUAL_KEYTEXTFK → CONTACT_INDIVIDUALS (optional) — specific person if recorded at entry
SEGMENT_KEYTEXTFK → SEGMENTS (optional) — campaign attribution entry point
GIFT_DATE_UTCTIMESTAMPDate the gift was made
AMOUNTNUMBERTotal gift amount
GIFT_TYPENUMBERPayment method — decode with TYPE_REFERENCES (Entity: Gift, Property: GiftType)
GIFT_IS_DELETEDBOOLEANSoft delete flag — always filter WHERE GIFT_IS_DELETED = FALSE
GIFT_IS_TAX_DEDUCTIBLEBOOLEANGift 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 Contacts — extended reference.
ColumnTypeNotes
CONTACT_KEYTEXTPrimary key
NAMETEXTContact display name
CONTACT_TYPETEXTCustomizable type — base types are Household, Foundation, Organization
LIFE_TO_DATE_GIVINGNUMBERPre-aggregated total giving (all time)
YEAR_TO_DATE_GIVINGNUMBERPre-aggregated total giving (current calendar year)
LAST_GIFT_DATE_UTCTIMESTAMPDate of the most recent gift
CONTACT_IS_DELETEDBOOLEANSoft 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.
ColumnTypeNotes
CONTACT_INDIVIDUAL_KEYTEXTPrimary key
CONTACT_KEYTEXTFK → CONTACTS
FIRST_NAMETEXTFirst name
LAST_NAMETEXTLast name
PRIMARY_EMAILTEXTPrimary email address
PRIMARY_PHONETEXTPrimary phone number
CONTACT_INDIVIDUAL_IS_PRIMARYBOOLEANTrue for the primary person on the contact
CONTACT_INDIVIDUAL_IS_DELETEDBOOLEANSoft 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.
ColumnTypeNotes
GIFT_DESIGNATION_KEYTEXTPrimary key
GIFT_KEYTEXTFK → GIFTS
PROJECT_KEYTEXTFK → PROJECTS — the fund this portion goes to
AMOUNT_DESIGNATEDNUMBERAmount allocated to this project
CURRENCY_CODETEXTCurrency code
GIFT_DESIGNATION_IS_DELETEDBOOLEANSoft delete flag — always filter WHERE GIFT_DESIGNATION_IS_DELETED = FALSE

PROJECTS

One row per fund or program. The destination for gift designations.
ColumnTypeNotes
PROJECT_KEYTEXTPrimary key
NAMETEXTProject name
TYPETEXTProject type
CURRENT_BALANCENUMBERCurrent running balance
PROJECT_IS_ACTIVEBOOLEANWhether the project is currently active
PROJECT_IS_DEFAULTBOOLEANWhether this is the default project for unspecified designations
PROJECT_IS_DELETEDBOOLEANSoft delete flag
PROJECT_IS_TAX_DEDUCTIBLEBOOLEANGifts 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.
ColumnTypeNotes
SEGMENT_KEYTEXTPrimary key — also FK on GIFTS.SEGMENT_KEY
COMMUNICATION_KEYTEXTFK → COMMUNICATIONS
NAMETEXTSegment name (e.g. “Board Members”, “Lapsed Donors”)
SEGMENT_IS_DELETEDBOOLEANSoft 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.
Last modified on May 22, 2026