Skip to main content
POST
Records up to 100 events per request, each tied to a contact. An event is an event_name plus free-form params, following Google Analytics 4 conventions: a purchase in your e-commerce, an order in your POS, a form, a visit, a step in Make or n8n. Events show up in the contact’s activity and can be used to segment and report. Events from visitors who have not identified yet can be sent too: with a session_id and no contact data, they wait until the session is identified and then move to the contact. See the events guide.
Events are an add-on. If your organization does not have it enabled, this endpoint answers 403. Ask ContactShip support to turn it on. See the events guide for a walkthrough.

Use Cases

  • Send purchases, carts, sign-ups or any business action from your own systems
  • Keep what a visitor did before logging in or buying, and join it to the contact when they do
  • Load past orders with their original date to segment and report on history
  • Keep contacts in sync: a new customer in your system becomes a contact in ContactShip

Headers

string
requerido
Your organization API key. See API keys.

Body Parameters

array
requerido
Between 1 and 100 events. Each one is validated and answered on its own: a malformed event does not reject the others.

Body examples

Full bodies for the most common cases. You can mix events of different kinds in the same array, up to 100 per request. More examples (checkout, refund, sign-up, existing contacts only) are in the events guide.
value and currency can go inside params, as in GA4, or at the same level as event_name; when both are sent, the outer one wins. Only the top-level fields of params can be used to filter and split custom reports: to report by product, also send it at the top level, such as "product_name": "Large pizza".

How the contact is found

The contact is looked up in this order, keeping the first match: contact_id, then external_id, then phone (last 10 digits, so +57 300 123 4567, 573001234567 and 3001234567 match), then email. When none of them is sent, the event’s session_id is used if that session was already identified.
  • If several contacts share the phone, the event goes to the one with the most recent conversation or call.
  • An email shared by several contacts is not used.
  • If the phone and the email point to different contacts, the phone wins and conflict says so.
  • If nothing matches and the event brings a phone or an email, the contact is created (unless create_contact is false), named after contact.name, or else the email or the phone. This uses your plan’s contact quota.
  • Contacts are never merged. A contact that is found only gets its phone or email filled in when it was empty.

Anonymous events limits

  • An organization accepts up to 100,000 anonymous events a day. Past that, they are rejected with anonymous_daily_limit until the next day. Contact support if you need more.
  • Requests carrying anonymous events use an extra request budget, smaller than the one for events with contact data. See Rate limits.

Response

The response is { "statusCode": 200, "data": object }, with one result per event in the order they were sent. The fields below describe data.
object
Counts for the request: received, created, unresolved, pending, duplicate, rejected, invalid and contacts_created.
array
One result per event.

Errors