Appearance
Adding Attendees in Batch
This guide walks you through building an event guest list in batch, either by entering guests manually or importing a spreadsheet.
An attendee is a seat on your guest list. Unlike a ticket, an attendee does not have to come from a purchase — a guest list you were handed by a sponsor, or a room list from a previous year, is exactly what this is for.
Creating a New Batch
- Go to Data > Batch Import
- Click Create and confirm — the batch is named with the date and time; rename it on the batch page if you like (e.g., "Gala Guest List")
- Under What do you want to import?, choose Attendees
Adding Attendees Manually
Click Add Attendee Row to open the form. Fill in the required fields and any optional information.
Campaign & Seating
| Field | Description |
|---|---|
| Campaign | The campaign (event) this guest belongs to (required) |
| Table | Optionally seat the guest at a table that already exists in this event's seating plan |
Attendee Details
| Field | Description |
|---|---|
| First Name | Guest's first name (required) |
| Last Name | Guest's last name (required) |
| Guest's email address — optional, unlike ticket import | |
| Phone | Guest's phone number |
| Type | Guest, Host, or VIP (required) |
| Status | Invited, Confirmed, Checked In, Checked Out, No Show, or Cancelled (required) |
| Created Date | When the guest was added — defaults to now (required) |
| Ticketing Form | Which form's guest questions this person is asked — optional; leave blank and they are asked nothing |
Additional Fields
| Field | Description |
|---|---|
| Contact | Link to an existing contact (optional — a new contact is created if not linked) |
| Notes | Internal admin notes, not shown to the guest |
| Tags | Add attendee tags |
Editing and Removing Rows
- Edit: Click anywhere on a row to open the form and make changes
- Delete: Click the trash icon on the right side of a row
Importing from Spreadsheet
For a full guest list, importing a spreadsheet is faster:
- Click Import from Spreadsheet at the bottom of the batch
- Select your CSV or Excel file
- Map your columns to the correct fields (if needed)
- Review the imported rows — including any warnings
- Click Process Batch when the rows look right
See Importing from Spreadsheet for detailed instructions on the import process.
Supported CSV Columns
Required
| Column | Description |
|---|---|
first_name | Guest's first name |
last_name | Guest's last name. With no email, the first and last name are what link the guest to a contact |
campaign_id | Campaign ID (GUID) |
Optional
| Column | Description |
|---|---|
email | Guest's email address — a guest with no email still imports |
phone | Guest's phone number |
type | guest, host, or vip (defaults to guest) |
attendee_status | invited, confirmed, checked_in, checked_out, no_show, or cancelled |
seating_table | Table name or number — see Seating guests from a spreadsheet |
seating_plan | Which seating plan the table is in — only needed if the event has more than one |
ticketing_form | Form name — sets which guest questions this person is asked. Leave blank and they are asked nothing |
bidder_number | Paddle number the guest bids with. An existing number on the event's site links to that bidder; a new number creates one. Two guests with the same number share one paddle. Needs an event with one auction site (or only one site) |
notes | Internal admin notes |
created_at | Date added, in YYYY-MM-DD format (defaults to now) |
TIP
Email is optional for attendees. A guest list routinely arrives with names but no addresses, and the seat is still real. A row with a name and no email still imports and still creates a contact.
Tags (numbered, via column mapping)
| Column | Description |
|---|---|
attendee_tag_1 | Tag name to apply to the guest |
attendee_tag_2 | Second tag for the guest |
Add more numbered columns (_3, _4, etc.) as needed.
Seating Guests from a Spreadsheet
The seating_table column takes the table name or number as it appears on your seating board — not an ID. All of these find the same table:
| Your spreadsheet says | Matches |
|---|---|
Table 5 | the table named "Table 5" |
5 | table number 5 |
Head Table | the table named "Head Table" |
Matching is case-insensitive and only looks at tables belonging to that event.
If your event has more than one seating plan
An event can have several seating plans (for example a main ballroom and an overflow room), and table names only have to be unique within a plan — both rooms can have a "Table 1".
When that's the case, add a seating_plan column naming the plan:
first_name | seating_plan | seating_table |
|---|---|---|
| Jane | Gala Ballroom | Table 1 |
| Sam | Overflow Room | Table 1 |
If your event has only one seating plan you can leave this column out entirely.
Without it, a table name that exists in more than one plan is not guessed at — the guest imports unseated and the review screen tells you to add the column.
Build your tables first
Importing never creates tables. Set up your seating plan before uploading the guest list, otherwise there is nothing for the column to match against.
This is deliberate: a table invented from a spreadsheet cell has no seat count, and a table with no seat count is treated as unlimited — it would silently sit outside every capacity check on the board.
What happens when a table doesn't match
| Situation | Result |
|---|---|
| Table found | Guest is seated at it |
| No such table in this event | Guest imports unseated, with a warning on the review screen |
| The name matches tables in two plans | Guest imports unseated — add a seating_plan column |
| Two tables in one plan share that name | Guest imports unseated, with a warning — rename them or use the table number |
| No such seating plan | Guest imports unseated, with a warning naming the plan |
| Table is already full | Guest is still seated — see below |
In every case the guest is still imported. Only the seat is ever skipped, and you can seat them afterwards by dragging them from the Unseated list on the seating board, or by opening the row and picking a table before processing.
Tables over capacity
If your spreadsheet puts more guests at a table than it has seats, they are all seated anyway and the table shows as over capacity on the seating board — for example 12/10, in red, marked Full.
This is intentional. Refusing the extra guests would throw away the one thing your spreadsheet told us — which table they belong at — with nowhere to record it. An over-capacity table is visible and easy to fix by moving people off; a lost table assignment is not recoverable.
A full table refuses new drops on the board, but you can always drag guests off it.
How Contacts Are Linked
When an attendee row has no contact_id:
- Email matches an existing contact → the guest is linked to that contact.
- Email doesn't match, but the row has a name → a new contact is created from the row's name and email.
- Multiple rows in the same batch share an unmatched email → they all link to the single contact created by the first of those rows.
A guest with no email at all is matched by first and last name: one existing contact with that name is linked, no match creates a new contact, and two or more matches refuse the row until you set contact_id. A placeholder name (any word of it is "Anonymous" or "Anon", in any capitalization) is never matched: the row is flagged "Name looks anonymous" and each such guest gets their own contact.
Processing the Batch
When you're ready to finalize:
- Review all rows and resolve any warnings
- Click Process Batch
- Confirm the action
Important
Batch processing cannot be undone. Once processed, each guest becomes a permanent record. Double-check your data before processing.
After Processing
Once processed:
- Guests appear on the campaign's attendee list and seating board
- A contact is created or linked for each guest
- Tags are applied to attendees
- Guests with a matched table are seated; the rest appear under Unseated
Tips and Best Practices
- Build the seating plan first — tables must exist before the import can match them
- Use the table names you see on the board —
Table 5and5both work - Read the warnings before processing — an unmatched table is reported there, not after
- Test first — import a small sample before the full guest list
- Email is optional — don't invent placeholder addresses to get rows through