Skip to content
ShopAssist Docs
Webhooks

Webhook events

Every outgoing webhook event type with its payload schema and an example, generated from the OpenAPI document.

Every event is delivered as a POST with the envelope below the data key, signed as described in verifying signatures. Subscribe to event types per endpoint in Developers → Webhooks. New event types may be added at any time; ignore types you don't know.

EventSent when
action.executedAn order action the shopper confirmed (cancel, return, address change) was executed on the platform.
back_in_stock.notifiedA back-in-stock alert was sent to the shopper.
back_in_stock.subscribedA shopper subscribed to a back-in-stock alert.
conversation.closedA conversation was closed by the shopper, an agent or after the idle timeout.
conversation.createdA shopper started a conversation.
csat.submittedA shopper rated a conversation.
handoff.requestedA conversation was handed off to your team; the payload carries up to 50 transcript messages.
handoff.updatedA handoff changed state (taken over, delivered, resolved, failed).
lead.capturedA shopper left contact details in the chat.
lead.confirmedA shopper confirmed their newsletter sign-up (double opt-in).
lead.unsubscribedA shopper unsubscribed.
message.createdA message was added to a conversation. Opt-in and high volume.
order.attributedAn order was attributed to a conversation.
privacy_request.completedA privacy request (export or erasure) finished.
store.status_changedA store changed status (for example connected, disconnected, suspended).
sync.failedA catalog sync run failed.
usage.threshold_reachedUsage reached 80 % or 100 % of the included conversations, or the overage budget.

action.executed

An order action the shopper confirmed (cancel, return, address change) was executed on the platform.

Sent with ShopAssist-Event-Type: action.executed. Acknowledge with any 2xx within 10 seconds.

Payload of action.executed
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredActionExecutedData`{ action; conversation_id }`.
data.actionrequiredActionEventView`{ id; action_type; mode; status; order_number; result; created_at; executed_at }`.
data.action.action_typerequired"cancel_order" | "cancellation_request" | "return_order" | "return_request"
data.action.created_atrequiredstringformat date-time
data.action.executed_atrequiredstring | nullformat date-time
data.action.idrequiredstringpattern `^act_[0-9a-hjkmnp-tv-z]{26}$`
data.action.moderequired"direct" | "request_only" | "platform_self_service" | "platform"
data.action.order_numberrequiredstring | null
data.action.resultrequiredobject | null
data.action.statusrequiredstring (enum)one of proposed, executing, succeeded, requested, failed, declined, expired, superseded
data.conversation_idrequiredstringpattern `^conv_[0-9a-hjkmnp-tv-z]{26}$`
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"action.executed"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "action": {
      "action_type": "cancel_order",
      "created_at": "2026-09-28T10:15:30.123Z",
      "executed_at": "2026-09-28T10:15:30.123Z",
      "id": "act_01j8000000e008000000000000",
      "mode": "direct",
      "order_number": "string",
      "result": {},
      "status": "proposed"
    },
    "conversation_id": "conv_01j8000000e008000000000000"
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "action.executed"
}

back_in_stock.notified

A back-in-stock alert was sent to the shopper.

Sent with ShopAssist-Event-Type: back_in_stock.notified. Acknowledge with any 2xx within 10 seconds.

Payload of back_in_stock.notified
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredBackInStockEventData`{ subscription: BackInStock }`.
data.subscriptionrequiredBackInStock`BackInStock` (03 §6.19).
data.subscription.created_atrequiredstringformat date-time
data.subscription.emailrequiredstring
data.subscription.expires_atrequiredstringformat date-time
data.subscription.idrequiredstringpattern `^bis_[0-9a-hjkmnp-tv-z]{26}$`
data.subscription.localerequiredstring
data.subscription.location_idrequiredstring | nullpattern `^loc_[0-9a-hjkmnp-tv-z]{26}$`
data.subscription.notified_atrequiredstring | nullformat date-time
data.subscription.product_idrequiredstringpattern `^prd_[0-9a-hjkmnp-tv-z]{26}$`
data.subscription.statusrequired"pending_confirmation" | "active" | "notified" | "cancelled" | "expired"
data.subscription.variant_idrequiredstringpattern `^var_[0-9a-hjkmnp-tv-z]{26}$`
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"back_in_stock.notified"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "subscription": {
      "created_at": "2026-09-28T10:15:30.123Z",
      "email": "string",
      "expires_at": "2026-09-28T10:15:30.123Z",
      "id": "bis_01j8000000e008000000000000",
      "locale": "da-DK",
      "location_id": "loc_01j8000000e008000000000000",
      "notified_at": "2026-09-28T10:15:30.123Z",
      "product_id": "prd_01j8000000e008000000000000",
      "status": "pending_confirmation",
      "variant_id": "var_01j8000000e008000000000000"
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "back_in_stock.notified"
}

back_in_stock.subscribed

A shopper subscribed to a back-in-stock alert.

Sent with ShopAssist-Event-Type: back_in_stock.subscribed. Acknowledge with any 2xx within 10 seconds.

Payload of back_in_stock.subscribed
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredBackInStockEventData`{ subscription: BackInStock }`.
data.subscriptionrequiredBackInStock`BackInStock` (03 §6.19).
data.subscription.created_atrequiredstringformat date-time
data.subscription.emailrequiredstring
data.subscription.expires_atrequiredstringformat date-time
data.subscription.idrequiredstringpattern `^bis_[0-9a-hjkmnp-tv-z]{26}$`
data.subscription.localerequiredstring
data.subscription.location_idrequiredstring | nullpattern `^loc_[0-9a-hjkmnp-tv-z]{26}$`
data.subscription.notified_atrequiredstring | nullformat date-time
data.subscription.product_idrequiredstringpattern `^prd_[0-9a-hjkmnp-tv-z]{26}$`
data.subscription.statusrequired"pending_confirmation" | "active" | "notified" | "cancelled" | "expired"
data.subscription.variant_idrequiredstringpattern `^var_[0-9a-hjkmnp-tv-z]{26}$`
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"back_in_stock.subscribed"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "subscription": {
      "created_at": "2026-09-28T10:15:30.123Z",
      "email": "string",
      "expires_at": "2026-09-28T10:15:30.123Z",
      "id": "bis_01j8000000e008000000000000",
      "locale": "da-DK",
      "location_id": "loc_01j8000000e008000000000000",
      "notified_at": "2026-09-28T10:15:30.123Z",
      "product_id": "prd_01j8000000e008000000000000",
      "status": "pending_confirmation",
      "variant_id": "var_01j8000000e008000000000000"
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "back_in_stock.subscribed"
}

conversation.closed

A conversation was closed by the shopper, an agent or after the idle timeout.

Sent with ShopAssist-Event-Type: conversation.closed. Acknowledge with any 2xx within 10 seconds.

Payload of conversation.closed
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredConversationEventData`{ conversation: ApiConversation }`.
data.conversationrequiredApiConversation`ConversationSummary` without `last_message_preview`, plus `platform_customer_id`.
data.conversation.assigned_user_idrequiredstring | nullpattern `^usr_[0-9a-hjkmnp-tv-z]{26}$`
data.conversation.channelrequired"widget" | "playground" | "preview" | "demo" | "api"
data.conversation.closed_atrequiredstring | nullformat date-time
data.conversation.csat_scorerequiredinteger | null
data.conversation.handoff_requested_atrequiredstring | nullformat date-time
data.conversation.handoff_staterequired"none" | "requested" | "live" | "delivered_offline" | "failed" | "resolved"
data.conversation.idrequiredstringpattern `^conv_[0-9a-hjkmnp-tv-z]{26}$`
data.conversation.identity_levelrequired"guest" | "order_lookup" | "order_otp" | "customer"
data.conversation.is_testrequiredboolean
data.conversation.last_message_atrequiredstring | nullformat date-time
data.conversation.localerequiredstring | null
data.conversation.message_countrequiredinteger≥ 0
data.conversation.moderequired"ai" | "human_requested" | "human"
data.conversation.platform_customer_idrequiredstring | nullOnly for identity_level = customer
data.conversation.resolutionrequired"resolved_ai" | "handed_off" | "abandoned" | "unknown" | null
data.conversation.shopperrequiredShopperViewShopper identity as shown on lists (masked for agent/viewer, 06 §5.3).
data.conversation.shopper.emailrequiredstring | null
data.conversation.shopper.is_maskedrequiredboolean
data.conversation.shopper.is_verifiedrequiredboolean
data.conversation.shopper.namerequiredstring | null
data.conversation.started_atrequiredstringformat date-time
data.conversation.statusrequired"open" | "closed"
data.conversation.store_idrequiredstringpattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
data.conversation.tagsrequiredstring[]
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"conversation.closed"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "conversation": {
      "assigned_user_id": "usr_01j8000000e008000000000000",
      "channel": "widget",
      "closed_at": "2026-09-28T10:15:30.123Z",
      "csat_score": 1,
      "handoff_requested_at": "2026-09-28T10:15:30.123Z",
      "handoff_state": "none",
      "id": "conv_01j8000000e008000000000000",
      "identity_level": "guest",
      "is_test": true,
      "last_message_at": "2026-09-28T10:15:30.123Z",
      "locale": "da-DK",
      "message_count": 0,
      "mode": "ai",
      "platform_customer_id": "string",
      "resolution": "resolved_ai",
      "shopper": {
        "email": "string",
        "is_masked": true,
        "is_verified": true,
        "name": "string"
      },
      "started_at": "2026-09-28T10:15:30.123Z",
      "status": "open",
      "store_id": "sto_01j8000000e008000000000000",
      "tags": [
        "string"
      ]
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "conversation.closed"
}

conversation.created

A shopper started a conversation.

Sent with ShopAssist-Event-Type: conversation.created. Acknowledge with any 2xx within 10 seconds.

Payload of conversation.created
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredConversationEventData`{ conversation: ApiConversation }`.
data.conversationrequiredApiConversation`ConversationSummary` without `last_message_preview`, plus `platform_customer_id`.
data.conversation.assigned_user_idrequiredstring | nullpattern `^usr_[0-9a-hjkmnp-tv-z]{26}$`
data.conversation.channelrequired"widget" | "playground" | "preview" | "demo" | "api"
data.conversation.closed_atrequiredstring | nullformat date-time
data.conversation.csat_scorerequiredinteger | null
data.conversation.handoff_requested_atrequiredstring | nullformat date-time
data.conversation.handoff_staterequired"none" | "requested" | "live" | "delivered_offline" | "failed" | "resolved"
data.conversation.idrequiredstringpattern `^conv_[0-9a-hjkmnp-tv-z]{26}$`
data.conversation.identity_levelrequired"guest" | "order_lookup" | "order_otp" | "customer"
data.conversation.is_testrequiredboolean
data.conversation.last_message_atrequiredstring | nullformat date-time
data.conversation.localerequiredstring | null
data.conversation.message_countrequiredinteger≥ 0
data.conversation.moderequired"ai" | "human_requested" | "human"
data.conversation.platform_customer_idrequiredstring | nullOnly for identity_level = customer
data.conversation.resolutionrequired"resolved_ai" | "handed_off" | "abandoned" | "unknown" | null
data.conversation.shopperrequiredShopperViewShopper identity as shown on lists (masked for agent/viewer, 06 §5.3).
data.conversation.shopper.emailrequiredstring | null
data.conversation.shopper.is_maskedrequiredboolean
data.conversation.shopper.is_verifiedrequiredboolean
data.conversation.shopper.namerequiredstring | null
data.conversation.started_atrequiredstringformat date-time
data.conversation.statusrequired"open" | "closed"
data.conversation.store_idrequiredstringpattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
data.conversation.tagsrequiredstring[]
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"conversation.created"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "conversation": {
      "assigned_user_id": "usr_01j8000000e008000000000000",
      "channel": "widget",
      "closed_at": "2026-09-28T10:15:30.123Z",
      "csat_score": 1,
      "handoff_requested_at": "2026-09-28T10:15:30.123Z",
      "handoff_state": "none",
      "id": "conv_01j8000000e008000000000000",
      "identity_level": "guest",
      "is_test": true,
      "last_message_at": "2026-09-28T10:15:30.123Z",
      "locale": "da-DK",
      "message_count": 0,
      "mode": "ai",
      "platform_customer_id": "string",
      "resolution": "resolved_ai",
      "shopper": {
        "email": "string",
        "is_masked": true,
        "is_verified": true,
        "name": "string"
      },
      "started_at": "2026-09-28T10:15:30.123Z",
      "status": "open",
      "store_id": "sto_01j8000000e008000000000000",
      "tags": [
        "string"
      ]
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "conversation.created"
}

csat.submitted

A shopper rated a conversation.

Sent with ShopAssist-Event-Type: csat.submitted. Acknowledge with any 2xx within 10 seconds.

Payload of csat.submitted
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredCsatSubmittedData`{ conversation_id; score; comment }`.
data.commentrequiredstring | null
data.conversation_idrequiredstringpattern `^conv_[0-9a-hjkmnp-tv-z]{26}$`
data.scorerequiredinteger≥ 1 · ≤ 5
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"csat.submitted"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "comment": "string",
    "conversation_id": "conv_01j8000000e008000000000000",
    "score": 1
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "csat.submitted"
}

handoff.requested

A conversation was handed off to your team; the payload carries up to 50 transcript messages.

Sent with ShopAssist-Event-Type: handoff.requested. Acknowledge with any 2xx within 10 seconds.

Payload of handoff.requested
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredHandoffRequestedData`{ handoff; conversation; transcript (≤ 50); dashboard_url }` (`handoff.shopper` carries `identity_level` and `email_verified`).
data.conversationrequiredApiConversation`ConversationSummary` without `last_message_preview`, plus `platform_customer_id`.
data.conversation.assigned_user_idrequiredstring | nullpattern `^usr_[0-9a-hjkmnp-tv-z]{26}$`
data.conversation.channelrequired"widget" | "playground" | "preview" | "demo" | "api"
data.conversation.closed_atrequiredstring | nullformat date-time
data.conversation.csat_scorerequiredinteger | null
data.conversation.handoff_requested_atrequiredstring | nullformat date-time
data.conversation.handoff_staterequired"none" | "requested" | "live" | "delivered_offline" | "failed" | "resolved"
data.conversation.idrequiredstringpattern `^conv_[0-9a-hjkmnp-tv-z]{26}$`
data.conversation.identity_levelrequired"guest" | "order_lookup" | "order_otp" | "customer"
data.conversation.is_testrequiredboolean
data.conversation.last_message_atrequiredstring | nullformat date-time
data.conversation.localerequiredstring | null
data.conversation.message_countrequiredinteger≥ 0
data.conversation.moderequired"ai" | "human_requested" | "human"
data.conversation.platform_customer_idrequiredstring | nullOnly for identity_level = customer
data.conversation.resolutionrequired"resolved_ai" | "handed_off" | "abandoned" | "unknown" | null
data.conversation.shopperrequiredShopperViewShopper identity as shown on lists (masked for agent/viewer, 06 §5.3).
data.conversation.shopper.emailrequiredstring | null
data.conversation.shopper.is_maskedrequiredboolean
data.conversation.shopper.is_verifiedrequiredboolean
data.conversation.shopper.namerequiredstring | null
data.conversation.started_atrequiredstringformat date-time
data.conversation.statusrequired"open" | "closed"
data.conversation.store_idrequiredstringpattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
data.conversation.tagsrequiredstring[]
data.dashboard_urlrequiredstringformat uri · ≤ 2048 characters
data.handoffrequiredHandoffAdmin`HandoffAdmin = HandoffState & {…}` (03 §6).
data.handoff.accepted_atrequiredstring | nullformat date-time
data.handoff.agentrequiredAgentRef | null
data.handoff.agent.display_namerequiredstring
data.handoff.delivered_atrequiredstring | nullformat date-time
data.handoff.expected_wait_secondsrequiredinteger | null
data.handoff.idrequiredstringpattern `^hof_[0-9a-hjkmnp-tv-z]{26}$`
data.handoff.messagerequiredstringLocalized shopper-facing status text
data.handoff.reasonrequiredstring (enum)one of shopper_request, ai_escalation, action_request, policy, repeated_failure, error, outside_hours, quota_block, limit_reached
data.handoff.requested_atrequiredstringformat date-time
data.handoff.requested_byrequired"shopper" | "ai" | "agent" | "system"
data.handoff.shopperrequiredHandoffShopper`HandoffAdmin.shopper` (`platform_customer_id` only for `identity_level = customer`).
data.handoff.shopper.emailrequiredstring | null
data.handoff.shopper.email_verifiedrequiredboolean
data.handoff.shopper.identity_levelrequired"guest" | "order_lookup" | "order_otp" | "customer"
data.handoff.shopper.namerequiredstring | null
data.handoff.shopper.platform_customer_idrequiredstring | null
data.handoff.staterequired"requested" | "waiting_for_agent" | "live" | "delivered_offline" | "failed" | "resolved"
data.handoff.statusrequiredstring (enum)one of requested, waiting_for_agent, live, delivering, delivered, failed, resolved, cancelled
data.handoff.summaryrequiredstring | null
data.handoff.targetrequired"live_chat" | "email" | "helpdesk" | null
data.handoff.targetsrequiredHandoffTargetView[]
data.handoff.targets[].external_urlrequiredstring | nullformat uri · ≤ 2048 characters
data.handoff.targets[].integration_idrequiredstring | nullpattern `^int_[0-9a-hjkmnp-tv-z]{26}$`
data.handoff.targets[].last_errorrequiredstring | null
data.handoff.targets[].statusrequired"pending" | "delivered" | "failed" | "skipped"
data.handoff.targets[].typerequiredstring
data.transcriptrequiredApiMessage[]≤ 50 items
data.transcript[].authorrequiredMessageAuthorWho wrote a message.
data.transcript[].author.display_namerequiredstring | null
data.transcript[].author.typerequired"shopper" | "ai" | "human" | "system"
data.transcript[].blocksrequiredUiBlock[]
data.transcript[].created_atrequiredstringformat date-time
data.transcript[].idrequiredstringpattern `^msg_[0-9a-hjkmnp-tv-z]{26}$`
data.transcript[].is_ai_generatedrequiredboolean
data.transcript[].rolerequired"shopper" | "assistant" | "agent" | "system"
data.transcript[].seqrequiredinteger≥ 0
data.transcript[].textrequiredstring
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"handoff.requested"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "conversation": {
      "assigned_user_id": "usr_01j8000000e008000000000000",
      "channel": "widget",
      "closed_at": "2026-09-28T10:15:30.123Z",
      "csat_score": 1,
      "handoff_requested_at": "2026-09-28T10:15:30.123Z",
      "handoff_state": "none",
      "id": "conv_01j8000000e008000000000000",
      "identity_level": "guest",
      "is_test": true,
      "last_message_at": "2026-09-28T10:15:30.123Z",
      "locale": "da-DK",
      "message_count": 0,
      "mode": "ai",
      "platform_customer_id": "string",
      "resolution": "resolved_ai",
      "shopper": {
        "email": "string",
        "is_masked": true,
        "is_verified": true,
        "name": "string"
      },
      "started_at": "2026-09-28T10:15:30.123Z",
      "status": "open",
      "store_id": "sto_01j8000000e008000000000000",
      "tags": [
        "string"
      ]
    },
    "dashboard_url": "https://shop.example/products/linen-shirt",
    "handoff": {
      "agent": null,
      "expected_wait_seconds": 120,
      "id": "hof_01j8000000e008000000000001",
      "message": "We've let the team know. Someone will be with you shortly.",
      "state": "waiting_for_agent",
      "target": "live_chat"
    },
    "transcript": [
      {
        "author": {
          "display_name": "string",
          "type": "shopper"
        },
        "blocks": [
          {
            "as_of": "2026-09-28T10:15:30.123Z",
            "id": "b1",
            "items": [
              {
                "actions": {
                  "add_to_cart": true,
                  "check_store_stock": true,
                  "notify_back_in_stock": false
                },
                "as_of": "2026-09-28T10:15:30.123Z",
                "availability": {
                  "as_of": "2026-09-28T10:15:30.123Z",
                  "label": "Only 2 left",
                  "quantity": 2,
                  "status": "low_stock"
                },
                "badges": [
                  "New"
                ],
                "default_variant_id": "var_01j8000000e008000000000001",
                "image": {
                  "alt": "City bike",
                  "height": 600,
                  "url": "https://cdn.shopify.com/s/files/1/demo/bike-1.jpg",
                  "width": 800
                },
                "options": [
                  {
                    "name": "Size",
                    "values": [
                      {
                        "is_available": true,
                        "value": "M"
                      },
                      {
                        "is_available": false,
                        "value": "L"
                      }
                    ]
                  }
                ],
                "price": {
                  "amount": "4999",
                  "currency": "DKK",
                  "display": "4.999,00 kr."
                },
                "product_id": "prd_01j8000000e008000000000001",
                "rating": {
                  "average": 4.6,
                  "count": 128
                },
                "subtitle": "Nordic Bikes",
                "title": "Nordic City Bike 7-speed",
                "url": "https://nordicbikes.example/products/city-bike?utm_source=shopassist&utm_medium=chat",
                "variants": [
                  {
                    "availability": {
                      "as_of": "2026-09-28T10:15:30.123Z",
                      "label": "Only 2 left",
                      "quantity": 2,
                      "status": "low_stock"
                    },
                    "cart_ref": {
                      "variant_gid": "gid://shopify/ProductVariant/4711"
                    },
                    "options": {
                      "Size": "M"
                    },
                    "price": {
                      "amount": "4999",
                      "currency": "DKK",
                      "display": "4.999,00 kr."
                    },
                    "title": "M",
                    "variant_id": "var_01j8000000e008000000000001"
                  }
                ]
              }
            ],
            "layout": "carousel",
            "title": "City bikes in stock",
            "type": "products"
          }
        ],
        "created_at": "2026-09-28T10:15:30.123Z",
        "id": "msg_01j8000000e008000000000000",
        "is_ai_generated": true,
        "role": "shopper",
        "seq": 0,
        "text": "string"
      }
    ]
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "handoff.requested"
}

handoff.updated

A handoff changed state (taken over, delivered, resolved, failed).

Sent with ShopAssist-Event-Type: handoff.updated. Acknowledge with any 2xx within 10 seconds.

Payload of handoff.updated
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredHandoffUpdatedData`{ handoff: HandoffAdmin }`.
data.handoffrequiredHandoffAdmin`HandoffAdmin = HandoffState & {…}` (03 §6).
data.handoff.accepted_atrequiredstring | nullformat date-time
data.handoff.agentrequiredAgentRef | null
data.handoff.agent.display_namerequiredstring
data.handoff.delivered_atrequiredstring | nullformat date-time
data.handoff.expected_wait_secondsrequiredinteger | null
data.handoff.idrequiredstringpattern `^hof_[0-9a-hjkmnp-tv-z]{26}$`
data.handoff.messagerequiredstringLocalized shopper-facing status text
data.handoff.reasonrequiredstring (enum)one of shopper_request, ai_escalation, action_request, policy, repeated_failure, error, outside_hours, quota_block, limit_reached
data.handoff.requested_atrequiredstringformat date-time
data.handoff.requested_byrequired"shopper" | "ai" | "agent" | "system"
data.handoff.shopperrequiredHandoffShopper`HandoffAdmin.shopper` (`platform_customer_id` only for `identity_level = customer`).
data.handoff.shopper.emailrequiredstring | null
data.handoff.shopper.email_verifiedrequiredboolean
data.handoff.shopper.identity_levelrequired"guest" | "order_lookup" | "order_otp" | "customer"
data.handoff.shopper.namerequiredstring | null
data.handoff.shopper.platform_customer_idrequiredstring | null
data.handoff.staterequired"requested" | "waiting_for_agent" | "live" | "delivered_offline" | "failed" | "resolved"
data.handoff.statusrequiredstring (enum)one of requested, waiting_for_agent, live, delivering, delivered, failed, resolved, cancelled
data.handoff.summaryrequiredstring | null
data.handoff.targetrequired"live_chat" | "email" | "helpdesk" | null
data.handoff.targetsrequiredHandoffTargetView[]
data.handoff.targets[].external_urlrequiredstring | nullformat uri · ≤ 2048 characters
data.handoff.targets[].integration_idrequiredstring | nullpattern `^int_[0-9a-hjkmnp-tv-z]{26}$`
data.handoff.targets[].last_errorrequiredstring | null
data.handoff.targets[].statusrequired"pending" | "delivered" | "failed" | "skipped"
data.handoff.targets[].typerequiredstring
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"handoff.updated"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "handoff": {
      "agent": null,
      "expected_wait_seconds": 120,
      "id": "hof_01j8000000e008000000000001",
      "message": "We've let the team know. Someone will be with you shortly.",
      "state": "waiting_for_agent",
      "target": "live_chat"
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "handoff.updated"
}

lead.captured

A shopper left contact details in the chat.

Sent with ShopAssist-Event-Type: lead.captured. Acknowledge with any 2xx within 10 seconds.

Payload of lead.captured
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredLeadEventData`{ lead: Lead }`.
data.leadrequiredLead`Lead` (03 §6.19).
data.lead.confirmed_atrequiredstring | nullformat date-time
data.lead.consentsrequiredConsentRecordView[]
data.lead.consents[].confirmed_atrequiredstring | nullformat date-time
data.lead.consents[].consent_textrequiredstring
data.lead.consents[].consent_text_versionrequiredstring
data.lead.consents[].created_atrequiredstringformat date-time
data.lead.consents[].idrequiredstringpattern `^cns_[0-9a-hjkmnp-tv-z]{26}$`
data.lead.consents[].is_grantedrequiredboolean
data.lead.consents[].localerequiredstring
data.lead.consents[].purposerequiredstring (enum)one of newsletter, marketing_email, back_in_stock, transcript_email, handoff_share, analytics, preferences
data.lead.consents[].sourcerequiredstring (enum)one of widget_form, chat, cmp, double_opt_in, unsubscribe, dashboard, api
data.lead.consents[].withdrawn_atrequiredstring | nullformat date-time
data.lead.conversation_idrequiredstring | nullpattern `^conv_[0-9a-hjkmnp-tv-z]{26}$`
data.lead.created_atrequiredstringformat date-time
data.lead.emailrequiredstring
data.lead.idrequiredstringpattern `^lead_[0-9a-hjkmnp-tv-z]{26}$`
data.lead.localerequiredstring | null
data.lead.namerequiredstring | null
data.lead.newsletter_statusrequired"none" | "pending_confirmation" | "confirmed" | "unsubscribed"
data.lead.platform_sync_statusrequired"not_required" | "pending" | "synced" | "failed"
data.lead.purposesrequired("newsletter" | "contact_request" | "back_in_stock" | "transcript")[]
data.lead.sourcerequired"lead_form" | "chat_tool" | "handoff" | "back_in_stock"
data.lead.unsubscribed_atrequiredstring | nullformat date-time
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"lead.captured"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "lead": {
      "confirmed_at": "2026-09-28T10:15:30.123Z",
      "consents": [
        {
          "confirmed_at": "2026-09-28T10:15:30.123Z",
          "consent_text": "string",
          "consent_text_version": "string",
          "created_at": "2026-09-28T10:15:30.123Z",
          "id": "cns_01j8000000e008000000000000",
          "is_granted": true,
          "locale": "da-DK",
          "purpose": "newsletter",
          "source": "widget_form",
          "withdrawn_at": "2026-09-28T10:15:30.123Z"
        }
      ],
      "conversation_id": "conv_01j8000000e008000000000000",
      "created_at": "2026-09-28T10:15:30.123Z",
      "email": "string",
      "id": "lead_01j8000000e008000000000000",
      "locale": "da-DK",
      "name": "string",
      "newsletter_status": "none",
      "platform_sync_status": "not_required",
      "purposes": [
        "newsletter"
      ],
      "source": "lead_form",
      "unsubscribed_at": "2026-09-28T10:15:30.123Z"
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "lead.captured"
}

lead.confirmed

A shopper confirmed their newsletter sign-up (double opt-in).

Sent with ShopAssist-Event-Type: lead.confirmed. Acknowledge with any 2xx within 10 seconds.

Payload of lead.confirmed
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredLeadEventData`{ lead: Lead }`.
data.leadrequiredLead`Lead` (03 §6.19).
data.lead.confirmed_atrequiredstring | nullformat date-time
data.lead.consentsrequiredConsentRecordView[]
data.lead.consents[].confirmed_atrequiredstring | nullformat date-time
data.lead.consents[].consent_textrequiredstring
data.lead.consents[].consent_text_versionrequiredstring
data.lead.consents[].created_atrequiredstringformat date-time
data.lead.consents[].idrequiredstringpattern `^cns_[0-9a-hjkmnp-tv-z]{26}$`
data.lead.consents[].is_grantedrequiredboolean
data.lead.consents[].localerequiredstring
data.lead.consents[].purposerequiredstring (enum)one of newsletter, marketing_email, back_in_stock, transcript_email, handoff_share, analytics, preferences
data.lead.consents[].sourcerequiredstring (enum)one of widget_form, chat, cmp, double_opt_in, unsubscribe, dashboard, api
data.lead.consents[].withdrawn_atrequiredstring | nullformat date-time
data.lead.conversation_idrequiredstring | nullpattern `^conv_[0-9a-hjkmnp-tv-z]{26}$`
data.lead.created_atrequiredstringformat date-time
data.lead.emailrequiredstring
data.lead.idrequiredstringpattern `^lead_[0-9a-hjkmnp-tv-z]{26}$`
data.lead.localerequiredstring | null
data.lead.namerequiredstring | null
data.lead.newsletter_statusrequired"none" | "pending_confirmation" | "confirmed" | "unsubscribed"
data.lead.platform_sync_statusrequired"not_required" | "pending" | "synced" | "failed"
data.lead.purposesrequired("newsletter" | "contact_request" | "back_in_stock" | "transcript")[]
data.lead.sourcerequired"lead_form" | "chat_tool" | "handoff" | "back_in_stock"
data.lead.unsubscribed_atrequiredstring | nullformat date-time
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"lead.confirmed"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "lead": {
      "confirmed_at": "2026-09-28T10:15:30.123Z",
      "consents": [
        {
          "confirmed_at": "2026-09-28T10:15:30.123Z",
          "consent_text": "string",
          "consent_text_version": "string",
          "created_at": "2026-09-28T10:15:30.123Z",
          "id": "cns_01j8000000e008000000000000",
          "is_granted": true,
          "locale": "da-DK",
          "purpose": "newsletter",
          "source": "widget_form",
          "withdrawn_at": "2026-09-28T10:15:30.123Z"
        }
      ],
      "conversation_id": "conv_01j8000000e008000000000000",
      "created_at": "2026-09-28T10:15:30.123Z",
      "email": "string",
      "id": "lead_01j8000000e008000000000000",
      "locale": "da-DK",
      "name": "string",
      "newsletter_status": "none",
      "platform_sync_status": "not_required",
      "purposes": [
        "newsletter"
      ],
      "source": "lead_form",
      "unsubscribed_at": "2026-09-28T10:15:30.123Z"
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "lead.confirmed"
}

lead.unsubscribed

A shopper unsubscribed.

Sent with ShopAssist-Event-Type: lead.unsubscribed. Acknowledge with any 2xx within 10 seconds.

Payload of lead.unsubscribed
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredLeadEventData`{ lead: Lead }`.
data.leadrequiredLead`Lead` (03 §6.19).
data.lead.confirmed_atrequiredstring | nullformat date-time
data.lead.consentsrequiredConsentRecordView[]
data.lead.consents[].confirmed_atrequiredstring | nullformat date-time
data.lead.consents[].consent_textrequiredstring
data.lead.consents[].consent_text_versionrequiredstring
data.lead.consents[].created_atrequiredstringformat date-time
data.lead.consents[].idrequiredstringpattern `^cns_[0-9a-hjkmnp-tv-z]{26}$`
data.lead.consents[].is_grantedrequiredboolean
data.lead.consents[].localerequiredstring
data.lead.consents[].purposerequiredstring (enum)one of newsletter, marketing_email, back_in_stock, transcript_email, handoff_share, analytics, preferences
data.lead.consents[].sourcerequiredstring (enum)one of widget_form, chat, cmp, double_opt_in, unsubscribe, dashboard, api
data.lead.consents[].withdrawn_atrequiredstring | nullformat date-time
data.lead.conversation_idrequiredstring | nullpattern `^conv_[0-9a-hjkmnp-tv-z]{26}$`
data.lead.created_atrequiredstringformat date-time
data.lead.emailrequiredstring
data.lead.idrequiredstringpattern `^lead_[0-9a-hjkmnp-tv-z]{26}$`
data.lead.localerequiredstring | null
data.lead.namerequiredstring | null
data.lead.newsletter_statusrequired"none" | "pending_confirmation" | "confirmed" | "unsubscribed"
data.lead.platform_sync_statusrequired"not_required" | "pending" | "synced" | "failed"
data.lead.purposesrequired("newsletter" | "contact_request" | "back_in_stock" | "transcript")[]
data.lead.sourcerequired"lead_form" | "chat_tool" | "handoff" | "back_in_stock"
data.lead.unsubscribed_atrequiredstring | nullformat date-time
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"lead.unsubscribed"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "lead": {
      "confirmed_at": "2026-09-28T10:15:30.123Z",
      "consents": [
        {
          "confirmed_at": "2026-09-28T10:15:30.123Z",
          "consent_text": "string",
          "consent_text_version": "string",
          "created_at": "2026-09-28T10:15:30.123Z",
          "id": "cns_01j8000000e008000000000000",
          "is_granted": true,
          "locale": "da-DK",
          "purpose": "newsletter",
          "source": "widget_form",
          "withdrawn_at": "2026-09-28T10:15:30.123Z"
        }
      ],
      "conversation_id": "conv_01j8000000e008000000000000",
      "created_at": "2026-09-28T10:15:30.123Z",
      "email": "string",
      "id": "lead_01j8000000e008000000000000",
      "locale": "da-DK",
      "name": "string",
      "newsletter_status": "none",
      "platform_sync_status": "not_required",
      "purposes": [
        "newsletter"
      ],
      "source": "lead_form",
      "unsubscribed_at": "2026-09-28T10:15:30.123Z"
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "lead.unsubscribed"
}

message.created

A message was added to a conversation. Opt-in and high volume.

Sent with ShopAssist-Event-Type: message.created. Acknowledge with any 2xx within 10 seconds.

Payload of message.created
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredMessageCreatedData`{ conversation_id; message: ApiMessage }` (opt-in, high volume).
data.conversation_idrequiredstringpattern `^conv_[0-9a-hjkmnp-tv-z]{26}$`
data.messagerequiredApiMessage`{ id; seq; role; text; blocks; is_ai_generated; author: {type; display_name}; created_at }`.
data.message.authorrequiredMessageAuthorWho wrote a message.
data.message.author.display_namerequiredstring | null
data.message.author.typerequired"shopper" | "ai" | "human" | "system"
data.message.blocksrequiredUiBlock[]
data.message.created_atrequiredstringformat date-time
data.message.idrequiredstringpattern `^msg_[0-9a-hjkmnp-tv-z]{26}$`
data.message.is_ai_generatedrequiredboolean
data.message.rolerequired"shopper" | "assistant" | "agent" | "system"
data.message.seqrequiredinteger≥ 0
data.message.textrequiredstring
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"message.created"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "conversation_id": "conv_01j8000000e008000000000000",
    "message": {
      "author": {
        "display_name": "string",
        "type": "shopper"
      },
      "blocks": [
        {
          "as_of": "2026-09-28T10:15:30.123Z",
          "id": "b1",
          "items": [
            {
              "actions": {
                "add_to_cart": true,
                "check_store_stock": true,
                "notify_back_in_stock": false
              },
              "as_of": "2026-09-28T10:15:30.123Z",
              "availability": {
                "as_of": "2026-09-28T10:15:30.123Z",
                "label": "Only 2 left",
                "quantity": 2,
                "status": "low_stock"
              },
              "badges": [
                "New"
              ],
              "default_variant_id": "var_01j8000000e008000000000001",
              "image": {
                "alt": "City bike",
                "height": 600,
                "url": "https://cdn.shopify.com/s/files/1/demo/bike-1.jpg",
                "width": 800
              },
              "options": [
                {
                  "name": "Size",
                  "values": [
                    {
                      "is_available": true,
                      "value": "M"
                    },
                    {
                      "is_available": false,
                      "value": "L"
                    }
                  ]
                }
              ],
              "price": {
                "amount": "4999",
                "currency": "DKK",
                "display": "4.999,00 kr."
              },
              "product_id": "prd_01j8000000e008000000000001",
              "rating": {
                "average": 4.6,
                "count": 128
              },
              "subtitle": "Nordic Bikes",
              "title": "Nordic City Bike 7-speed",
              "url": "https://nordicbikes.example/products/city-bike?utm_source=shopassist&utm_medium=chat",
              "variants": [
                {
                  "availability": {
                    "as_of": "2026-09-28T10:15:30.123Z",
                    "label": "Only 2 left",
                    "quantity": 2,
                    "status": "low_stock"
                  },
                  "cart_ref": {
                    "variant_gid": "gid://shopify/ProductVariant/4711"
                  },
                  "options": {
                    "Size": "M"
                  },
                  "price": {
                    "amount": "4999",
                    "currency": "DKK",
                    "display": "4.999,00 kr."
                  },
                  "title": "M",
                  "variant_id": "var_01j8000000e008000000000001"
                }
              ]
            }
          ],
          "layout": "carousel",
          "title": "City bikes in stock",
          "type": "products"
        }
      ],
      "created_at": "2026-09-28T10:15:30.123Z",
      "id": "msg_01j8000000e008000000000000",
      "is_ai_generated": true,
      "role": "shopper",
      "seq": 0,
      "text": "string"
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "message.created"
}

order.attributed

An order was attributed to a conversation.

Sent with ShopAssist-Event-Type: order.attributed. Acknowledge with any 2xx within 10 seconds.

Payload of order.attributed
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredOrderAttributedData`{ order }`.
data.orderrequiredAttributedOrderEventView`{ id; platform_order_id; order_number; attribution_type; total; assisted_amount; ordered_at; conversation_id }`.
data.order.assisted_amountrequiredMoney | null
data.order.assisted_amount.amountrequiredstringpattern `^-?\d+(\.\d{1,6})?$`
data.order.assisted_amount.currencyrequiredstringpattern `^[A-Z]{3}$`
data.order.attribution_typerequired"bot_add_to_cart" | "bot_checkout_link" | "assisted_session"
data.order.conversation_idrequiredstring | nullpattern `^conv_[0-9a-hjkmnp-tv-z]{26}$`
data.order.idrequiredstringpattern `^aor_[0-9a-hjkmnp-tv-z]{26}$`
data.order.order_numberrequiredstring | null
data.order.ordered_atrequiredstringformat date-time
data.order.platform_order_idrequiredstring
data.order.totalrequiredMoneyAn amount with its currency (`03` §2.4 `Money`).
data.order.total.amountrequiredstringpattern `^-?\d+(\.\d{1,6})?$`
data.order.total.currencyrequiredstringpattern `^[A-Z]{3}$`
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"order.attributed"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "order": {
      "assisted_amount": {
        "amount": "499.95",
        "currency": "DKK"
      },
      "attribution_type": "bot_add_to_cart",
      "conversation_id": "conv_01j8000000e008000000000000",
      "id": "aor_01j8000000e008000000000000",
      "order_number": "string",
      "ordered_at": "2026-09-28T10:15:30.123Z",
      "platform_order_id": "string",
      "total": {
        "amount": "499.95",
        "currency": "DKK"
      }
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "order.attributed"
}

privacy_request.completed

A privacy request (export or erasure) finished.

Sent with ShopAssist-Event-Type: privacy_request.completed. Acknowledge with any 2xx within 10 seconds.

Payload of privacy_request.completed
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredPrivacyRequestCompletedData`{ privacy_request: PrivacyRequest }`.
data.privacy_requestrequiredPrivacyRequest`PrivacyRequest` (03 §6.16).
data.privacy_request.completed_atrequiredstring | nullformat date-time
data.privacy_request.created_atrequiredstringformat date-time
data.privacy_request.due_atrequiredstringformat date-time
data.privacy_request.idrequiredstringpattern `^prq_[0-9a-hjkmnp-tv-z]{26}$`
data.privacy_request.sourcerequiredstring (enum)one of dashboard, merchant_api, shopify_customers_data_request, shopify_customers_redact, shopify_shop_redact, woocommerce, prestashop, magento2, operator
data.privacy_request.statsrequiredobject
data.privacy_request.statusrequired"received" | "processing" | "completed" | "failed" | "cancelled"
data.privacy_request.subject_summaryrequiredstringMasked, e.g. "email j***@example.com", "customer 4711"
data.privacy_request.typerequired"export" | "delete"
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"privacy_request.completed"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "privacy_request": {
      "completed_at": "2026-09-28T10:15:30.123Z",
      "created_at": "2026-09-28T10:15:30.123Z",
      "due_at": "2026-09-28T10:15:30.123Z",
      "id": "prq_01j8000000e008000000000000",
      "source": "dashboard",
      "stats": {},
      "status": "received",
      "subject_summary": "string",
      "type": "export"
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "privacy_request.completed"
}

store.status_changed

A store changed status (for example connected, disconnected, suspended).

Sent with ShopAssist-Event-Type: store.status_changed. Acknowledge with any 2xx within 10 seconds.

Payload of store.status_changed
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredStoreStatusChangedData`{ store: StorePublic; previous_status }`.
data.previous_statusrequiredstring (enum)one of pending_connect, connecting, syncing, active, paused, reconnect_required, disconnected, uninstalled, suspended
data.storerequiredStorePublic`{ id; name; platform; status; primary_domain; catalog_locale; currency; timezone; capabilities; created_at }`.
data.store.capabilitiesrequiredobjectstores.capabilities (02 §17)
data.store.catalog_localerequiredstring2–35 characters · pattern `^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$`
data.store.created_atrequiredstringformat date-time
data.store.currencyrequiredstringpattern `^[A-Z]{3}$`
data.store.idrequiredstringpattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
data.store.namerequiredstring
data.store.platformrequired"shopify" | "magento2" | "woocommerce" | "prestashop" | "generic"
data.store.primary_domainrequiredstring | null
data.store.statusrequiredstring (enum)one of pending_connect, connecting, syncing, active, paused, reconnect_required, disconnected, uninstalled, suspended
data.store.timezonerequiredstring
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"store.status_changed"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "previous_status": "pending_connect",
    "store": {
      "capabilities": {},
      "catalog_locale": "da-DK",
      "created_at": "2026-09-28T10:15:30.123Z",
      "currency": "DKK",
      "id": "sto_01j8000000e008000000000000",
      "name": "string",
      "platform": "shopify",
      "primary_domain": "string",
      "status": "pending_connect",
      "timezone": "string"
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "store.status_changed"
}

sync.failed

A catalog sync run failed.

Sent with ShopAssist-Event-Type: sync.failed. Acknowledge with any 2xx within 10 seconds.

Payload of sync.failed
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredSyncFailedData`{ sync_run: SyncRun }` (topic `sync.run_failed`).
data.sync_runrequiredSyncRun`SyncRun` (03 §6.9).
data.sync_run.created_atrequiredstringformat date-time
data.sync_run.error_coderequiredstring | null
data.sync_run.error_detailrequiredstring | nullMerchant-safe message
data.sync_run.finished_atrequiredstring | nullformat date-time
data.sync_run.idrequiredstringpattern `^sync_[0-9a-hjkmnp-tv-z]{26}$`
data.sync_run.kindrequiredstring (enum)one of initial, incremental, reconcile, content, translations, inventory, locations, single, feed
data.sync_run.progressrequiredobject{phase, done, total}
data.sync_run.started_atrequiredstring | nullformat date-time
data.sync_run.statsrequiredobject
data.sync_run.statusrequired"queued" | "running" | "succeeded" | "partial" | "failed" | "cancelled"
data.sync_run.triggerrequiredstring (enum)one of install, webhook, push, ping, schedule, manual, operator
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"sync.failed"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "sync_run": {
      "created_at": "2026-09-28T10:15:30.123Z",
      "error_code": "string",
      "error_detail": "string",
      "finished_at": "2026-09-28T10:15:30.123Z",
      "id": "sync_01j8000000e008000000000000",
      "kind": "initial",
      "progress": {},
      "started_at": "2026-09-28T10:15:30.123Z",
      "stats": {},
      "status": "queued",
      "trigger": "install"
    }
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "sync.failed"
}

usage.threshold_reached

Usage reached 80 % or 100 % of the included conversations, or the overage budget.

Sent with ShopAssist-Event-Type: usage.threshold_reached. Acknowledge with any 2xx within 10 seconds.

Payload of usage.threshold_reached
FieldTypeDescription
api_versionrequired"v1"default "v1"
created_atrequiredstringformat date-time
datarequiredUsageThresholdReachedData`{ billing_account_id; threshold; units_total; included_units }` (mapping from the internal thresholds: 01 §8.1).
data.billing_account_idrequiredstringpattern `^bac_[0-9a-hjkmnp-tv-z]{26}$`
data.included_unitsrequiredinteger | null≥ 0
data.thresholdrequired"80_percent" | "100_percent" | "budget_reached"
data.units_totalrequiredinteger≥ 0
idrequiredstringpattern `^evt_[0-9a-hjkmnp-tv-z]{26}$`
organization_idrequiredstringpattern `^org_[0-9a-hjkmnp-tv-z]{26}$`
store_idrequiredstring | nullnull for organization-level events (usage)pattern `^sto_[0-9a-hjkmnp-tv-z]{26}$`
typerequired"usage.threshold_reached"
{
  "api_version": "v1",
  "created_at": "2026-09-28T10:15:30.123Z",
  "data": {
    "billing_account_id": "bac_01j8000000e008000000000000",
    "included_units": 0,
    "threshold": "80_percent",
    "units_total": 0
  },
  "id": "evt_01j8000000e008000000000000",
  "organization_id": "org_01j8000000e008000000000000",
  "store_id": "sto_01j8000000e008000000000000",
  "type": "usage.threshold_reached"
}

Last updated on

On this page