Where Custom Fields Live

This page maps every custom field extension point: where the field is defined, and where the values are stored.

The Data Flow Map

Defined on          →    Values stored on
─────────────────────────────────────────────────────────────
Account             →    Contact record
                         (all contacts in the account)

Account             →    Organization record
                         (all organizations in the account)

Organization        →    Employee Relationship record
                         (employees of that specific org;
                          collected on import or on form)

Fund                →    Fund record
                         (GL metadata, reporting codes)

Campaign (Form)     →    Transaction (PurchaseOrder)
                         (all transactions from this form)

Item (OrderableItem)→    Order Item (line item)
                         (collected when donor selects item)

Item (OrderableItem)→    Transaction (PurchaseOrder)
                         (added to the whole order when
                          this item is selected)

Integration Codes   →    Campaign / Item / Payment Method
                         (hidden; not shown to donors)

What This Means in Practice

A field defined on the Account (Contact type) appears on every Contact record in the account. One definition — universal application. Change the definition once and it updates everywhere.

A field defined on a Campaign collects data once per transaction from that form. Every order placed through that form carries these values. Useful for campaign-specific tracking.

A field defined on an Item collects data once per line item. A donor who adds three different items to their cart gets three independent sets of item-level field values — one per selection.

An integration code is invisible to donors. It lives on the template record (Campaign, Item, Payment Method) and carries configuration data or identifiers that scripts and reports use.

Accessing Values

Record Access Pattern in Scripts
Contact custom field contact.get('FieldName').value
Organization custom field organization.get('FieldName').value
Employee relationship field employeeRelationship.get('FieldName').value
Fund custom field fund.get('FieldName').value
Transaction custom field purchaseOrder.get('FieldName').value
Order Item custom field orderItem.get('FieldName').value
Item integration code orderItem.orderableItem.get('FieldName').value
Campaign integration code campaign.get('FieldName').value
Long text fields Use .text instead of .value

In Reports

Custom field values appear automatically as selectable columns in list views for the record type they are defined on. In report queries, use the wildcard notation to include all custom fields:

  • Contact.* — expands to include all contact custom fields
  • PurchaseOrder.* — expands to include all transaction custom fields

Integration codes appear as columns in payout export reports and document template merge fields.