Note: Mobile events have been deprecated in favor of clickstream events and will eventually be removed. Please consider updating your consumer to use clickstream webhooks instead. Clickstream webhooks generally contain richer dataset, more varied event types, and you can configure them yourself directly in your Tapcart dashboard.
How to configure your Webhook?
You will create an HTTPS endpoint on your app as a webhook receiver, and specify that endpoint's URL as the webhook subscription's endpoint.
This generated URL must be able to accept HTTP POST requests. For example, your domain is
https://mycompanysite.com
A common method merchant's may use is a route to a dedicated webhook endpoint. An example of a route to that webhook endpoint is:
@app.route('/tapcart_webhooks', methods=['POST'])
Then the specified URL should combine your domain and the webhook endpoint
https://mycompanysite.com/tapcart_webhooks
How do I send my URL to Tapcart?
Once the URL has been specified with a domain and webhook endpoint that can receive POST requests, you will need to reach out to the Tapcart team via email. We will take the URL and then subscribe the merchant to a dedicated topic to receive POST requests.
The following messages represent the standard error codes your server should send after Tapcart's attempted POST requests are sent to the webhook endpoint:
Code
Description
200
Successful Request
400
Invalid Request
401
Unauthorized Request
403
Forbidden
429
Throttling errors
422
Custom errors
500–511
Server errors
In the event you see a 400 or 500 response, Tapcart webhooks will go through a process of retrying the event in order to complete for 5 minutes. If the event still fails to process, Tapcart will end retrying the event.
Payload Structure
Upon receiving a successful 200 POST request from the webhook, an individual payload will be received in JSON format.
This event payload will include a single event performed by a single user. The webhook streams data as it's received and in its entirety.
Guaranteed Fields (All Events)
The following fields are present on every mobile app event payload:
Field
Type
Description
event_type
string
The name of the event (e.g. AppOpened, ProductViewed).
Event-specific data. Contents vary by event_type. See Event Properties.
Device Properties
Fields present on every event:
Field
Type
Description
os
string
Operating system (e.g. ios, Android).
os_version
string
OS version (e.g. 26.3.1, 18.7.7).
manufacturer
string
Device manufacturer (e.g. Apple).
country
string
Two-letter country code (e.g. US).
locale
string
Locale code (e.g. en, es).
App Properties
Fields present on every event:
Field
Type
Description
app_id
string
Unique merchant identifier.
app_version
string
App version (e.g. 7.9).
os_version
string
OS version.
tapcart_build
string
Tapcart build version (e.g. 20.17.1).
active_feature_experiments
string
JSON-encoded string containing active feature flag experiments.
Shopify Properties
Fields present on every event:
Field
Type
Description
shopify_user_id
string | number | null
Shopify customer ID. null when user is not identified.
logged_in
boolean
Whether the user is logged in.
Session Properties
Fields present on every event:
Field
Type
Description
session_id
string
Unique session identifier.
source
string
Session source (e.g. direct).
Event Properties
The contents of event_properties vary by event_type. This object is always present but its fields are event-specific. See Event Properties by Type for details.
Example Payload (Standard Format)
The majority of events use this structure. Below is an AppOpened event:
Some events include additional fields beyond the standard format. The CustomBlockViewed event is a known example that includes the full extended payload.
Additional Top-Level Fields
Field
Type
Description
metadata
object
Contains schema_id identifying the event schema version.
timestamp_iso
string
ISO 8601 formatted timestamp (e.g. 2026-04-13T17:03:56.014-07:00).
Additional Device Properties
Field
Type
Description
ip
string
User's IP address.
model
string
Device model identifier (e.g. iPhone16,2).
orientation
string
Screen orientation (e.g. portrait).
carrier
string
Mobile carrier name.
radio
string
Connection type (e.g. Wifi).
lib_version
string
SDK library version.
wifi
boolean
Whether the device is on Wi-Fi.
app_version
string | null
App version.
tapcart_build
string | null
Tapcart build version.
external_build
string | null
External build version.
tapcart_commit_hash
string | null
Tapcart commit hash.
consumer_type
string
Consumer type (e.g. Returning).
device_id
string
Unique device identifier.
prev_push_enabled
boolean
Whether push was previously enabled.
push_enabled
boolean
Whether push is currently enabled.
Additional App Properties
Field
Type
Description
currency_code
string
Store currency code (e.g. USD).
external_build
string
External build version.
tapcart_commit_hash
string | null
Tapcart commit hash.
environment
string
Environment name (e.g. release).
Additional Session Properties
Field
Type
Description
session_type
string
Session type (e.g. Returning).
session_start_time
number
Session start time in epoch milliseconds.
notification_id
string | null
Notification identifier that triggered the session.
notification_type
string | null
Type of notification.
utm_source
string | null
UTM source parameter.
utm_medium
string | null
UTM medium parameter.
utm_campaign
string | null
UTM campaign parameter.
utm_content
string | null
UTM content parameter.
utm_term
string | null
UTM term parameter.
external_notification_id
string | null
External notification identifier.
segment_id
string | null
Segment identifier.
📝 Note: The notification_id field in session_properties may also appear on standard-format events when the session was triggered by a notification (e.g. InboxItemViewed).
Every event received from the webhook will represent new data. The Insight Data Streaming webhook does not provide any historical data previous to when the webhook was setup.