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 fieldsPurchaseOrder.*— expands to include all transaction custom fields
Integration codes appear as columns in payout export reports and document template merge fields.