When to use it
- “Here’s the Partiful export from Thursday. Load it.”
- “These 12 people checked in at the door, here are their LinkedIn links.”
- “Mark everyone on this badge scan as attended.”
- “Our HubSpot list is everyone who registered for the March dinner.”
Parameters
attendance_status on rows must be exactly one of CHECKED_IN, APPROVED, PENDING_APPROVAL, DECLINED, WAITLIST, REGISTERED.
Status words
Acsv is read with heyBTW’s one status vocabulary, the one the dashboard importer reads. Confirmed, Approved, Attended, Can’t Go, Cancelled, No response and Invited were checked on a live preview today; Attending and Going are from the tool description.
Registered is never attended. Only
CHECKED_IN is attended. INVITED is never recorded here: people the user wants to reach go through import_people, save_list, activate_list. A word heyBTW does not know is skipped and listed with the word; ask the user once what it means.
Workflow
1
Preview
action: "preview" with the csv or the first rows. Nothing is written. The server keeps the rows and returns preview_token, valid 15 minutes.2
Append (rows only, more than about 50)
action: "append" with the same preview_token, the next chunk of rows and a fresh client_request_id. Never a csv. The token stays valid 15 minutes after the last append. Report data[0].staged totals, never one chunk’s. At most 2,000 rows staged.3
Show the preview to the user
The
column_map, the counts, the skipped rows, matches for LinkedIn or name rows, suspect rows, and the workspace_overlap.sentence and company_carry.sentence as written.4
Confirm
action: "confirm", the preview_token and a fresh client_request_id, with NO rows and NO csv. Never resend the rows. A second confirm with the same token replays the first result.5
Close the import gaps
Read
import_gaps and propose each remedy tool, manage_collab_partners first, before you report the import done.client_request_id: a committed call is replayed (idempotent_replay: true), never repeated. Reusing an id for different rows is refused. Expired or refused token: preview again.
LinkedIn and name rows
A row withlinkedin_url or name and no email matches the ONE sign-up already on the collab with that profile or full name (case and accents folded). It only updates that person, never adds anyone. Never look the emails up first.
These rows confirm ONLY by
preview_token.
The event-history ladder
An export is rung 3: a snapshot. Rung 1, API sync, keeps partners, check-ins and answers current. A collab whose registrations Luma, Splash or Zuddl sync is refused here, naming the platform. Every answer carriesimport_gaps:
A CRM list (rung 4,
source: "crm_list") says who was on it, never who came. Ask the user which cluster of create dates is this event, and whether the list means invited, registered or attended, before any call.
Response
A previewdata[0], in the order that matters:
A confirm opens with
facts, carry and next (as create_collab serves them), then written: true, changed_since_preview (rows whose result changed, each with previewed in attention) and chunks.
Trimmed from a real preview today (fictional people at example.org):
status is partial because rows were skipped (gap partial_coverage, retryable false). That is a disclosure, not a failure.
Rules the agent must follow
- Send the file as it is. Never recount it yourself: relay the first coverage note’s counts.
- Never confirm before every chunk is appended. Never resend rows on confirm.
- Never guess a status or a default status. Never mark a whole guest list attended.
- Never exclude a suspect kind on your own, and never call two emails the same person without the user’s confirmation.
- A stale export never lowers a status. A fuller one advances it. Use
allow_status_correctiononly on the user’s say.
Errors and gaps
Related
- create_import_link, for a large file
- create_collab
- get_event_details, to read the roster back
- Playbook: Record who registered and who came