apex-spec v1.0.0
The Apex Spec
The canonical event vocabulary your app and Apex's platform speak. Templates, journeys, audiences, and conversion goals all read field names from this catalog \u2014 so naming a payload the spec way means everything you wire up afterward just snaps together.
Customer SDK
App events
47 declaredWhat your customer-facing app fires through the snippet or SDK. Commerce, identity, engagement, communication \u2014 the canonical vocabulary you stand up day one.
apex.track('add_to_cart', { product_id, value, currency })Apex platform
Platform events
25 declaredWhat Apex's dashboard fires as merchants use it. Invitations, integrations, experiments, portfolio access, billing transitions. Templates and journeys wire up these out of the box.
trackApexInternal({ eventName: 'user_invitation_accepted', \u2026 })App events
What your customer-facing app fires. Field names are flat snake_case (e.g. product_id, order_id).
Commerce
Cart, checkout, and revenue. Drives attribution + abandonment journeys.
add_to_cart
Primary metricUser added a product to their cart.
- product_id*
- string
- prod_atlas_runner_blue_42
- value
- number
- 129.99
- currency
- string
- USD
- quantity
- number
- 1
- cart_id
- string
- cart_9f2e1a
remove_from_cart
User removed a product from their cart.
- product_id*
- string
- prod_atlas_runner_blue_42
- value
- number
- 129.99
- currency
- string
- USD
- quantity
- number
- 1
- cart_id
- string
- cart_9f2e1a
product_view
User viewed a product detail screen.
- product_id*
- string
- prod_atlas_runner_blue_42
- category
- string
- Footwear / Running
- value
- number
- 129.99
- currency
- string
- USD
add_to_wishlist
User added a product to a wishlist or saved-for-later list.
- product_id*
- string
- prod_atlas_runner_blue_42
- value
- number
- 129.99
- currency
- string
- USD
checkout_started
Primary metricUser began the checkout flow.
- value
- number
- 259.98
- currency
- string
- USD
- item_count
- number
- 2
- cart_id
- string
- cart_9f2e1a
in_app_purchase
Primary metricRevenue event: user completed a purchase inside the app.
- order_id*
- string
- ord_2024_03_45891
- value*
- number
- 259.98
- currency*
- string
- USD
- product_id
- string
- prod_atlas_runner_blue_42
- transaction_id
- string
- txn_stripe_3PqXyZ
- items
- array
- is_restored
- boolean
- false
purchase_refunded
Primary metricA prior purchase was refunded.
- order_id*
- string
- ord_2024_03_45891
- value*
- number
- 129.99
- currency*
- string
- USD
- reason
- string
- Customer requested refund within return window
subscription_event
Primary metricSubscription lifecycle transition (start, renew, cancel, trial conversion, etc).
- product_id*
- string
- atlas_pro_annual
- action*
- string
- start
- amount
- number
- 299
- currency
- string
- USD
- period_type
- string
- annual
- transaction_id
- string
- txn_stripe_3PqXyZ
- expires_at
- string
- 2027-05-21T00:00:00Z
- is_trial
- boolean
- false
Identity
Sign-up, sign-in, and identity stitching.
user_signed_up
Primary metricA new user account was created.
- method
- string
- referrer
- string
- https://google.com/search?q=atlas+running
user_signed_in
User authenticated into the app.
- method
- string
user_signed_out
User signed out of the app.
No payload fields required.
user_identified
Anonymous visitor was linked to a known user identity.
- user_id*
- string
- usr_atlas_8f3a92
- traits
- object
Lifecycle
Install, open, background, uninstall. Session foundation.
app_install
First install of the app on this device.
No payload fields required.
app_open
Primary metricApp was foregrounded by the user. Foundational session signal.
- source
- string
- push_notification
app_background
App was backgrounded.
No payload fields required.
app_uninstall
App was uninstalled from the device (server-inferred from push silent failure).
No payload fields required.
app_reinstall
App was reinstalled within the reinstall window.
No payload fields required.
Session
Explicit session boundaries with duration.
session_start
Beginning of a session (gap from last event > session timeout).
- session_id
- string
- sess_2026_05_21_abc123
session_end
End of a session (background or timeout).
- session_id
- string
- sess_2026_05_21_abc123
- duration_ms
- number
- 187320
Engagement
Page views, screens, searches, content interactions.
page_view
User viewed a screen or page. Canonical name across web and mobile.
- path
- string
- /products/atlas-runner
- title
- string
- Atlas Runner — Atlas Athletics
- referrer
- string
- https://google.com/search?q=atlas+running
pageview
Deprecated · use page_viewLegacy web pageview. Prefer `page_view` for new integrations.
- path
- string
- /products/atlas-runner
- title
- string
- Atlas Runner — Atlas Athletics
- referrer
- string
- https://google.com/search?q=atlas+running
screen_view
Mobile screen render. Equivalent to `page_view` for native screens.
- screen_name*
- string
- ProductDetail
- previous_screen
- string
- ProductList
search
User executed a search query.
- query*
- string
- trail running shoes
- results_count
- number
- 24
share
User shared content to an external surface.
- content_id
- string
- prod_atlas_runner_blue_42
- channel
- string
content_view
User viewed a piece of content (article, video, etc).
- content_id*
- string
- blog_2026_05_running_form_guide
- content_type
- string
- article
- duration_ms
- number
- 42500
form_submit
Form was submitted by the user.
- form_id
- string
- newsletter_signup
click
Generic click event.
- target
- string
- button#hero-cta
engagement
Composite engagement signal (web only — replaced by individual events on mobile).
No payload fields required.
heartbeat
Periodic heartbeat indicating the user is still active on a page.
No payload fields required.
rage_click
Multiple rapid clicks on the same element — frustration signal.
- target
- string
- button#submit-disabled
dead_click
Click that produced no observable effect — frustration signal.
- target
- string
- div.banner-image
goal_conversion
Primary metricUser completed a defined conversion goal.
- goal_id*
- string
- signup_completed
- value
- number
- 25
Where this is used
Communication
Push, email, in-app message delivery + interaction.
push_received
Device received a push notification (delivery confirmation).
- message_id
- string
- msg_2026_05_21_abc
- campaign_id
- string
- cmp_atlas_spring_2026
push_opened
User tapped/opened a push notification.
- message_id
- string
- msg_2026_05_21_abc
- campaign_id
- string
- cmp_atlas_spring_2026
- deep_link
- string
- atlas://product/atlas-runner
email_opened
Email open tracked via pixel.
- message_id
- string
- msg_2026_05_21_abc
- campaign_id
- string
- cmp_atlas_spring_2026
email_clicked
Link in email was clicked.
- message_id
- string
- msg_2026_05_21_abc
- campaign_id
- string
- cmp_atlas_spring_2026
- link
- string
- https://atlasathletics.com/products/atlas-runner
in_app_message_seen
In-app message was rendered to the user.
- message_id
- string
- msg_2026_05_21_abc
- campaign_id
- string
- cmp_atlas_spring_2026
in_app_message_clicked
User interacted with an in-app message CTA.
- message_id
- string
- msg_2026_05_21_abc
- campaign_id
- string
- cmp_atlas_spring_2026
- cta
- string
- upgrade_now
Deep links
Deferred + direct deep-link opens with attribution context.
deep_link_open
App opened via a deep link.
- url*
- string
- atlas://product/atlas-runner
- source
- string
- campaign_id
- string
- cmp_atlas_spring_2026
- referrer
- string
- https://atlasathletics.com
Attribution
Reattribution and reengagement signals.
reattribution
A re-install was matched to a prior install.
- partner_id
- string
- partner_facebook_ads
- original_install_id
- string
- inst_2025_11_xyz
reengagement
A returning user opened the app after a period of inactivity.
- partner_id
- string
- partner_email_winback
- inactive_days
- number
- 30
System
Custom events and internal lifecycle transitions.
custom
Custom event type. Stored with the original event name preserved in `data.eventName`. Use canonical events when possible.
No payload fields required.
lifecycle_transition
Internal Apex lifecycle/level transition event (not user-generated).
No payload fields required.
js_error
JavaScript runtime error captured by the web SDK.
- message
- string
- ReferenceError: window.atlas is not defined
- stack
- string
- at fn (https://atlasathletics.com/app.js:123:45)
Platform events
What Apex itself fires as merchants use the dashboard. Useful when you build agent automations on top of the platform.
Invitations
Team invite lifecycle from Apex's dashboard.
user_invitation_created
An organization owner/admin invited a new teammate. Drives the invite email + reminder branch.
- inviter_name*
- string
- Sarah Chen
- inviter_email
- string
- sarah@hypernova.inc
- org_name*
- string
- Hypernova Inc
- org_id*
- string
- org_hypernova_8f3a
- invitee_email*
- string
- alex@example.com
- role*
- string
- admin
- accept_url*
- string
- https://app.apex.inc/invite/accept?token=inv_4f8a2b7c9d3e1f6a
- invitation_token
- string
- inv_4f8a2b7c9d3e1f6a
- invitation_id
- string
- inv_4f8a2b7c
Where this is used
user_invitation_accepted
A pending invitation was accepted. Notifies the inviter that their teammate joined.
- member_name*
- string
- Alex Rivera
- inviter_name
- string
- Sarah Chen
- inviter_email
- string
- sarah@hypernova.inc
- org_name*
- string
- Hypernova Inc
- role*
- string
- admin
- invitee_email
- string
- alex@example.com
- href
- string
- /dashboard/settings/organization/team
Where this is used
developer_invite_sent
An operator handed SDK wire-up off to a developer with a private integration-guide link.
- inviter_name*
- string
- Sarah Chen
- inviter_role
- string
- admin
- developer_email*
- string
- dev@hypernova.inc
- workspace_name
- string
- Hypernova Production
- note
- string
- Snippet goes in the global layout please.
- handoff_url*
- string
- https://app.apex.inc/onboarding/developer-handoff?token=hof_4f8a2b7c
- signup_url
- string
- https://app.apex.inc/signup
Where this is used
Integrations
Connector connect / sync / failure events Apex fires per merchant.
integration_connected
A data-source integration was authenticated and connected.
- integration_name*
- string
- LinkedIn Ads
- integrations_url
- string
- /dashboard/integrations
Where this is used
integration_sync_completed
A scheduled data import from a connected integration finished successfully.
- integration_name*
- string
- LinkedIn Ads
- row_count
- number
- 1247
- performance_url
- string
- /dashboard/performance
- integrations_url
- string
- /dashboard/integrations
Where this is used
integration_sync_failed
A scheduled data import from a connected integration failed.
- integration_name*
- string
- Google Analytics
- error_message
- string
- Authentication expired — please reconnect.
- integrations_url
- string
- /dashboard/integrations
Where this is used
Experiments
Launches, significance, conclusions, promotion to default.
experiment_launched
An A/B experiment was started.
- experiment_name*
- string
- Homepage CTA Copy Test
- experiment_url
- string
- /dashboard/experiments/exp_homepage_cta
- hypothesis
- string
- Changing the CTA from 'Get Started' to 'Start Free' lifts signup rate by 15%.
Where this is used
experiment_significant
An experiment reached statistical significance.
- experiment_name*
- string
- Homepage CTA Copy Test
- winning_arm
- string
- Start Free
- lift
- string
- 18.3%
- experiment_url
- string
- /dashboard/experiments/exp_homepage_cta
Where this is used
experiment_concluded
An experiment finished (either by significance or by evaluation-window expiry).
- experiment_name*
- string
- Homepage CTA Copy Test
- result
- string
- winner
- lift
- string
- 18.3%
- confidence
- string
- 97.2%
- experiment_url
- string
- /dashboard/experiments/exp_homepage_cta
- result_label
- string
- Significant winner
Where this is used
experiment_promoted
An experiment's winning arm was promoted to the default.
- experiment_name*
- string
- Homepage CTA Copy Test
- winning_arm
- string
- Start Free
- experiment_url
- string
- /dashboard/experiments/exp_homepage_cta
Portfolio
Investor / partner access requests and share-link acceptances.
portfolio_access_requested
An investor or partner requested access to a portfolio.
- requester_name*
- string
- Sequoia Capital
- requester_email
- string
- partners@sequoia.com
- portfolio_name
- string
- Atlas Athletics — Series B Data Room
- approve_url*
- string
- https://app.apex.inc/portfolio/requests/req_abc/approve
- reject_url
- string
- https://app.apex.inc/portfolio/requests/req_abc/reject
Where this is used
portfolio_access_approved
A portfolio access request was approved by the owner.
- granter_name*
- string
- Atlas Athletics
- scope
- string
- all projects
- portfolio_url
- string
- /dashboard/portfolio
- portfolio_name
- string
- Atlas Athletics — Series B Data Room
Where this is used
portfolio_access_rejected
A portfolio access request was rejected by the owner.
- granter_name*
- string
- Atlas Athletics
- portfolio_name
- string
- Atlas Athletics — Series B Data Room
- reason
- string
- Not ready to share yet — let's reconnect after our next board meeting.
Where this is used
portfolio_share_accepted
A recipient accepted a portfolio share link.
- viewer_email*
- string
- partners@sequoia.com
- portfolio_name
- string
- Atlas Athletics — Series B Data Room
- portfolio_url
- string
- /dashboard/portfolio
- owner_name
- string
- Chris at Atlas
- shared_at
- string
- 2026-05-21T14:30:00Z
Where this is used
Engagement
Page views, screens, searches, content interactions.
badge_awarded
A user unlocked a new capability badge (e.g. connecting multiple integrations).
- badge_name*
- string
- Multi-Source
- category
- string
- observe
- impact_message
- string
- Cross-reference traffic, pipeline, and revenue.
- total_badges
- number
- 5
- next_badge
- string
- Full Spectrum
- growth_journey_url
- string
- /dashboard/engagement
Where this is used
user_level_up
User's engagement score crossed into a new level tier.
- name
- string
- Chris
- level*
- string
- Strategist
- previous_level
- string
- Analyst
- score
- number
- 42
- growth_journey_url
- string
- /dashboard/engagement
Where this is used
nudge_scheduled
Engagement engine scheduled a contextual nudge for the user.
- name
- string
- Chris
- nudge_body*
- string
- You haven't run an experiment in two weeks — your last winner is starting to drift.
- nudge_url
- string
- /dashboard/experiments
Where this is used
drip_step_scheduled
Engagement engine scheduled the next step of a drip sequence.
- step_label*
- string
- Day 3 — add a second data source
- step_body
- string
- Most teams see attribution clarity jump when they connect a CRM in addition to ads.
- step_url
- string
- /dashboard/integrations
Where this is used
Billing
Subscription upgrades, downgrades, and tier-limit nudges.
subscription_upgraded
A workspace upgraded to a higher plan.
- name
- string
- Chris
- from_plan*
- string
- Starter
- to_plan*
- string
- Pro
- dashboard_url
- string
- /dashboard
Where this is used
subscription_downgraded
A workspace moved to a lower plan tier.
- name
- string
- Chris
- from_plan*
- string
- Pro
- to_plan*
- string
- Starter
- dashboard_url
- string
- /dashboard
Where this is used
tier_limit_approaching
Workspace is nearing a plan limit; eligible for an upgrade nudge.
- name
- string
- Chris
- current_tier*
- string
- Starter
- next_tier
- string
- Pro
- feature_count
- number
- 8
- top_feature
- string
- CPWU Attribution
- upgrade_url
- string
- /dashboard/billing/upgrade
Where this is used
Operations
Anomaly alerts, weekly digests, Cognito auth hooks.
anomaly_detected
Apex detected a statistically anomalous shift in a tracked metric.
- metric_name*
- string
- Google Ads CPC
- scope
- string
- Atlas Athletics — Production
- delta
- string
- +340% vs. 30-day average
- investigate_url*
- string
- /dashboard/intelligence/anomalies/anom_2026_05_21
- anomaly_url
- string
- /dashboard/intelligence/anomalies
Where this is used
weekly_digest_scheduled
Weekly summary digest was scheduled for delivery.
- name
- string
- Chris
- period*
- string
- May 14–20, 2026
- digest_url
- string
- /dashboard/digest/2026-05-20
- total_imports
- string
- 4,832
- active_integrations
- string
- 3
- experiments
- string
- 2
Where this is used
cognito_verification_code
AWS Cognito custom-message hook needs a verification-code email rendered.
- code*
- string
- 482915
- code_parameter
- string
- {####}
Where this is used
Lifecycle
Install, open, background, uninstall. Session foundation.
user_signup
Apex-internal signup completion event — fires when a new merchant finishes signup in the Apex dashboard. Distinct from the SDK-side `user_signed_up` event which customers fire from their own app.
- name
- string
- Chris
- onboarding_url
- string
- /onboarding
Where this is used