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 │
│ ... │ └────────────────┘ └──────────────┘
└──────────────┘
- Each domain publishes events it owns to the central bus.
- You register a subscription via the Event domain API, specifying which event types you care about and where they should be delivered.
- 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.sentengagement.segment.user.addedmembership.membership.created
Wildcards (coming soon)
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.
| Pattern | Matches |
|---|---|
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 type | Description |
|---|---|
engagement.campaign.created | Campaign created |
engagement.campaign.updated | Campaign updated |
engagement.campaign.archived | Campaign archived |
engagement.campaign.sent | Campaign sent |
engagement.campaign.delivered | Campaign delivered |
engagement.campaign.opened | Campaign opened |
engagement.campaign.clicked | Campaign clicked |
engagement.campaign.bounced | Campaign bounced |
engagement.campaign.unsubscribed | Campaign unsubscribed |
engagement.campaign.converted | Campaign converted |
engagement.segment.created | Segment created |
engagement.segment.updated | Segment updated |
engagement.segment.archived | Segment archived |
engagement.segment.user.added | User added to segment |
engagement.segment.user.removed | User removed from segment |
engagement.message.sent | Message sent |
engagement.message.delivered | Message delivered |
engagement.message.opened | Message opened |
engagement.message.clicked | Message clicked |
engagement.message.bounced | Message bounced |
engagement.message.failed | Message failed |
engagement.user.subscribed | User subscribed |
engagement.user.unsubscribed | User unsubscribed |
engagement.user.attributes.updated | User attributes updated |
engagement.settings.updated | Settings 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:
- Decide which event types you want.
- Call the Event domain's subscription endpoints (see the Create Subscription API Reference) with your delivery target and the list of event types.
- Implement an idempotent handler — events may occasionally be redelivered.