Skip to main content

Event Registry & Subscriptions

The Inside Labs platform is event-driven. Whenever something meaningful happens in any domain — a campaign is sent, a membership is created, a user is added to a segment — that domain publishes an event to the central event bus owned by the Event domain.

You can react to those events in real time by creating a subscription through the Event domain's API.

How it works

   ┌──────────────┐    publish    ┌────────────────┐    deliver    ┌──────────────┐
│ Engagement │──────────────▶│ Event domain │──────────────▶│ Your webhook │
│ Membership │ │ (event bus) │ │ /handler │
│ ... │ └────────────────┘ └──────────────┘
└──────────────┘
  1. Each domain publishes events it owns to the central bus.
  2. You register a subscription via the Event domain API, specifying which event types you care about and where they should be delivered.
  3. The Event domain delivers matching events to your endpoint.

See the Event section of the API Reference for the exact endpoints to manage subscriptions.

Event naming

Event types are dot-namespaced and prefixed with the owning domain:

<domain>.<entity>.<action>

Examples:

  • engagement.campaign.sent
  • engagement.segment.user.added
  • membership.membership.created

Wildcards (coming soon)

note

Wildcard subscriptions are not yet supported — today you must subscribe to fully-qualified event types. Support is coming soon.

Once enabled, you will be able to wildcard trailing segments of an event type with *. You cannot wildcard the middle of a pattern, and you cannot wildcard everything globally.

PatternMatches
engagement.*Every event emitted by the engagement domain
engagement.campaign.*Every campaign event in the engagement domain
engagement.segment.user.*Every segment-user event (added, removed, …)

Not allowed:

  • * on its own (no global wildcards)
  • *.campaign.sent (wildcards must be at the end)
  • engagement.*.sent (no wildcards in the middle)

Event ownership

Each domain owns its own events. The canonical list of events for a domain is defined and managed by that domain.

Engagement events

Event typeDescription
engagement.campaign.createdCampaign created
engagement.campaign.updatedCampaign updated
engagement.campaign.archivedCampaign archived
engagement.campaign.sentCampaign sent
engagement.campaign.deliveredCampaign delivered
engagement.campaign.openedCampaign opened
engagement.campaign.clickedCampaign clicked
engagement.campaign.bouncedCampaign bounced
engagement.campaign.unsubscribedCampaign unsubscribed
engagement.campaign.convertedCampaign converted
engagement.segment.createdSegment created
engagement.segment.updatedSegment updated
engagement.segment.archivedSegment archived
engagement.segment.user.addedUser added to segment
engagement.segment.user.removedUser removed from segment
engagement.message.sentMessage sent
engagement.message.deliveredMessage delivered
engagement.message.openedMessage opened
engagement.message.clickedMessage clicked
engagement.message.bouncedMessage bounced
engagement.message.failedMessage failed
engagement.user.subscribedUser subscribed
engagement.user.unsubscribedUser unsubscribed
engagement.user.attributes.updatedUser attributes updated
engagement.settings.updatedSettings updated

Shared / cross-domain events

Some events represent concepts that are produced by multiple domains — for example purchase or payment events. Those live in a shared package rather than in any single domain, so all producers and consumers agree on the same schema.

Event payload shape

Every event delivered over the bus follows the same envelope:

{
"eventId": "01J...",
"eventType": "engagement.campaign.sent",
"eventCategory": "campaign",
"sourceDomain": "Engagement",
"timestamp": "2026-04-08T12:34:56.000Z",
"payload": {
"...": "event-specific fields"
}
}

The wrapper is universal; the payload is defined by the owning domain's schema.

Subscribing

To start receiving events:

  1. Decide which event types you want.
  2. Call the Event domain's subscription endpoints (see the Create Subscription API Reference) with your delivery target and the list of event types.
  3. Implement an idempotent handler — events may occasionally be redelivered.