Skip to Content

Data model

Account hierarchy

Active Reach uses a four-layer account model. The 2026-05-26 revision made Location (outlet) a first-class attribute of a workspace rather than a separate tenant.

Organization (brand portfolio holder, usually one brand) └── Workspace (brand-tenant; one per brand) ├── Location[] (outlet — per-store ops, per-outlet overrides) └── Property[] (SDK install — web app / mobile app / kiosk)
LayerMaps toWhat lives here
OrganizationBrand portfolio holderBrand identity, billing entity, subscription, agency relationships
WorkspaceBrand-tenant (one per brand)Cross-outlet data: contacts, segments, channels, journeys, in-app, campaigns, ads, loyalty program
LocationAn outlet (store)Per-outlet overrides: local hours, manager phone, payment merchant, inventory, per-outlet channel sender mapping
PropertyAn SDK install (web app / mobile app / kiosk)In-app + push surfaces, per-property metrics

workspace_id and location_id are distinct dimensions — never aliased. workspace_id is required on every tenant-scoped row; location_id is nullable (brand-tier rows = NULL; outlet-scoped rows stamp both).

Multi-brand operators run Agency mode: one Agency org → N Client orgs linked via agency_clients (1:N). The Agency org itself has no workspaces.

Customer URLs are subdomain-scoped to the brand with the outlet on the path: slug.actii.me/{outlet-code}/{page}. Admin URLs are path-scoped to the brand with the outlet in query state: actii.me/dashboard/{brand}/{page}?location=loc_X.

Five operational objects

Five objects form the backbone of campaign execution. Understanding their relationships helps you design integrations and debug issues.

Contact

A person your business communicates with.

FieldDescription
idSystem-generated unique ID
user_idYour application’s user ID (set via identify())
anonymous_idSDK-generated ID (before identification)
emailPrimary email address
phonePrimary phone number (E.164 format)
propertiesKey-value pairs — standard (name, city, plan) and custom (any field you set)
segmentsArray of segment IDs the contact currently belongs to
created_atWhen the contact was first seen
last_active_atWhen the contact last fired an event

Identity resolution: Contacts are deduplicated by user_id (highest priority), then email, then phone. When a match is found, records merge — properties combine (latest wins), event histories unify.

Event

Something a contact did.

FieldDescription
typetrack, identify, page, group, or alias
eventEvent name (for track type, e.g., order_completed)
user_id / anonymous_idWho did it
propertiesArbitrary key-value data describing the event
contextDevice, browser, location, UTM metadata
timestampWhen it happened

Events are immutable — once ingested, they can’t be modified. They power segmentation, journey triggers, analytics, and attribution.

Campaign

A message sent to a segment through one or more channels.

FieldDescription
idUnique campaign ID
nameHuman-readable name
statusdraft, scheduled, sending, paused, completed
segmentsTarget audience (array of segment IDs)
channelsWhich channels to use (email, whatsapp, sms, etc.)
contentPer-channel message content
scheduleWhen to send (immediate, scheduled, recurring, STO)
conversion_goalOptional event name + tracking window for attribution

Journey

A multi-step automation defined as a directed acyclic graph of nodes and edges.

FieldDescription
idUnique journey ID
nameHuman-readable name
statusdraft, published, paused, completed
nodesArray of node objects (trigger, wait, send, branch, split, exit)
edgesArray of connections between nodes
versionIncremented on each edit

See Journey graph schema for the full node/edge format.

Segment

A dynamic group of contacts defined by rules.

FieldDescription
idUnique segment ID
nameHuman-readable name
conditionsArray of filter conditions (property checks, event checks, engagement checks)
logicHow conditions combine (AND or OR)
member_countCurrent number of matching contacts (updated in real-time)

How they connect

Contact → fires Events → matches Segments → enters Journeys → receives Campaigns Analytics (aggregation, funnels, attribution)

Every downstream system (campaigns, journeys, analytics) reads from the same event stream. There’s no separate “marketing database” — events are the single source of truth.

What’s next