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

# Record who registered and who came

> Get an event and its guests into heyBTW from a synced platform, an event page link or a guest export, and keep registered and attended apart.

## What you get

Every event you run ends up in heyBTW as a collab, with the people who registered, the people who declined, and only the people who actually came marked attended. That record is what invite sprints, debriefs and attribution read later. You can bring it in three ways, strongest first, and heyBTW tells you what each way left out.

## Before you start

* Know where the event lives: a platform connected in heyBTW (Luma, Splash, Zuddl), a public page (Luma, Partiful or another), or nowhere but a spreadsheet.
* Have the guest export at hand if the platform is not connected. Send it unchanged: never rename columns or reformat dates.
* See [Connect heyBTW next to your CRM and your event platform](https://heybtw.com/docs/playbooks/connect-crm-and-event-platform.md) for rung 1.

## The event-history ladder

| Rung | How | Brings |
| - | - | - |
| 1. API sync | Platform connected in the dashboard | Events, guest lists, check-ins and registration answers, kept current |
| 2. Event page link | [create\_collab](https://heybtw.com/docs/tools/create-collab.md) with `event_url` | The event only, never its guest list |
| 3. Guest export | [record\_signups](https://heybtw.com/docs/tools/record-signups.md) or [create\_import\_link](https://heybtw.com/docs/tools/create-import-link.md) | A snapshot of who was on the export at that moment |

Every import names what it could not bring in `import_gaps`, each with a `remedy_tool`: `partners` ([manage\_collab\_partners](https://heybtw.com/docs/tools/manage-collab-partners.md)), `attendance` and `registration_answers` (record\_signups).

## Steps

**1. Find or create the collab**

Say: "Is the Austin field dinner in heyBTW yet?" Claude calls [list\_events](https://heybtw.com/docs/tools/list-events.md) and reads each row's `event_name`, `channel_id`, `event_tense` and `roster_count`.

If it is not there, pick one door per call:

* **Link door:** "Add this event: [https://lu.ma/](https://lu.ma/)..." Claude sends `event_url` and a fresh `client_request_id`. A Luma or Partiful page creates the collab from the page's public details. A link for a collab you already hold comes back `outcome: matched`, never a second copy.
* **Fields door:** "Add a dinner called Austin Field Dinner on October 20 at 6pm Central." Claude sends `name`, `event_start`, `timezone` and a `client_request_id`. Without `event_end` the end is set three hours after the start and `event_end_origin` says `assumed`. Claude tells you, and sets the real end with [update\_collab](https://heybtw.com/docs/tools/update-collab.md) once you know it.

Either way the answer's `channel_id` is the handle every other tool takes.

**2. Record who registered, from the export**

Say: "Here is the Partiful export for the dinner. Record who registered."

Claude calls [record\_signups](https://heybtw.com/docs/tools/record-signups.md) with `action: "preview"` and the file text as `csv`, at most 500 rows. Nothing is saved yet. The preview shows `column_map` (each column, what it maps to and why), `status_words`, `layers`, and rows that need your attention by line number. Claude relays `workspace_overlap.sentence` and `company_carry.sentence` as written. This sample is trimmed from a real preview today:

```json theme={null}
{
  "action": "preview",
  "written": false,
  "layers": { "registered": 1, "declined": 1, "attended": 0 },
  "status_words": {
    "Can't Go": { "status": "DECLINED", "rows": 1 },
    "Going": { "status": "APPROVED", "rows": 1 }
  },
  "workspace_overlap": {
    "sentence": "None of these 2 people are in this workspace yet, and no one here has the same name under another email."
  },
  "import_gaps": [
    { "gap": "partners", "remedy_tool": "manage_collab_partners" },
    { "gap": "attendance", "remedy_tool": "record_signups" },
    { "gap": "registration_answers", "remedy_tool": "record_signups" }
  ],
  "preview_token": "w3zG-6FQfGGR85dCbyzFYdiBBF2X6JRRO-BnP3n1bEY",
  "expires_at": "2026-11-03T19:53:16.309Z"
}
```

On your go, Claude confirms with `action: "confirm"`, the `preview_token` and a fresh `client_request_id`, and does not send the file again. The token lasts 15 minutes. More than about 50 rows that are not a file (a CRM list, a page you read): Claude previews the first chunk, sends the rest with `action: "append"`, then confirms once.

If the list is not a table (an email thread, pasted names), Claude structures it first with the `format_attendee_list` prompt and sends the result as `csv`.

**3. Or drop the file in yourself**

Say: "The export has 400 rows and custom questions. Give me an upload link."

Claude calls [create\_import\_link](https://heybtw.com/docs/tools/create-import-link.md) with the `channel_id`. You get a single-use link that works for 30 minutes, only for you, signed in to heyBTW. It opens heyBTW's own importer, which keeps registration question columns. When you say it is done, Claude reads the roster back with [get\_event\_details](https://heybtw.com/docs/tools/get-event-details.md) and does not also send the rows.

**4. Mark only the people who came**

Say: "These people came: Priya Shah, linkedin.com/in/marcus-lee, [dana@acme.com](mailto:dana@acme.com)."

Claude previews [record\_signups](https://heybtw.com/docs/tools/record-signups.md) with just those people as `CHECKED_IN`, by email, LinkedIn URL or full name, and never looks the emails up elsewhere first. A LinkedIn or name row matches only someone already on the collab. The preview names each match; Claude shows you before confirming.

**5. Check the counts**

Say: "How many registered and how many came?"

Claude calls [get\_event\_details](https://heybtw.com/docs/tools/get-event-details.md) and reports `attendance.registered`, `attendance.declined` and `attendance.attended`. `attendance.total` counts sign-ups, never attendance. `attendance.checked_in` is null, not zero, when nobody recorded check-in.

## Add people without a landing page

Many people say yes outside the event page: a reply to a personal email, an accepted calendar hold, a word at another event, a partner telling you their guest is coming. They belong on the roster without being sent to a page to sign up again. Where that works depends on who owns the guest list (`event_context.source_platform` on [get\_event\_details](https://heybtw.com/docs/tools/get-event-details.md)).

| The event lives in | Who owns the guest list | How a yes gets on the roster |
| - | - | - |
| heyBTW only (created with create\_collab, no sync) | heyBTW | [record\_signups](https://heybtw.com/docs/tools/record-signups.md), directly |
| A spreadsheet you keep by hand | heyBTW, from your sheet | record\_signups with the sheet as `csv`, unchanged |
| Partiful, Eventbrite or another page heyBTW does not sync | The platform, with heyBTW as the record | record\_signups from the export, or row by row |
| Luma, Splash or Zuddl, synced to heyBTW | The platform | heyBTW never adds guests there. Send the guest the platform's invite or RSVP link (or a Luma send through [activate\_list](https://heybtw.com/docs/tools/activate-list.md)); sync brings the registration back |

record\_signups refuses a collab an event platform syncs, and names the platform. That is deliberate: the platform's list stays the source.

**Recording a yes.** Say: "Maya and Sam said yes by email, Diego can't make it." Claude previews record\_signups with `rows`, each with `email`, `attendance_status` (`APPROVED` for yes, `DECLINED` for can't make it, `PENDING_APPROVAL` or `WAITLIST` while waiting) and `registered_at` (when they said yes). After your confirm, it adds a [record\_observation](https://heybtw.com/docs/tools/record-observation.md) note on how they said yes ("said yes by email reply"), so the follow-up later has its basis. Nobody needs importing first, and anyone already invited keeps their invite history. A yes is never recorded as `CHECKED_IN`.

**A calendar hold as the RSVP.** For a small dinner, the calendar invite you send from your own calendar can be the RSVP: accepted is `APPROVED`, declined is `DECLINED`, tentative stays out until it becomes a yes or a no.

**A list kept by hand.** Send the sheet again whenever it changes. A fuller list moves a status forward; a stale one never moves it back. If the list is not a table (an email thread, pasted names), Claude formats it first with the `format_attendee_list` prompt.

**Partners bringing guests.** Record each guest as above, and add the partner with [manage\_collab\_partners](https://heybtw.com/docs/tools/manage-collab-partners.md) so the event shows who brought whom.

**People you plan to invite, not people who said yes.** Use [import\_people](https://heybtw.com/docs/tools/import-people.md) instead. Imported people are not sign-ups and appear in no roster or count.

## Registered versus attended

* Approved, Pending and Going are registered (stored as APPROVED, PENDING\_APPROVAL and, for a waitlist, WAITLIST). Only CHECKED\_IN is attended.
* A whole guest list is never marked attended.
* "Can't Go" and "Cancelled" read as DECLINED. "No response" and "Invited" are skipped as `invited_not_accepted`.
* A date with no UTC offset is read in the collab's time zone, and `column_map` says so.

## Pair it with your tools

| Where the guest list lives | What to do |
| - | - |
| Luma, Splash or Zuddl | Connect it once inside heyBTW. Registrations and check-ins sync on their own. |
| Partiful | Paste the event link to create it, then export the guest list (CSV) and attach it: "Record this Partiful export on the SF dinner." |
| Eventbrite | Export attendees and attach the file the same way. Attending reads as registered, Checked In as attended. |
| Google Sheets or Excel | Download as CSV and attach it unchanged, headers and status words included. |
| A badge scan or a host's check-in list | Attach it or paste it; names or LinkedIn URLs match people already on the event. |
| Replies in Gmail or a calendar hold | "Maya and Sam said yes by email" is enough. Claude records them from what you say. |

## What heyBTW will and won't do

* It never invites anyone, enriches a row, or writes to a collab a platform syncs.
* It moves a status up and never silently down; a correction needs your go.
* It never adds guests to your event platform.
* It names every gap the import left, so Claude can propose the remedy.

## Related

* [The morning after](https://heybtw.com/docs/playbooks/morning-after.md)
* [Fill the room in the two weeks before](https://heybtw.com/docs/playbooks/invite-sprint.md)
* [record\_signups](https://heybtw.com/docs/tools/record-signups.md)
* [heyBTW MCP rules](https://heybtw.com/docs/mcp/rules.md)


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