Contacts

Contacts & events

Stable IDs, ingest, and how Data reviews what you synced.

Everything downstream — audiences, journeys, campaigns, Insights — sits on people and the things they did. Get identity right early. Fixing duplicates later means untangling every segment that used them.

Identity

  • `externalId` — your primary user id. Required for reliable upsert

and event linking.

  • `email` — delivery address; people change it.
  • `locale` — which email variant to send (en / de).

Where data comes from

SourceUse when
Audryo APIYour backend can send a Bearer token. Canonical schema. Recommended.
Inbound webhookHMAC-only vendor or a payload that needs field mapping.
CSVOne-time backfill. Import.
Stripe / ZapierBilling or no-code automation. Same ingest underneath.

You do not create a webhook to use event_ingestion.

Send events

POST /v1/projects/{projectId}/event_ingestion — up to 500 events, write scope. Full contract: Events API.

curl
curl -X POST "$AUDRYO_API_BASE/projects/$PROJECT_ID/event_ingestion" \
  -H "Authorization: Bearer $AUDRYO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "events": [{
      "externalId": "evt_123",
      "contactExternalId": "user_42",
      "name": "book_created",
      "occurredAt": "2026-08-29T10:00:00Z",
      "properties": { "bookId": "book_7" }
    }]
  }'

Contacts: POST /v1/projects/{projectId}/contact_ingestion (up to 5,000). Contacts API.

Event properties on an event-triggered Journey enrollment become {{ data.* }} in that run’s emails.

Reviewing Data

Data shows fields and events with coverage, samples, and proposed/confirmed status. Details: Properties, events, and tags.

Data → Contacts: search, open a person for timeline, profile, messages received, consent history.

Do not send subscribed: true and expect marketing mail to go out. Use the consent ledger.