> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wegive.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Events, Tickets & Registrations

> Detailed mapping documentation for WeGive Events, Tickets, and Registrations to Salesforce custom objects

WeGive pushes event data to four custom objects that ship with the WeGive4SF managed package. The sync is **one-directional: WeGive to Salesforce.** Changes made to these records in Salesforce are not read back into WeGive.

| WeGive record | Salesforce object | What it holds |
| - | - | - |
| Event | `wegive__Event__c` | Event details, dates, location, and registration settings |
| Event Ticket | `wegive__Event_Ticket__c` | A ticket type (name, price, limit) belonging to an event |
| Event Registration | `wegive__Event_Registration__c` | One registrant's registration for an event, with total quantity and status |
| Registration Ticket | `wegive__Event_Registration_Ticket__c` | A line item under a registration: one ticket type, its quantity, unit price, and line amount |

<Note>
  These objects require WeGive4SF to be installed. See [Installing the WeGive Salesforce Managed Package](/external/onboarding/salesforce-npsp/install-setup/package-install).
</Note>

## Sync direction and triggers

Every object on this page is **export only** (WeGive to Salesforce). WeGive never polls Salesforce for events, tickets, or registrations, so edits made in Salesforce stay in Salesforce and are overwritten the next time WeGive pushes that record.

A record is pushed when it is created or updated in WeGive. Updates to a registration also re-push its registration tickets (see [Registration Tickets](#registration-tickets) for how removed line items are handled).

### Create versus update

Each WeGive record stores the Salesforce ID of its counterpart. If the ID is present, WeGive updates that Salesforce record. If it is absent, WeGive creates a new record and stores the returned ID. WeGive uses a lock per record during creation so a burst of simultaneous updates cannot create duplicates.

### Parent records are pushed first

Before pushing a child record, WeGive pushes any parent that does not yet have a Salesforce ID:

* A **ticket** pushes its event first.
* A **registration** pushes its event, each ticket type it references, and the registrant (Contact for an individual, Account for a company) first.
* A **registration ticket** pushes its ticket type first, and requires that its parent registration already exists in Salesforce.

### Deletions

Events, tickets, and registrations that are deleted in WeGive are **not** deleted in Salesforce. WeGive stamps `wegive__Deleted_At__c` and `wegive__Deleted_DateTime__c` on the Salesforce record instead, so the history is preserved.

Registration tickets are the exception. After each registration push, WeGive queries the registration's line items in Salesforce and **deletes** any that no longer exist in WeGive. This keeps quantities and line amounts in step when a registrant changes their ticket selection.

## Sync settings

Each object has its own push toggle under **Settings > Integrations > Salesforce NPSP > Sync Configuration > WeGive4Salesforce Pushes**. All four are typically enabled together.

| Toggle | Controls |
| - | - |
| **Push campaign events** | `wegive__Event__c` |
| **Push campaign event tickets** | `wegive__Event_Ticket__c` |
| **Push campaign event registrations** | `wegive__Event_Registration__c` |
| **Push campaign event registration tickets** | `wegive__Event_Registration_Ticket__c` |

<Warning>
  These settings depend on each other. If tickets are off but registration tickets are on, registration ticket pushes fail because the parent ticket type never receives a Salesforce ID. If tickets are off but registrations are on, registrations push without a ticket lookup. Turn the settings off from the bottom of the table up, never from the middle.
</Warning>

## Shared fields

Every object on this page receives these fields on each push.

| Salesforce field | Value |
| - | - |
| `wegive__WeGive_Id__c` | The WeGive record ID. Omitted when the object is shared across entities in a multi-entity org. |
| `wegive__Last_Sync_Date__c` | Timestamp of the most recent push from WeGive |
| `wegive__WeGive_Entity__c` | The WeGive entity, for multi-entity orgs only. Populated only if the field exists on the object; older package versions do not have it on the event objects. |

Events, tickets, and registrations (but not registration tickets) also receive `wegive__Created_At__c`, `wegive__Updated_At__c`, and `wegive__Deleted_At__c` as dates, plus `wegive__Created_DateTime__c`, `wegive__Updated_DateTime__c`, and `wegive__Deleted_DateTime__c` as full timestamps.

Salesforce limits `Name` to 80 characters and the WeGive text fields listed below to 255. WeGive truncates on push. The full value remains in WeGive.

## Events

**Salesforce object:** `wegive__Event__c`

| Salesforce field | WeGive field | Notes |
| - | - | - |
| `Name` | Event name | Truncated to 80 characters |
| `wegive__Description__c` | Description | Truncated to 255 characters |
| `wegive__Slug__c` | URL slug | The event's public URL path |
| `wegive__Access_Type__c` | Access type | Public or private |
| `wegive__Is_Opened__c` | Registration open | Whether the event is accepting registrations |
| `wegive__Max_Capacity__c` | Max capacity | |
| `wegive__Location__c` | Location type | `irl` (in person) or `virtual` |
| `wegive__Location_Address__c` | Location address | Full address. Populated only when location type is `irl`. |
| `wegive__Location_URL__c` | Location URL | Populated only when location type is `virtual` |
| `wegive__End_Date__c` | End date | Date only |
| `wegive__End_DateTime__c` | End date and time | Full timestamp |
| `wegive__Timezone__c` | Timezone | |
| `wegive__Has_Tickets__c` | Has tickets | |
| `wegive__One_Ticket_Per_Person__c` | One ticket per person | |
| `wegive__Company_Registrations__c` | Allow company registrations | |
| `wegive__Ask_Donations__c` | Ask for donations | Whether the registration flow asks for a gift |
| `wegive__Require_Registration_Waiver__c` | Require waiver | |
| `wegive__DS_Template_Id__c` | DocuSign template ID | Used with the waiver setting |
| `wegive__Show_Registration_Activity__c` | Show registration activity | |
| `wegive__Show_View_Events__c` | Show view event | |
| `wegive__Show_View_Tickets__c` | Show view tickets | |
| `wegive__Registration_Success_Title__c` | Registration success title | Truncated to 255 characters |
| `wegive__Registration_Success_Description__c` | Registration success description | Truncated to 255 characters |

WeGive custom fields on an event that have a Salesforce API name configured are also included in the push.

<Warning>
  **Start date/time is not synced today.** The managed package defines `wegive__Start_Date__c`, but `compileCampaignEventPayload()` never populates it — only `wegive__End_Date__c`/`wegive__End_DateTime__c` are pushed. This is a confirmed product gap, not intended behavior, and is a known issue. Until it's fixed, an event's start time is not visible anywhere in Salesforce.
</Warning>

## Event Tickets

**Salesforce object:** `wegive__Event_Ticket__c`

| Salesforce field | WeGive field | Notes |
| - | - | - |
| `Name` | Ticket name | Truncated to 80 characters |
| `wegive__Description__c` | Description | Truncated to 255 characters |
| `wegive__Event__c` | Event | Lookup to the parent `wegive__Event__c` |
| `wegive__Event_WeGive_Id__c` | Event WeGive ID | |
| `wegive__Price__c` | Price | WeGive stores cents; Salesforce receives dollars (10000 becomes 100.00) |
| `wegive__Limite__c` | Limit | Maximum number of this ticket type available. Blank means unlimited. The field API name is spelled `Limite` in the package. |

## Event Registrations

**Salesforce object:** `wegive__Event_Registration__c`

| Salesforce field | WeGive field | Notes |
| - | - | - |
| `Name` | Derived | `Registrant name - Event name`, truncated to 80 characters |
| `wegive__Contact__c` | Registrant | Lookup to the registrant's Contact. See the note on company registrants below. |
| `wegive__WeGive_Donor_Id__c` | Registrant WeGive ID | |
| `wegive__Event__c` | Event | Lookup to the parent `wegive__Event__c` |
| `wegive__WeGive_Event_Id__c` | Event WeGive ID | |
| `wegive__Event_Ticket__c` | Ticket type | Lookup to `wegive__Event_Ticket__c`. Populated only when the registration contains a single ticket type. |
| `wegive__Event_Ticket_WeGive_Id__c` | Ticket type WeGive ID | Same rule as above |
| `wegive__Quantity__c` | Quantity | Total tickets across all ticket types on the registration |
| `wegive__Status__c` | Status | WeGive's registration status, passed through as-is |
| `wegive__Transaction_Id__c` | Transaction ID | The **WeGive** transaction ID for the payment, if any. This is a text field, not a lookup to the Opportunity. To find the Opportunity, match this value against `wegive__WeGive_Id__c` on Opportunity. |

WeGive custom fields on a registration that have a Salesforce API name configured are also included in the push.

<Note>
  `wegive__Status__c` is passed through as-is from the WeGive registration's own status values: `approved`, `rejected`, `attended`, `pending`, `waitlisted`, `unregistered`, `canceled` (confirmed against `CampaignEventRegistration`'s status validation rule and its `attending()` scope). No translation or mapping table exists — whatever value the registration carries in WeGive is exactly what lands in Salesforce.
</Note>

### Registrations with more than one ticket type

When a registrant selects two or more ticket types in a single registration, WeGive leaves `wegive__Event_Ticket__c` and `wegive__Event_Ticket_WeGive_Id__c` blank on the registration record. The per-ticket detail lives on the registration ticket line items instead. Reports that need ticket-level detail should be built on `wegive__Event_Registration_Ticket__c`, not on the registration.

### Company registrants

When an event allows company registrations and a company registers, WeGive pushes the company's Account if it does not already exist in Salesforce. However, the registration record only has a Contact lookup (`wegive__Contact__c`), and a company has no Contact ID, so **company registrations arrive in Salesforce with an empty Contact lookup.** The registration is still identifiable through `wegive__WeGive_Donor_Id__c`, which holds the company's WeGive ID.

## Registration Tickets

**Salesforce object:** `wegive__Event_Registration_Ticket__c`

One record per ticket type on a registration. A registration with three General Admission tickets and one VIP ticket produces two registration ticket records.

| Salesforce field | WeGive field | Notes |
| - | - | - |
| `wegive__Event_Registration__c` | Registration | Lookup to the parent `wegive__Event_Registration__c` |
| `wegive__WeGive_Registration_Id__c` | Registration WeGive ID | |
| `wegive__Event_Ticket__c` | Ticket type | Lookup to `wegive__Event_Ticket__c` |
| `wegive__Event_Ticket_WeGive_Id__c` | Ticket type WeGive ID | |
| `wegive__Quantity__c` | Quantity | Quantity of this ticket type. Line items with a quantity of zero are not pushed. |
| `wegive__Unit_Price__c` | Unit price | |
| `wegive__Line_Amount__c` | Line amount | Quantity multiplied by unit price |

The fields above are the defaults. Registration tickets are the only event object whose custom mapping rules are applied on push. See [Data Mapping Overview](/external/onboarding/salesforce-npsp/data-mapping/overview).

<Warning>
  The **Mapping Rules** tab also lists rule sets for Campaign Events, Campaign Event Tickets, and Campaign Event Registrations and lets you add rules to them. Rules added to those three objects are saved but are not applied when the record is pushed. To send an additional field on an event or registration, create a WeGive custom field on that object and set its Salesforce API name instead. Because all four event objects are push-only, a rule direction of Bi-directional or Import only has no effect on any of them. Tracked internally as WEG-8284.
</Warning>

## Troubleshooting

**An event, ticket, or registration is not appearing in Salesforce.** Check that the corresponding push setting is enabled, and that WeGive4SF is installed with the WeGive Admin permission set assigned to the integration user. The record must have been created or updated in WeGive since the setting was turned on; enabling a setting does not backfill existing records.

**Registration tickets fail with a "no Salesforce event ticket" error.** The ticket push setting is off, or the ticket type failed to push. Enable ticket pushes and update the registration in WeGive to retry.

**A registration has no ticket type.** Either the registrant selected more than one ticket type (expected; see above) or the ticket push setting was off when the registration was pushed.

**A registration has no Contact.** The registrant is a company. See [Company registrants](#company-registrants).

**A change made in Salesforce disappeared.** Expected. These objects are push-only, and WeGive overwrites the Salesforce record on its next push.

**Ticket prices look 100 times too large or too small.** WeGive stores prices in cents and converts to dollars on push. If a mapping rule on registration tickets overrides `wegive__Unit_Price__c` or `wegive__Line_Amount__c`, check that the rule does not pass the raw cent value.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.