Skip to content

Message Data Model

🏗️ Primary Entities

Messages: Individual communications sent or received via email, text, or direct mail

Delivery: Scheduling, send times, and delivery status tracking

Engagement: Opens, clicks, and read status (channel-dependent)

🔗 Key Relationships

Many-to-One: Message → Customer (each message belongs to one customer)

Many-to-One: Message → Campaign (messages may be linked to a campaign)

Many-to-One: Message → Tenant (each message belongs to one tenant)

Core identification fields linking messages to tenants, shops, and customers.

Field NameData TypeDescriptionRequired
STEER_TENANT_IDString (UUID)Unique tenant identifier (parent organization)Yes
STEER_SHOP_IDString (UUID)Shop location identifierYes
STEER_CUSTOMER_IDString (UUID)Customer identifier (message recipient)Yes
STEER_MESSAGE_IDString (UUID)Unique message identifierYes

Campaign association and notification classification.

Field NameData TypeDescriptionRequired
CAMPAIGN_IDString (UUID)Associated campaign identifier (null for direct messages)No
MARKETING_TYPEStringCommunication channel typeNo
CAMPAIGN_NAMEStringCampaign display nameNo
CAMPAIGN_TYPEStringCampaign frequency typeNo
NOTIFICATION_IDNumberAssociated notification identifier (null for direct messages and direct mail)No
NOTIFICATION_TYPEStringNotification classification (null for direct messages and direct mail)No

Message lifecycle timing.

Field NameData TypeDescriptionRequired
CREATED_ATTimestampMessage creation timestampYes
SCHEDULED_ATTimestampScheduled send time (null if sent immediately or for direct mail)No
SENT_ATTimestampActual send timestampNo
DELIVERED_ATTimestampDelivery confirmation timestampNo

Delivery status and engagement metrics.

Field NameData TypeDescriptionRequired
MESSAGE_STATUSStringCurrent delivery/engagement statusYes
OPENS_COUNTNumberTotal open count (email only)No
CLICKS_COUNTNumberTotal click count (email only)No
COUNT_OF_ATTACHMENTSNumberNumber of attachments (text only)No
IS_STEER_FAVORITEBooleanConversation-level flag indicating the entire customer conversation is “starred” or bookmarked for easy retrieval (email and text only)No

Message content fields.

Field NameData TypeDescriptionRequired
SUBJECTStringEmail subject line (email only, null for text and direct mail)No
TEXTStringMessage body text. For email: plain text without HTML formatting. For text: SMS body. Null for direct mailNo
INCOMING_TEXT_SOURCEStringSource of incoming text message. Only populated when MESSAGE_STATUS is Incoming (text channel only, null for email and direct mail)No
  • Scheduled: Message is scheduled for future delivery
  • Queued: Message is queued for processing
  • Sent: Message has been sent to the carrier
  • Delivered: Message was successfully delivered
  • Unsent: Message was not sent
  • Failed: Message delivery failed
  • Incoming: Inbound message received from customer
  • Unsubscribed: The system marks the message when the customer sends a stop-word (e.g., “Unsubscribe”, “Stop”, “Cancel”)
  • Deactivated: Phone number was deactivated by the carrier. The system records the message as failed, deactivates the phone number on the customer record, and blocks future messages to that number
  • FailedByRestriction: Blocked by Steer messaging restriction settings (e.g., maximum messages allowed per customer per day)

Not all fields are populated for every channel. The following table shows which fields contain data per channel:

FieldEmailTextDirect Mail
NOTIFICATION_IDYesYes
NOTIFICATION_TYPEYesYes
SCHEDULED_ATYesYes
OPENS_COUNTYes
CLICKS_COUNTYes
COUNT_OF_ATTACHMENTSYes
IS_STEER_FAVORITEYesYes
SUBJECTYes
TEXTYesYes
INCOMING_TEXT_SOURCEYes

Complete API response example with an email message record:

{
"data": [
[
"f2e3d4c5-b6a7-8901-2345-6789abcdef01",
"c3d4e5f6-a7b8-9012-3456-789abcdef012",
"a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"b2c3d4e5-f6a7-8901-bcde-f12345678901",
"d4e5f6a7-b8c9-0123-4567-89abcdef0123",
"Email",
"Welcome Back Follow-Up",
"Repeat",
null,
null,
"2025-06-15T10:30:00Z",
"2025-06-15T09:00:00Z",
"2025-06-15T10:30:00Z",
"2025-06-15T10:30:05Z",
"Delivered",
3,
1,
null,
false,
"We miss you! Come back for a check-up",
"Hi Sarah, it's been a while since your last visit. We'd love to see you again for a routine check-up.",
null
]
],
"metadata": {
"rowType": [
{"name": "STEER_TENANT_ID", "type": "text"},
{"name": "STEER_SHOP_ID", "type": "text"},
{"name": "STEER_CUSTOMER_ID", "type": "text"},
{"name": "STEER_MESSAGE_ID", "type": "text"},
{"name": "CAMPAIGN_ID", "type": "text"},
{"name": "MARKETING_TYPE", "type": "text"},
{"name": "CAMPAIGN_NAME", "type": "text"},
{"name": "CAMPAIGN_TYPE", "type": "text"},
{"name": "NOTIFICATION_ID", "type": "fixed"},
{"name": "NOTIFICATION_TYPE", "type": "text"},
{"name": "CREATED_AT", "type": "timestamp_ntz"},
{"name": "SCHEDULED_AT", "type": "timestamp_ntz"},
{"name": "SENT_AT", "type": "timestamp_ntz"},
{"name": "DELIVERED_AT", "type": "timestamp_ntz"},
{"name": "MESSAGE_STATUS", "type": "text"},
{"name": "OPENS_COUNT", "type": "fixed"},
{"name": "CLICKS_COUNT", "type": "fixed"},
{"name": "COUNT_OF_ATTACHMENTS", "type": "fixed"},
{"name": "IS_STEER_FAVORITE", "type": "boolean"},
{"name": "SUBJECT", "type": "text"},
{"name": "TEXT", "type": "text"},
{"name": "INCOMING_TEXT_SOURCE", "type": "text"}
]
}
}