Core

Events

Record discrete in-product actions. Any event you send can trigger a Meisa automation, so events are how you react to what users do, not just who they are.

Track an event

POST/events/track/scope: events:track

Records a custom event against an existing contact. The contact must already exist — upsert them first. A tracked event fires any automation whose trigger is a matching custom event.

FieldTypeDescription
event_namerequiredstringThe event identifier, e.g. feature_activated or completed_onboarding.
emailstringThe contact's email. Required unless you send external_id.
external_idstringYour user ID. Required unless you send email. Matched before email.
propertiesobjectOptional metadata about the event (anything you want available to automations and the activity log).

Example

track an event
curl -X POST "https://api.meisa.io/api/v1/events/track/" \
  -H "X-API-Key: meisa_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "event_name": "feature_activated",
    "properties": { "feature": "export", "plan": "pro" }
  }'
response
{
  "status": "tracked",
  "contact_id": "550e8400-e29b-41d4-a716-446655440000",
  "event_name": "feature_activated",
  "timestamp": "2026-06-02T12:00:00Z"
}

A 404 means no contact matched the email/external_id — upsert the contact first.

Events vs. fields

When to use an event vs. a custom field

Use a custom field (via upsert) for ongoing state you'd want to filter on later — plan, signin_count, onboarding_completed. Use an event for a moment in time you want to react to — feature_activated, hit_usage_limit, invited_teammate. Many integrations only ever need upsert; reach for events when you want an automation to fire on a specific action.