Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.soundchecklive.io/llms.txt

Use this file to discover all available pages before exploring further.

The Universal Event Format (UEF) is the canonical shape that all operator data is transformed into before it reaches Soundcheck’s normalized tables. The wizard at /imports produces one UEF document per import job; partner integrations (n8n CRM sync, custom feeds) emit the same shape so both ingestion paths share writer semantics. If you’re just importing a spreadsheet, you don’t need to touch UEF directly — the mapping UI hides it. This page is for partners building feeds and for engineers extending the importer.

Top-level shape

{
  "schema_version": "1.0",
  "source": {
    "type": "SPREADSHEET",
    "name": "spring-2026-bookings.xlsx",
    "ingested_at": "2026-05-11T15:00:00Z",
    "import_job_id": "imp_..."
  },
  "events": [
    { /* UEFEvent */ },
    ...
  ]
}
  • schema_version — bump only when the shape changes in a way that older mappings would not survive. Current value: 1.0.
  • source.type"SPREADSHEET" or "PASTE" for the wizard; partners use their own identifier.
  • events[] — the unit the writer iterates over.

UEFEvent

The required fields are minimal — anything else is opt-in.
FieldTypeRequiredNotes
titlestringyesName of the gig, e.g. “Acme Corp Holiday Party”.
event_datestring (YYYY-MM-DD)yesThe calendar date the event takes place.
external_idstringnoStable identifier from the source system. Strongly recommended — drives upsert vs. insert on re-import. Defaults to {import_job_id}:{row_index} when omitted.
event_typestringnoOperator-defined category (Wedding, Corporate, Concert, Festival, …).
start_timestring (RFC3339)noe.g. 2026-06-15T19:00:00-04:00.
end_timestring (RFC3339)noSame format as start_time.
statusstringnoACTIVE (default), DRAFT, TEMPLATE, ARCHIVED.
currencystring (ISO 4217)noDefaults to USD.
default_performance_feedecimalnoNumeric, e.g. 500.00.
payment_termsstringnoFree-text, e.g. “Net 30”, “On the day”.
notesstringnoPublic notes visible to crew and clients.
admin_notesstringnoInternal-only notes.
location / location_namestringnoUse these when there’s no separate venue column.
latitude / longitudedecimalnoOptional event-level coordinates.
place_idstringnoGoogle Places ID, when known.
venueobjectnoSee UEFVenue below.
customerobjectnoSee UEFCustomer below.
members[]arraynoSee UEFMember below.
schedule_items[]arraynoTimeline rows (load-in, soundcheck, …).
metadataobjectnoArbitrary source-system fields preserved for audit.

UEFVenue

FieldTypeNotes
namestringRequired when venue is present.
external_idstringImproves dedup; use the source system’s venue ID when available.
address, city, state, postal_code, countrystring
phone_number, websitestring
latitude, longitude, place_idvarious
notes, metadatastring / object

UEFCustomer

FieldTypeNotes
namestringRequired when customer is present.
external_idstringSource-system customer ID.
email, phone, websitestring
contacts[]arrayOptional list of contacts on the customer record (name, email, phone, title, is_primary).
notes, metadatastring / object

UEFMember

One crew member on the event. To produce an invitation, a member must have either email or phone_number — rows without a contact channel are skipped at write time.
FieldTypeNotes
first_name, last_namestring
emailstringOne of email or phone_number is required for invitation.
phone_numberstringSame as above.
positionstringHuman-readable; resolved against the organization’s positions.
performance_feedecimalPer-performer override; otherwise the event default applies.
fee_notesstring
call_orderinteger0 = primary, 1+ = backup.
external_idstringImproves dedup across re-imports.

UEFScheduleItem

FieldTypeNotes
namestringRequired.
start_timestring (RFC3339)Required.
end_timestring (RFC3339)Optional.
orderintegerDefaults to natural order.
notesstringOptional.

Datetime conventions

  • event_dateYYYY-MM-DD (no time component).
  • start_time, end_time, schedule_items[].start_time/end_time — RFC3339 with offset, e.g. 2026-06-15T19:00:00-04:00.
  • source.ingested_at — RFC3339 UTC.

Identity & idempotence

External IDs are the heart of safe re-imports. The writer matches in this order:
  1. By external_id (when present).
  2. By natural key — (title, event_date) for events, name (case-insensitive, scoped to the organization) for venues and customers.
When both fields are present, external_id wins. That’s how renaming an event in the source system stays linked instead of becoming a duplicate. Invitations are deduped at the database level by partial unique indexes on (eventId, lower(email)) and (eventId, phoneNumber), with ON CONFLICT DO NOTHING. Re-running the same import is always safe.

Field catalog

The wizard mapping UI pulls its dropdown from the same field catalog. You can fetch the live catalog from the API:
GET /v1/organizations/{orgId}/imports/catalog
This returns one entry per mappable path (e.g. events[].event_date, events[].venue.name, events[].members[].email) with type, required flag, and a short description. The catalog is the source of truth — if it isn’t listed there, the importer can’t write to it.