Connect Shopify to OneSignal through the Vendo integration for web push notifications, customer tags, commerce events, and behavioral targeting.
OneSignal has partnered with Vendo to create a seamless Shopify integration. Vendo deploys the OneSignal SDK on your Shopify storefront with one click — no manual theme code editing required. It syncs customer tags, client-side browsing events, and server-side commerce events to OneSignal so you can build segments and trigger push campaigns from real behavior and purchase history.For Vendo’s documentation, see Vendo OneSignal Destination.
Log in to onesignal.com and create or select an app. Choose Web as the platform and select Custom Code as the integration type.
You must select Custom Code. The Typical Site option does not expose the service worker path settings, so the SDK will try to load /OneSignalSDKWorker.js from your store root — Shopify blocks this and push subscriptions will silently fail. If you already created the app under Typical Site, switch to Custom Code in Settings > Platforms > Web, or delete and recreate the app.
2
Configure web push settings
In your OneSignal app, navigate to Settings > Push & In-App > Web Settings or follow the Web push setup guide.Site setup
Site Name: Your store name, used as the default notification title.
Site URL: Your Shopify store’s publicly accessible URL (e.g., https://yourstore.com).
Do not use https://your-site.myshopify.com/ if customers access your site through a custom domain like https://your-site.com/.
Default Icon URL: Upload a square 256×256 PNG, JPG, or non-animated GIF that appears in OneSignal soft prompts and in notifications on Chrome, Firefox, and Edge. If not set, a bell icon is used as the default. Safari and the browser’s native permission prompt do not show this icon. See Notification icons.
3
Configure the service worker path
Shopify does not allow serving files from the site root, so you must tell OneSignal where Vendo serves the service worker file.In OneSignal, go to Settings > Push & In-App > Web Settings, scroll to Advanced Push Settings, and toggle on Customize service worker paths and filenames, then configure:
Setting
Value
Path to service worker files
/apps/vendo/
Main service worker filename
OneSignalSDKWorker.js
Updater service worker filename
OneSignalSDKWorker.js
Service worker registration scope
/apps/vendo/
Service worker configuration for Shopify stores using Vendo.
Vendo automatically serves the required OneSignalSDKWorker.js file at https://yourstore.myshopify.com/apps/vendo/OneSignalSDKWorker.js — no manual file uploads needed.
The Vendo app’s OneSignal > Push Settings page displays these exact values with click-to-copy, so you don’t need to retype them.The Updater Filename and Main Service Worker Filename are the same file. OneSignal v16+ uses a single service worker for both purposes.
4
Copy your credentials
In OneSignal, go to Settings > Keys & IDs and copy your App ID and REST API Key. You will enter these in Vendo.
Enter your OneSignal App ID and REST API Key from the previous section, then click Save.
4
Enable the Vendo theme block
The Vendo theme block loads the OneSignal SDK on your storefront. Without it, the push prompt will not appear and client-side tracking will not work.
In your Shopify admin, go to Online Store > Themes > Customize.
Click App embeds (puzzle piece icon in the left sidebar).
Toggle Vendo on.
Click Save.
The theme block handles SDK initialization, service worker registration, push prompt display, user identification (push subscription, login, newsletter signup), and tag syncing for identified users.
5
Select events to sync
In the Vendo app under OneSignal > Events, enable the client-side and server-side events you want to send to OneSignal. See Tracking below for the full event list.
6
Configure push prompts
Whether each prompt appears on your storefront — and when — is controlled from the Vendo app, not the OneSignal dashboard. In the Vendo app, open OneSignal > Push Settings. You will see four sections, each with its own toggle:
Section
What it does
Subscription Bell
Floating bell icon visitors can click to subscribe at any time
Push Slide Prompt
Branded slide-in banner asking for push permission
Native Browser Prompt
Triggers the browser’s built-in permission dialog directly
Welcome Notification
Push notification sent automatically when a visitor subscribes
For Push Slide and Native prompts, you also set triggers — how many page views and how many seconds to wait before the prompt fires. Sensible defaults are pre-filled.All four prompts are off by default — enable only the ones you want. Save once at the bottom of the page; changes take effect on the next storefront load without a theme redeploy.
Prompt button copy, action message text, icons, and advanced options like A/B tests and localization are configured in the OneSignal dashboard. From Vendo’s Push Settings, click Open OneSignal Dashboard to jump directly to the Permission Prompt Setup page. If a prompt is configured in OneSignal’s dashboard but its Vendo toggle is off, it will not render — Vendo’s toggle is the source of truth for visibility.
7
Historical data sync (optional)
Vendo can backfill existing customers and recent order history to OneSignal. This happens automatically in the background after you save your credentials.
Vendo uses an identified-only approach — anonymous visitors are not tracked in OneSignal. Users must be identified through one of four methods before events are sent. This prevents duplicate users and ensures clean, actionable data.
Method
How it works
Identifier used
Web push subscription
Visitor clicks “Allow” on the push prompt. OneSignal creates a user automatically and Vendo captures the OneSignal ID.
OneSignal ID
Newsletter signup
Visitor submits a newsletter or email form. Vendo captures the email and calls OneSignal.login(email).
Email
Customer login
Customer logs into their Shopify account. Vendo detects this and calls OneSignal.login() with the configured identifier.
Shopify Customer ID or Email
Checkout completed
Customer completes a purchase. Vendo stores the identifier and calls OneSignal.login().
Shopify Customer ID or Email
If you have a mobile app or third-party connections, select the identifier (Shopify Customer ID vs. Email) that matches your other tools so user profiles stay consistent across platforms. Configure this in the Vendo app under Settings > Customer Identifier.
If a push subscriber (identified by OneSignal ID) later logs in or completes a purchase, Vendo calls OneSignal.login() with their Shopify Customer ID or email. OneSignal links the push subscription to the identified user — no duplicate users are created. All past push subscriptions are preserved, and server-side events (orders, fulfillments) reach the correct user profile.
Vendo captures UTM parameters and click IDs at checkout and syncs them as tags. Last-touch values are overwritten on each checkout; first-touch values (initial_utm_*) are written only once.
Vendo can sync Shopify segment membership as tags in the format shopify_segment_{segment_id} with a value of "true". See Vendo’s Events & Properties reference for details on running the sync.
Vendo tracks client-side custom events on your storefront via the Shopify Web Pixel and sends them to OneSignal. These events are only sent after a user is identified.
Event
Description
page_viewed
Customer visits a page (storefront, checkout, or order status)
Shopify commerce events are exported and forwarded to OneSignal through the Vendo pipeline. These always use the Shopify Customer ID as the external_id.
Create a Journey triggered by the cart_abandoned event. Wait 1 hour after abandonment, then send a push notification with the recovery link using the checkout_url property.
Visit https://yourstore.myshopify.com/apps/vendo/OneSignalSDKWorker.js in your browser. You should see JavaScript code. If you get a 404, verify the Vendo app is installed and the theme block is enabled.You can also open browser DevTools (F12), go to Application > Service Workers, and confirm OneSignalSDKWorker.js is registered with a scope of /apps/vendo/.
2
Test the push prompt
Open your storefront in an incognito/private window. You should see the OneSignal notification permission prompt. Click Allow to subscribe.
3
Send a test notification
In the OneSignal dashboard, go to Messages > New Push. Send a test notification to your subscriber and verify it appears.
4
Verify user data in OneSignal
Go to Audience > Users & subscriptions and confirm your test user appears. Check that user tags (email, name, etc.) are syncing for identified users.
5
Trigger a test event
Browse a product or complete a test checkout on your store. Confirm the event appears in the user’s activity in the OneSignal dashboard.
The service worker must be at /apps/vendo/OneSignalSDKWorker.js. If you see a 404 error at the root path (/OneSignalSDKWorker.js), the service worker path is not configured in OneSignal — follow the service worker configuration step. If the 404 is at the /apps/vendo/ path, verify the Vendo app is installed and the theme block is enabled.
”Typical Site” was selected during OneSignal setup
Vendo requires the Custom Code integration type. Typical Site does not expose the service worker path settings, so the SDK will try to load /OneSignalSDKWorker.js from your store root — Shopify blocks that and push subscriptions will silently fail.Fix: in the OneSignal dashboard, either switch the app’s integration type to Custom Code under Settings > Platforms > Web, or delete the app and recreate it using Custom Code from the start.
Check that the Vendo theme block is enabled in App embeds.
In the Vendo app under OneSignal > Push Settings, confirm at least one prompt toggle (Subscription Bell, Push Slide Prompt, or Native Browser Prompt) is turned on — all four are off by default.
Check the trigger delay — a Push Slide set to multiple page views won’t fire on the first page load.
Verify your browser allows notifications (click the lock icon in the address bar).
Try an incognito/private window in case the prompt was previously dismissed.
Tags only sync for identified users — anonymous visitors are not tracked. Ensure the user has been identified via push subscription, login, newsletter signup, or checkout. Initial tag syncs can take several hours.
Verify events are enabled in the Vendo app under OneSignal > Events. Client-side events require the Shopify Web Pixel to be active and the user to be identified. Server-side events require the REST API Key to be configured.
The integration is working — the issue is with your browser or OS notification settings. Check your OS notification settings for your browser, ensure Do Not Disturb / Focus mode is off, and verify browser-level notification permissions.
Yes. Update the setting in the Vendo app under Settings > Customer Identifier. Changing the identifier may create separate user profiles if existing users were already identified with the previous method.
The Vendo integration focuses on Shopify storefronts and web push. If you also have a mobile app, ensure the identifier you select in Vendo matches the one you use in your mobile app so user profiles stay consistent.
Events from unidentified visitors are not sent to OneSignal. Once the visitor identifies themselves (by subscribing to push, logging in, signing up for a newsletter, or completing checkout), Vendo begins sending events. This identified-only approach prevents duplicate users and ensures clean data.
Tracking anonymous visitors creates duplicate OneSignal users that can never be properly merged, leading to inflated user counts and fragmented data. The identified-only approach ensures every OneSignal user is real and actionable.
Track user behavior and trigger automations based on Shopify events.
Web push setup
Set up web push notifications for your Shopify store.
Web permission prompts
Configure how and when to prompt visitors for web push permission.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"OneSignal","description":"OneSignal is a platform for sending push notifications, emails, in-app messages, and SMS campaigns via a single API, Journey Builder, and a dashboard.","colors":{"primary":"#3A3DB3","light":"#E54B4D","dark":"#3A3DB3"},"logo":{"light":"https://mintcdn.com/onesignal/yJcueeDCO7UpHnnY/logo/OneSignal-Logo.svg?fit=max\u0026auto=format\u0026n=yJcueeDCO7UpHnnY\u0026q=85\u0026s=1fcfb6fef6d820fd9d99c74850711107","dark":"https://mintcdn.com/onesignal/s4WC_KzLxf8ornqq/logo/OneSignal-Logo-White.svg?fit=max\u0026auto=format\u0026n=s4WC_KzLxf8ornqq\u0026q=85\u0026s=2573a53b5aea961e18c82b3af8f31925"},"favicon":"https://mintcdn.com/onesignal/SGduBFHpiRdg5l6h/favicon.ico?fit=max\u0026auto=format\u0026n=SGduBFHpiRdg5l6h\u0026q=85\u0026s=c0a99fadc0553c658a83741c5611cef4","api":{"examples":{"languages":["curl","typescript","python","php","go","ruby","java","csharp","rust"],"autogenerate":true}},"navbar":{"links":[{"href":"mailto:support@onesignal.com","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://dashboard.onesignal.com"}},"footer":{"socials":{"github":"https://github.com/OneSignal","linkedin":"https://linkedin.com/company/onesignal","youtube":"https://www.youtube.com/@onesignalofficial/playlists"}},"seo":{"metatags":{"apple-mobile-web-app-title":"OneSignal Docs"}},"fonts":{"family":"Nunito Sans"},"styling":{"eyebrows":"breadcrumbs","latex":true},"integrations":{"ga4":{"measurementId":"G-2DGWL0VYP5"},"posthog":{"apiKey":"phc_vZpvE0f5eyzcOt30FHer34yddVmNdo9kmlMVRBzLMtn","apiHost":"https://eu.i.posthog.com","sessionRecording":true}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"navigation":{"languages":[{"language":"en","href":"docs/en/home"},{"language":"cn","href":"docs/cn/home"},{"language":"ko","href":"docs/ko/home"},{"language":"ja","href":"docs/ja/home"},{"language":"tr","href":"docs/tr/home"},{"language":"pt-BR","href":"docs/pt-BR/home"},{"language":"es","href":"docs/es/home"},{"language":"fr","href":"docs/fr/home"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"onesignal","hasAudioNarration":false,"actualSubdomain":"onesignal","customDomains":["documentation.onesignal.com"],"gitSource":{"type":"github","owner":"onesignal","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aeb720656d3256e25f7f5e8","collectionId":"771b8338-c78a-4909-ac00-b1b5dd3eb9cf","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeb720656d3256e25f7f5e8"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aebb1cc40574e0e146e06f5","clientVersion":"0.0.4067","searchFilterCounts":[{"language":"en","tag":"User Guides","count":202},{"language":"es","tag":"Guías del Usuario","count":178},{"language":"fr","tag":"Guides utilisateur","count":178},{"language":"ja","tag":"ユーザーガイド","count":178},{"language":"ko","tag":"사용자 가이드","count":178},{"language":"pt-BR","tag":"Guia do Usuário","count":178},{"language":"tr","tag":"Kullanıcı Kılavuzları","count":178},{"language":"cn","tag":"用户指南","count":176},{"language":"en","tag":"Message channels","count":90},{"language":"es","tag":"Canales de mensajería","count":84},{"language":"fr","tag":"Canaux de messagerie","count":84},{"language":"ja","tag":"メッセージングチャネル","count":84},{"language":"ko","tag":"메시지 채널","count":84},{"language":"pt-BR","tag":"Canais de mensagem","count":84},{"language":"tr","tag":"Mesaj kanalları","count":84},{"language":"cn","tag":"消息渠道","count":83},{"language":"default","tag":"API Reference","count":68},{"language":"default","tag":"API reference","count":64},{"language":"en","tag":"Analytics \u0026 Integrations","count":53},{"language":"es","tag":"Analítica \u0026 Integraciones","count":52},{"language":"fr","tag":"Analyses et intégrations","count":52},{"language":"ja","tag":"分析 \u0026 統合","count":52},{"language":"ko","tag":"분석 \u0026 통합","count":52},{"language":"pt-BR","tag":"Análises \u0026 Integrações","count":52},{"language":"tr","tag":"Analitik ve Entegrasyonlar","count":52},{"language":"cn","tag":"分析和集成","count":51},{"language":"cn","tag":"开发者指南","count":48},{"language":"es","tag":"Guías del desarrollador","count":48},{"language":"fr","tag":"Guides développeur","count":48},{"language":"ja","tag":"開発者ガイド","count":48},{"language":"ko","tag":"개발자 가이드","count":48},{"language":"tr","tag":"Geliştirici Kılavuzları","count":48},{"language":"en","tag":"Developer Guides","count":47},{"language":"pt-BR","tag":"Guia de desenvolvedor","count":47},{"language":"en","tag":"Integrations","count":37},{"language":"es","tag":"Integraciones","count":37},{"language":"fr","tag":"Intégrations","count":37},{"language":"ja","tag":"統合","count":37},{"language":"ko","tag":"통합","count":37},{"language":"pt-BR","tag":"Integrações","count":37},{"language":"tr","tag":"Entegrasyonlar","count":37},{"language":"cn","tag":"集成","count":36},{"language":"en","tag":"Tutorials","count":35},{"language":"cn","tag":"推送通知","count":31},{"language":"cn","tag":"OneSignal 作为目的地","count":31},{"language":"en","tag":"Push","count":31},{"language":"en","tag":"OneSignal as destination","count":31},{"language":"es","tag":"Push notificaciones","count":31},{"language":"es","tag":"OneSignal como destino","count":31},{"language":"fr","tag":"Push","count":31},{"language":"fr","tag":"OneSignal comme destination","count":31},{"language":"ja","tag":"プッシュ通知","count":31},{"language":"ja","tag":"OneSignal as 宛先","count":31},{"language":"ko","tag":"푸시","count":31},{"language":"ko","tag":"OneSignal을 데이터 목적지로 사용","count":31},{"language":"pt-BR","tag":"Push notificações","count":31},{"language":"pt-BR","tag":"OneSignal como destino","count":31},{"language":"tr","tag":"Anlık bildirimler","count":31},{"language":"tr","tag":"OneSignal hedef","count":31},{"language":"en","tag":"Mobile SDKs","count":26},{"language":"cn","tag":"移动SDK","count":25},{"language":"es","tag":"SDKs móviles","count":25},{"language":"fr","tag":"SDK mobiles","count":25},{"language":"ja","tag":"モバイルSDK","count":25},{"language":"ko","tag":"모바일 SDKs","count":25},{"language":"pt-BR","tag":"SDKs móveis","count":25},{"language":"tr","tag":"Mobil SDK'lar","count":25},{"language":"cn","tag":"教程","count":24},{"language":"es","tag":"Tutoriales","count":24},{"language":"fr","tag":"Tutoriels","count":24},{"language":"ja","tag":"チュートリアル","count":24},{"language":"ko","tag":"튜토리얼","count":24},{"language":"pt-BR","tag":"Tutoriais","count":24},{"language":"tr","tag":"Eğitimler","count":24},{"language":"en","tag":"Mobile SDK setup","count":19},{"language":"cn","tag":"移动SDK设置","count":18},{"language":"es","tag":"Configuración del SDK móvil","count":18},{"language":"fr","tag":"Configuration SDK mobile","count":18},{"language":"ja","tag":"モバイルSDKセットアップ","count":18},{"language":"ko","tag":"모바일 SDK 설정","count":18},{"language":"pt-BR","tag":"Configuração do SDK móvel","count":18},{"language":"tr","tag":"Mobil SDK kurulumu","count":18},{"language":"default","tag":"Messages","count":9},{"language":"default","tag":"Users","count":9},{"language":"default","tag":"Organization","count":9},{"language":"default","tag":"Journeys","count":8},{"language":"default","tag":"Deprecated","count":6},{"language":"default","tag":"Templates","count":6},{"language":"default","tag":"Subscriptions","count":6},{"language":"default","tag":"Segments","count":5}]},"assistantConfig":{"enableStarterQuestions":false,"deflection":{"enabled":true,"email":"support@onesignal.com","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[],"page":{"pagePath":"docs/en/shopify","slug":"/docs/en/shopify","pageMetadata":{"title":"Shopify web push integration","description":"Connect Shopify to OneSignal through the Vendo integration for web push notifications, customer tags, commerce events, and behavioral targeting.","keywords":["Shopify","Vendo","integration","web push","custom events","customer tags","e-commerce","abandoned cart"],"href":"/docs/en/shopify"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Connect Shopify to OneSignal through the Vendo integration for web push notifications, customer tags, commerce events, and behavioral targeting.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,hr:`hr`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Card,Columns,Frame,Heading,Note,OptimizedImage,Step,Steps,Table,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!Columns)_missingMdxReference(`Columns`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`OneSignal has partnered with Vendo to create a seamless Shopify integration. Vendo deploys the OneSignal SDK on your Shopify storefront with one click — no manual theme code editing required. It syncs customer tags, client-side browsing events, and server-side commerce events to OneSignal so you can build segments and trigger push campaigns from real behavior and purchase history.`}),`\n`,_jsxs(_components.p,{children:[`For Vendo’s documentation, see `,_jsx(_components.a,{href:`https://docs.vendodata.com/destinations/onesignal/overview`,children:`Vendo OneSignal Destination`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsx(_components.p,{children:`Before you begin, make sure you have:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A Shopify store with the `,_jsx(_components.a,{href:`https://apps.shopify.com/`,children:`Vendo app`}),` installed`]}),`\n`,_jsx(_components.li,{children:`A OneSignal account and app (Web platform)`}),`\n`,_jsxs(_components.li,{children:[`Your OneSignal `,_jsx(_components.strong,{children:`App ID`}),` (required)`]}),`\n`,_jsxs(_components.li,{children:[`Your OneSignal `,_jsx(_components.strong,{children:`REST API Key`}),` (required for server-side events like order syncing and user tagging)`]}),`\n`,_jsx(_components.li,{children:`Vendo app embed enabled in your Shopify theme settings`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`onesignal-setup`,children:`OneSignal setup`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Create a OneSignal app`,children:[_jsxs(_components.p,{children:[`Log in to `,_jsx(_components.a,{href:`https://onesignal.com`,children:`onesignal.com`}),` and create or select an app. Choose `,_jsx(_components.strong,{children:`Web`}),` as the platform and select `,_jsx(_components.strong,{children:`Custom Code`}),` as the integration type.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`You must select `,_jsx(_components.strong,{children:`Custom Code`}),`. The `,_jsx(_components.strong,{children:`Typical Site`}),` option does not expose the service worker path settings, so the SDK will try to load `,_jsx(_components.code,{children:`/OneSignalSDKWorker.js`}),` from your store root — Shopify blocks this and push subscriptions will silently fail. If you already created the app under Typical Site, switch to Custom Code in `,_jsx(_components.strong,{children:`Settings > Platforms > Web`}),`, or delete and recreate the app.`]})})]}),_jsxs(Step,{title:`Configure web push settings`,children:[_jsxs(_components.p,{children:[`In your OneSignal app, navigate to `,_jsx(_components.strong,{children:`Settings > Push \u0026 In-App > Web Settings`}),` or follow the `,_jsx(_components.a,{href:`/docs/en/web-push-setup`,children:`Web push setup`}),` guide.`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Site setup`})}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Site Name`}),`: Your store name, used as the default notification title.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Site URL`}),`: Your Shopify store’s publicly accessible URL (e.g., `,_jsx(_components.code,{children:`https://yourstore.com`}),`).`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Must be the exact `,_jsx(_components.a,{href:`https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy`,children:`origin`}),` of your site.`]}),`\n`,_jsxs(_components.li,{children:[`Do not use `,_jsx(_components.code,{children:`https://your-site.myshopify.com/`}),` if customers access your site through a custom domain like `,_jsx(_components.code,{children:`https://your-site.com/`}),`.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Default Icon URL`}),`: Upload a square `,_jsx(_components.code,{children:`256×256`}),` PNG, JPG, or non-animated GIF that appears in OneSignal soft prompts and in notifications on Chrome, Firefox, and Edge. If not set, a bell icon is used as the default. Safari and the browser’s native permission prompt do not show this icon. See `,_jsx(_components.a,{href:`/docs/en/notification-icons#web-notification-icons`,children:`Notification icons`}),`.`]}),`\n`]})]}),_jsxs(Step,{title:`Configure the service worker path`,children:[_jsx(_components.p,{children:`Shopify does not allow serving files from the site root, so you must tell OneSignal where Vendo serves the service worker file.`}),_jsxs(_components.p,{children:[`In OneSignal, go to `,_jsx(_components.strong,{children:`Settings > Push \u0026 In-App > Web Settings`}),`, scroll to `,_jsx(_components.strong,{children:`Advanced Push Settings`}),`, and toggle on `,_jsx(_components.strong,{children:`Customize service worker paths and filenames`}),`, then configure:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Setting`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Path to service worker files`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/apps/vendo/`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Main service worker filename`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`OneSignalSDKWorker.js`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Updater service worker filename`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`OneSignalSDKWorker.js`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Service worker registration scope`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/apps/vendo/`})})]})]})]}),_jsx(Frame,{caption:`Service worker configuration for Shopify stores using Vendo.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/N_-d1DtCTRgGPN4l/images/integrations/shopify/vendo-service-worker-configuration.png?fit=max\u0026auto=format\u0026n=N_-d1DtCTRgGPN4l\u0026q=85\u0026s=b7bc1794445e002bd3427c94a6ec6ccf`,alt:`OneSignal Advanced Push Settings showing service worker paths configured for Vendo`,\"data-og-width\":`3038`,width:`3038`,\"data-og-height\":`1108`,height:`1108`,\"data-path\":`images/integrations/shopify/vendo-service-worker-configuration.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/N_-d1DtCTRgGPN4l/images/integrations/shopify/vendo-service-worker-configuration.png?w=280\u0026fit=max\u0026auto=format\u0026n=N_-d1DtCTRgGPN4l\u0026q=85\u0026s=f9f035641926065e0143a813b32f97cd 280w, https://mintcdn.com/onesignal/N_-d1DtCTRgGPN4l/images/integrations/shopify/vendo-service-worker-configuration.png?w=560\u0026fit=max\u0026auto=format\u0026n=N_-d1DtCTRgGPN4l\u0026q=85\u0026s=1388d484dca925c629b100fb846276c8 560w, https://mintcdn.com/onesignal/N_-d1DtCTRgGPN4l/images/integrations/shopify/vendo-service-worker-configuration.png?w=840\u0026fit=max\u0026auto=format\u0026n=N_-d1DtCTRgGPN4l\u0026q=85\u0026s=77b96e7af65f0af82537ea1d5dfcbb6f 840w, https://mintcdn.com/onesignal/N_-d1DtCTRgGPN4l/images/integrations/shopify/vendo-service-worker-configuration.png?w=1100\u0026fit=max\u0026auto=format\u0026n=N_-d1DtCTRgGPN4l\u0026q=85\u0026s=1e3b388f7aed2ea888597d3ed2895bc7 1100w, https://mintcdn.com/onesignal/N_-d1DtCTRgGPN4l/images/integrations/shopify/vendo-service-worker-configuration.png?w=1650\u0026fit=max\u0026auto=format\u0026n=N_-d1DtCTRgGPN4l\u0026q=85\u0026s=77bd6af31b6109d131225c8fe852badd 1650w, https://mintcdn.com/onesignal/N_-d1DtCTRgGPN4l/images/integrations/shopify/vendo-service-worker-configuration.png?w=2500\u0026fit=max\u0026auto=format\u0026n=N_-d1DtCTRgGPN4l\u0026q=85\u0026s=4c669b0f4b6f23abd7666f2338ac07ce 2500w`})}),_jsxs(_components.p,{children:[`Vendo automatically serves the required `,_jsx(_components.code,{children:`OneSignalSDKWorker.js`}),` file at `,_jsx(_components.code,{children:`https://yourstore.myshopify.com/apps/vendo/OneSignalSDKWorker.js`}),` — no manual file uploads needed.`]}),_jsxs(Note,{children:[_jsxs(_components.p,{children:[`The Vendo app’s `,_jsx(_components.strong,{children:`OneSignal > Push Settings`}),` page displays these exact values with click-to-copy, so you don’t need to retype them.`]}),_jsx(_components.p,{children:`The Updater Filename and Main Service Worker Filename are the same file. OneSignal v16+ uses a single service worker for both purposes.`})]})]}),_jsx(Step,{title:`Copy your credentials`,children:_jsxs(_components.p,{children:[`In OneSignal, go to `,_jsx(_components.a,{href:`/docs/en/keys-and-ids`,children:_jsx(_components.strong,{children:`Settings > Keys \u0026 IDs`})}),` and copy your `,_jsx(_components.strong,{children:`App ID`}),` and `,_jsx(_components.strong,{children:`REST API Key`}),`. You will enter these in Vendo.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`vendo-setup`,children:`Vendo setup`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Install the Vendo app`,children:_jsx(_components.p,{children:`Install the Vendo app from the Shopify App Store.`})}),_jsxs(Step,{title:`Add the OneSignal integration`,children:[_jsxs(_components.p,{children:[`In Vendo, navigate to `,_jsx(_components.strong,{children:`Destinations > OneSignal`}),`.`]}),_jsx(Frame,{caption:`Add the OneSignal integration in Vendo.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/PoskQI_qr0DD8jDV/images/integrations/shopify/vendo-onesignal-integrations.png?fit=max\u0026auto=format\u0026n=PoskQI_qr0DD8jDV\u0026q=85\u0026s=13acfaf4e6b01f77535f1a1386c4212d`,alt:`Vendo Integrations page showing the OneSignal integration option`,\"data-og-width\":`2520`,width:`2520`,\"data-og-height\":`1756`,height:`1756`,\"data-path\":`images/integrations/shopify/vendo-onesignal-integrations.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/PoskQI_qr0DD8jDV/images/integrations/shopify/vendo-onesignal-integrations.png?w=280\u0026fit=max\u0026auto=format\u0026n=PoskQI_qr0DD8jDV\u0026q=85\u0026s=094d74aa6803a73332fece950acf2220 280w, https://mintcdn.com/onesignal/PoskQI_qr0DD8jDV/images/integrations/shopify/vendo-onesignal-integrations.png?w=560\u0026fit=max\u0026auto=format\u0026n=PoskQI_qr0DD8jDV\u0026q=85\u0026s=a0db5dcf258f52557d8081d4143790b0 560w, https://mintcdn.com/onesignal/PoskQI_qr0DD8jDV/images/integrations/shopify/vendo-onesignal-integrations.png?w=840\u0026fit=max\u0026auto=format\u0026n=PoskQI_qr0DD8jDV\u0026q=85\u0026s=a6bbbdfc27769e5d1d45711ac85ef16a 840w, https://mintcdn.com/onesignal/PoskQI_qr0DD8jDV/images/integrations/shopify/vendo-onesignal-integrations.png?w=1100\u0026fit=max\u0026auto=format\u0026n=PoskQI_qr0DD8jDV\u0026q=85\u0026s=bf548380a6bcbbb3c008a74ec1ab270d 1100w, https://mintcdn.com/onesignal/PoskQI_qr0DD8jDV/images/integrations/shopify/vendo-onesignal-integrations.png?w=1650\u0026fit=max\u0026auto=format\u0026n=PoskQI_qr0DD8jDV\u0026q=85\u0026s=4d1949cdcae2c3867ea83ce58cc112f9 1650w, https://mintcdn.com/onesignal/PoskQI_qr0DD8jDV/images/integrations/shopify/vendo-onesignal-integrations.png?w=2500\u0026fit=max\u0026auto=format\u0026n=PoskQI_qr0DD8jDV\u0026q=85\u0026s=641ebffe4be3aa129aaf4ce1cb50dd1b 2500w`})})]}),_jsx(Step,{title:`Enter your OneSignal credentials`,children:_jsxs(_components.p,{children:[`Enter your OneSignal `,_jsx(_components.strong,{children:`App ID`}),` and `,_jsx(_components.strong,{children:`REST API Key`}),` from the previous section, then click `,_jsx(_components.strong,{children:`Save`}),`.`]})}),_jsxs(Step,{title:`Enable the Vendo theme block`,children:[_jsx(_components.p,{children:`The Vendo theme block loads the OneSignal SDK on your storefront. Without it, the push prompt will not appear and client-side tracking will not work.`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`In your Shopify admin, go to `,_jsx(_components.strong,{children:`Online Store > Themes > Customize`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`App embeds`}),` (puzzle piece icon in the left sidebar).`]}),`\n`,_jsxs(_components.li,{children:[`Toggle `,_jsx(_components.strong,{children:`Vendo`}),` on.`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Save`}),`.`]}),`\n`]}),_jsx(_components.p,{children:`The theme block handles SDK initialization, service worker registration, push prompt display, user identification (push subscription, login, newsletter signup), and tag syncing for identified users.`})]}),_jsx(Step,{title:`Select events to sync`,children:_jsxs(_components.p,{children:[`In the Vendo app under `,_jsx(_components.strong,{children:`OneSignal > Events`}),`, enable the client-side and server-side events you want to send to OneSignal. See `,_jsx(_components.a,{href:`#tracking`,children:`Tracking`}),` below for the full event list.`]})}),_jsxs(Step,{title:`Configure push prompts`,children:[_jsxs(_components.p,{children:[`Whether each prompt appears on your storefront — and when — is controlled from the Vendo app, not the OneSignal dashboard. In the Vendo app, open `,_jsx(_components.strong,{children:`OneSignal > Push Settings`}),`. You will see four sections, each with its own toggle:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Section`}),_jsx(_components.th,{children:`What it does`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Subscription Bell`})}),_jsx(_components.td,{children:`Floating bell icon visitors can click to subscribe at any time`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Push Slide Prompt`})}),_jsx(_components.td,{children:`Branded slide-in banner asking for push permission`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Native Browser Prompt`})}),_jsx(_components.td,{children:`Triggers the browser’s built-in permission dialog directly`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Welcome Notification`})}),_jsx(_components.td,{children:`Push notification sent automatically when a visitor subscribes`})]})]})]}),_jsxs(_components.p,{children:[`For Push Slide and Native prompts, you also set `,_jsx(_components.strong,{children:`triggers`}),` — how many page views and how many seconds to wait before the prompt fires. Sensible defaults are pre-filled.`]}),_jsxs(_components.p,{children:[`All four prompts are `,_jsx(_components.strong,{children:`off by default`}),` — enable only the ones you want. Save once at the bottom of the page; changes take effect on the next storefront load without a theme redeploy.`]}),_jsx(Note,{children:_jsxs(_components.p,{children:[`Prompt button copy, action message text, icons, and advanced options like A/B tests and localization are configured in the OneSignal dashboard. From Vendo’s Push Settings, click `,_jsx(_components.strong,{children:`Open OneSignal Dashboard`}),` to jump directly to the Permission Prompt Setup page. If a prompt is configured in OneSignal’s dashboard but its Vendo toggle is off, it will not render — Vendo’s toggle is the source of truth for visibility.`]})})]}),_jsxs(Step,{title:`Historical data sync (optional)`,children:[_jsx(_components.p,{children:`Vendo can backfill existing customers and recent order history to OneSignal. This happens automatically in the background after you save your credentials.`}),_jsx(Frame,{caption:`Historical data sync options in Vendo.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-historical-data.png?fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=4eb61a384a7ac3f4596661348f98ac48`,alt:`Vendo historical data settings showing sync options for Shopify data`,\"data-og-width\":`1724`,width:`1724`,\"data-og-height\":`762`,height:`762`,\"data-path\":`images/integrations/shopify/vendo-historical-data.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-historical-data.png?w=280\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=033f4c21ac8b9d1095228df3f4002766 280w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-historical-data.png?w=560\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=b2c532afd8ae302675689113f55dd756 560w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-historical-data.png?w=840\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=458b756d712d8606a6d2929bfe8f3671 840w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-historical-data.png?w=1100\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=1835889af2b5075bd9662932d19e6bf6 1100w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-historical-data.png?w=1650\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=7c5a11069ffbf3ac0af33a530f4f6ef2 1650w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-historical-data.png?w=2500\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=5d81cb48d8760e6c334c51857eee2e83 2500w`})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`tracking`,children:`Tracking`}),`\n`,_jsx(Heading,{level:`3`,id:`user-identification`,children:`User identification`}),`\n`,_jsxs(_components.p,{children:[`Vendo uses an `,_jsx(_components.strong,{children:`identified-only`}),` approach — anonymous visitors are not tracked in OneSignal. Users must be identified through one of four methods before events are sent. This prevents duplicate users and ensures clean, actionable data.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Method`}),_jsx(_components.th,{children:`How it works`}),_jsx(_components.th,{children:`Identifier used`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Web push subscription`})}),_jsx(_components.td,{children:`Visitor clicks “Allow” on the push prompt. OneSignal creates a user automatically and Vendo captures the OneSignal ID.`}),_jsx(_components.td,{children:`OneSignal ID`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Newsletter signup`})}),_jsxs(_components.td,{children:[`Visitor submits a newsletter or email form. Vendo captures the email and calls `,_jsx(_components.code,{children:`OneSignal.login(email)`}),`.`]}),_jsx(_components.td,{children:`Email`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Customer login`})}),_jsxs(_components.td,{children:[`Customer logs into their Shopify account. Vendo detects this and calls `,_jsx(_components.code,{children:`OneSignal.login()`}),` with the configured identifier.`]}),_jsx(_components.td,{children:`Shopify Customer ID or Email`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Checkout completed`})}),_jsxs(_components.td,{children:[`Customer completes a purchase. Vendo stores the identifier and calls `,_jsx(_components.code,{children:`OneSignal.login()`}),`.`]}),_jsx(_components.td,{children:`Shopify Customer ID or Email`})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`If you have a mobile app or third-party connections, select the identifier (Shopify Customer ID vs. Email) that matches your other tools so user profiles stay consistent across platforms. Configure this in the Vendo app under `,_jsx(_components.strong,{children:`Settings > Customer Identifier`}),`.`]})}),`\n`,_jsx(Heading,{level:`4`,id:`identity-merging`,children:`Identity merging`}),`\n`,_jsxs(_components.p,{children:[`If a push subscriber (identified by OneSignal ID) later logs in or completes a purchase, Vendo calls `,_jsx(_components.code,{children:`OneSignal.login()`}),` with their Shopify Customer ID or email. OneSignal links the push subscription to the identified user — no duplicate users are created. All past push subscriptions are preserved, and server-side events (orders, fulfillments) reach the correct user profile.`]}),`\n`,_jsx(Heading,{level:`3`,id:`customer-tags`,children:`Customer tags`}),`\n`,_jsxs(_components.p,{children:[`Vendo syncs customer properties as `,_jsx(_components.a,{href:`/docs/en/add-user-data-tags`,children:`tags`}),` in OneSignal for segmentation. All values are stored as strings (OneSignal’s native format).`]}),`\n`,_jsx(Heading,{level:`4`,id:`identity-\u0026-profile`,children:`Identity \u0026 profile`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tag`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`email`})}),_jsx(_components.td,{children:`Customer email`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`first_name`})}),_jsx(_components.td,{children:`First name`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`last_name`})}),_jsx(_components.td,{children:`Last name`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`phone`})}),_jsx(_components.td,{children:`Customer phone number`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`shopify_customer_id`})}),_jsx(_components.td,{children:`Shopify customer ID`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`verified_email`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`\"true\"`}),` or `,_jsx(_components.code,{children:`\"false\"`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`tax_exempt`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`\"true\"`}),` or `,_jsx(_components.code,{children:`\"false\"`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`customer_tags`})}),_jsx(_components.td,{children:`Comma-separated Shopify tags`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`customer_created_at`})}),_jsx(_components.td,{children:`Customer creation date (ISO 8601)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`first_seen`})}),_jsx(_components.td,{children:`ISO timestamp of the first identification event`})]})]})]}),`\n`,_jsx(Heading,{level:`4`,id:`marketing-consent`,children:`Marketing consent`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tag`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`marketing_state`})}),_jsx(_components.td,{children:`Overall marketing consent state`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`email_marketing_consent`})}),_jsx(_components.td,{children:`Email marketing consent state`})]})]})]}),`\n`,_jsx(Heading,{level:`4`,id:`commerce-stats`,children:`Commerce stats`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tag`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`total_spent`})}),_jsx(_components.td,{children:`Lifetime spend`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`order_count`})}),_jsx(_components.td,{children:`Total orders`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`first_order_date`})}),_jsx(_components.td,{children:`First order date (ISO 8601)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`last_order_date`})}),_jsx(_components.td,{children:`Most recent order date (ISO 8601)`})]})]})]}),`\n`,_jsx(Heading,{level:`4`,id:`attribution-tags`,children:`Attribution tags`}),`\n`,_jsxs(_components.p,{children:[`Vendo captures UTM parameters and click IDs at checkout and syncs them as tags. Last-touch values are overwritten on each checkout; first-touch values (`,_jsx(_components.code,{children:`initial_utm_*`}),`) are written only once.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tag`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`utm_source`})}),_jsx(_components.td,{children:`Last-touch UTM source`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`utm_medium`})}),_jsx(_components.td,{children:`Last-touch UTM medium`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`utm_campaign`})}),_jsx(_components.td,{children:`Last-touch UTM campaign`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`utm_content`})}),_jsx(_components.td,{children:`Last-touch UTM content`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`utm_term`})}),_jsx(_components.td,{children:`Last-touch UTM term`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`initial_utm_source`})}),_jsx(_components.td,{children:`First-touch UTM source (set once)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`initial_utm_medium`})}),_jsx(_components.td,{children:`First-touch UTM medium (set once)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`initial_utm_campaign`})}),_jsx(_components.td,{children:`First-touch UTM campaign (set once)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`gclid`})}),_jsx(_components.td,{children:`Google Ads click ID`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`fbclid`})}),_jsx(_components.td,{children:`Meta (Facebook/Instagram) click ID`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ttclid`})}),_jsx(_components.td,{children:`TikTok click ID`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`msclkid`})}),_jsx(_components.td,{children:`Microsoft Ads click ID`})]})]})]}),`\n`,_jsx(Heading,{level:`4`,id:`segment-membership`,children:`Segment membership`}),`\n`,_jsxs(_components.p,{children:[`Vendo can sync Shopify segment membership as tags in the format `,_jsx(_components.code,{children:`shopify_segment_{segment_id}`}),` with a value of `,_jsx(_components.code,{children:`\"true\"`}),`. See `,_jsx(_components.a,{href:`https://docs.vendodata.com/destinations/onesignal/events-and-properties`,children:`Vendo’s Events \u0026 Properties reference`}),` for details on running the sync.`]}),`\n`,_jsx(Heading,{level:`3`,id:`client-side-events`,children:`Client-side events`}),`\n`,_jsxs(_components.p,{children:[`Vendo tracks client-side `,_jsx(_components.a,{href:`/docs/en/custom-events`,children:`custom events`}),` on your storefront via the Shopify Web Pixel and sends them to OneSignal. These events are only sent after a user is identified.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Event`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`page_viewed`})}),_jsx(_components.td,{children:`Customer visits a page (storefront, checkout, or order status)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`product_viewed`})}),_jsx(_components.td,{children:`Customer views a product details page`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`collection_viewed`})}),_jsx(_components.td,{children:`Customer views a product collection page`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`search_submitted`})}),_jsx(_components.td,{children:`Customer performs a storefront search`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`product_added_to_cart`})}),_jsx(_components.td,{children:`Product is added to cart`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`product_removed_from_cart`})}),_jsx(_components.td,{children:`Product is removed from cart`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`cart_viewed`})}),_jsx(_components.td,{children:`Customer views the cart page`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`checkout_started`})}),_jsx(_components.td,{children:`Customer starts checkout`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`checkout_contact_info_submitted`})}),_jsx(_components.td,{children:`Contact info step submitted`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`checkout_address_info_submitted`})}),_jsx(_components.td,{children:`Address info step submitted`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`checkout_shipping_info_submitted`})}),_jsx(_components.td,{children:`Shipping method selected`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`payment_info_submitted`})}),_jsx(_components.td,{children:`Payment details submitted`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`checkout_completed`})}),_jsx(_components.td,{children:`Checkout completed successfully`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`alert_displayed`})}),_jsx(_components.td,{children:`Checkout alert or warning displayed`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ui_extension_errored`})}),_jsx(_components.td,{children:`Checkout UI extension runtime error`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`all_custom_events`})}),_jsx(_components.td,{children:`Custom Shopify customer events`})]})]})]}),`\n`,_jsx(Frame,{caption:`Client-side event configuration in Vendo.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-client-side-events.png?fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=c94b99465b8c200ebb1bb475e492f8a1`,alt:`Vendo client-side events settings showing available custom events`,\"data-og-width\":`865`,width:`865`,\"data-og-height\":`726`,height:`726`,\"data-path\":`images/integrations/shopify/vendo-client-side-events.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-client-side-events.png?w=280\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=d1e41237a617cf28a37896112a3eaf2c 280w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-client-side-events.png?w=560\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=8b40389eb561959186fd8e0d6cabd121 560w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-client-side-events.png?w=840\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=99ccb2f69828386a1e094e78b9901911 840w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-client-side-events.png?w=1100\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=ef9ed5e02a0c42aeff7af27634a6e0e5 1100w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-client-side-events.png?w=1650\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=ae5621c278b99321f00fe51d794e56db 1650w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-client-side-events.png?w=2500\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=0b6f72a0bbbc2a21f1e0048cad374389 2500w`})}),`\n`,_jsx(Heading,{level:`3`,id:`server-side-events`,children:`Server-side events`}),`\n`,_jsxs(_components.p,{children:[`Shopify commerce events are exported and forwarded to OneSignal through the Vendo pipeline. These always use the Shopify Customer ID as the `,_jsx(_components.code,{children:`external_id`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Event`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`order_received`})}),_jsx(_components.td,{children:`New order is created`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`order_fulfilled`})}),_jsx(_components.td,{children:`Order is fulfilled/shipped`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`order_delivered`})}),_jsx(_components.td,{children:`Order is delivered`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`order_refunded`})}),_jsx(_components.td,{children:`Order is fully refunded`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`order_partially_refunded`})}),_jsx(_components.td,{children:`Order is partially refunded`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`cart_abandoned`})}),_jsx(_components.td,{children:`Checkout is abandoned`})]})]})]}),`\n`,_jsx(Frame,{caption:`Server-side event configuration in Vendo.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-server-side-events.png?fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=c9bed30c26b0bec3b8a53eb8cde8098d`,alt:`Vendo server-side events settings showing available Shopify webhook events`,\"data-og-width\":`865`,width:`865`,\"data-og-height\":`394`,height:`394`,\"data-path\":`images/integrations/shopify/vendo-server-side-events.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-server-side-events.png?w=280\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=690636fef91b80a933c4eead29bd4ae1 280w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-server-side-events.png?w=560\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=a3a6abf2812eed57c9ef6679210bc3aa 560w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-server-side-events.png?w=840\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=54af0946d01f41d8019a0b0f7a50070c 840w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-server-side-events.png?w=1100\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=e86d2c7e36e1bd0ec147df3a8a40aada 1100w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-server-side-events.png?w=1650\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=91583da7d36d3afa45c01bb092e31709 1650w, https://mintcdn.com/onesignal/dknFSNQuQfw5IM0j/images/integrations/shopify/vendo-server-side-events.png?w=2500\u0026fit=max\u0026auto=format\u0026n=dknFSNQuQfw5IM0j\u0026q=85\u0026s=46ebfe07dbe982664ad947a97a2c2384 2500w`})}),`\n`,_jsx(Heading,{level:`2`,id:`platform-details`,children:`Platform details`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Setting`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Sync method`}),_jsx(_components.td,{children:`Client + server-side via Vendo`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Identity`}),_jsx(_components.td,{children:`Shopify Customer ID, Email, or OneSignal ID`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Deduplication`}),_jsx(_components.td,{children:`UUID v5 hashing per event`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Batch size`}),_jsx(_components.td,{children:`1,000 events per request`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Data format`}),_jsx(_components.td,{children:`All values stored as strings`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`use-cases`,children:`Use cases`}),`\n`,_jsx(Heading,{level:`3`,id:`abandoned-cart-recovery`,children:`Abandoned cart recovery`}),`\n`,_jsxs(_components.p,{children:[`Create a `,_jsx(_components.a,{href:`/docs/en/journeys-overview`,children:`Journey`}),` triggered by the `,_jsx(_components.code,{children:`cart_abandoned`}),` event. Wait 1 hour after abandonment, then send a push notification with the recovery link using the `,_jsx(_components.code,{children:`checkout_url`}),` property.`]}),`\n`,_jsx(Heading,{level:`3`,id:`order-status-updates`,children:`Order status updates`}),`\n`,_jsxs(_components.p,{children:[`Create Journeys for `,_jsx(_components.code,{children:`order_fulfilled`}),` and `,_jsx(_components.code,{children:`order_delivered`}),` to send immediate push notifications with tracking information when orders ship and arrive.`]}),`\n`,_jsx(Heading,{level:`3`,id:`vip-customer-engagement`,children:`VIP customer engagement`}),`\n`,_jsxs(_components.p,{children:[`Create a `,_jsx(_components.a,{href:`/docs/en/segmentation`,children:`segment`}),` where `,_jsx(_components.code,{children:`total_spent`}),` is greater than a threshold, then send exclusive offers personalized with the `,_jsx(_components.code,{children:`first_name`}),` tag.`]}),`\n`,_jsx(Heading,{level:`3`,id:`re-engagement-campaigns`,children:`Re-engagement campaigns`}),`\n`,_jsxs(_components.p,{children:[`Target inactive customers by creating a segment where `,_jsx(_components.code,{children:`last_order_date`}),` is more than 90 days ago and send win-back campaigns.`]}),`\n`,_jsx(Heading,{level:`2`,id:`compatible-sources`,children:`Compatible sources`}),`\n`,_jsx(_components.p,{children:`OneSignal works with the following Vendo data sources:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Source`}),_jsx(_components.th,{children:`Events`}),_jsx(_components.th,{children:`User tags`}),_jsx(_components.th,{children:`Audiences`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Shopify`}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`Yes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Stripe`}),_jsx(_components.td,{children:`Coming Soon`}),_jsx(_components.td,{children:`Coming Soon`}),_jsx(_components.td,{children:`Coming Soon`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Mixpanel`}),_jsx(_components.td,{children:`Coming Soon`}),_jsx(_components.td,{children:`Coming Soon`}),_jsx(_components.td,{children:`Coming Soon`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Amplitude`}),_jsx(_components.td,{children:`Coming Soon`}),_jsx(_components.td,{children:`Coming Soon`}),_jsx(_components.td,{children:`Coming Soon`})]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`testing`,children:`Testing`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Verify the service worker`,children:[_jsxs(_components.p,{children:[`Visit `,_jsx(_components.code,{children:`https://yourstore.myshopify.com/apps/vendo/OneSignalSDKWorker.js`}),` in your browser. You should see JavaScript code. If you get a 404, verify the Vendo app is installed and the theme block is enabled.`]}),_jsxs(_components.p,{children:[`You can also open browser DevTools (`,_jsx(_components.strong,{children:`F12`}),`), go to `,_jsx(_components.strong,{children:`Application > Service Workers`}),`, and confirm `,_jsx(_components.code,{children:`OneSignalSDKWorker.js`}),` is registered with a scope of `,_jsx(_components.code,{children:`/apps/vendo/`}),`.`]})]}),_jsx(Step,{title:`Test the push prompt`,children:_jsxs(_components.p,{children:[`Open your storefront in an incognito/private window. You should see the OneSignal notification permission prompt. Click `,_jsx(_components.strong,{children:`Allow`}),` to subscribe.`]})}),_jsx(Step,{title:`Send a test notification`,children:_jsxs(_components.p,{children:[`In the OneSignal dashboard, go to `,_jsx(_components.strong,{children:`Messages > New Push`}),`. Send a test notification to your subscriber and verify it appears.`]})}),_jsx(Step,{title:`Verify user data in OneSignal`,children:_jsxs(_components.p,{children:[`Go to `,_jsx(_components.strong,{children:`Audience > Users \u0026 subscriptions`}),` and confirm your test user appears. Check that user tags (email, name, etc.) are syncing for identified users.`]})}),_jsx(Step,{title:`Trigger a test event`,children:_jsx(_components.p,{children:`Browse a product or complete a test checkout on your store. Confirm the event appears in the user’s activity in the OneSignal dashboard.`})})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsx(Heading,{level:`3`,id:`service-worker-returns-404`,children:`Service worker returns 404`}),`\n`,_jsxs(_components.p,{children:[`The service worker must be at `,_jsx(_components.code,{children:`/apps/vendo/OneSignalSDKWorker.js`}),`. If you see a 404 error at the root path (`,_jsx(_components.code,{children:`/OneSignalSDKWorker.js`}),`), the service worker path is not configured in OneSignal — follow the `,_jsx(_components.a,{href:`#configure-the-service-worker-path`,children:`service worker configuration step`}),`. If the 404 is at the `,_jsx(_components.code,{children:`/apps/vendo/`}),` path, verify the Vendo app is installed and the theme block is enabled.`]}),`\n`,_jsx(Heading,{level:`3`,id:`”typical-site”-was-selected-during-onesignal-setup`,children:`”Typical Site” was selected during OneSignal setup`}),`\n`,_jsxs(_components.p,{children:[`Vendo requires the `,_jsx(_components.strong,{children:`Custom Code`}),` integration type. Typical Site does not expose the service worker path settings, so the SDK will try to load `,_jsx(_components.code,{children:`/OneSignalSDKWorker.js`}),` from your store root — Shopify blocks that and push subscriptions will silently fail.`]}),`\n`,_jsxs(_components.p,{children:[`Fix: in the OneSignal dashboard, either switch the app’s integration type to Custom Code under `,_jsx(_components.strong,{children:`Settings > Platforms > Web`}),`, or delete the app and recreate it using Custom Code from the start.`]}),`\n`,_jsx(Heading,{level:`3`,id:`push-prompt-not-appearing`,children:`Push prompt not appearing`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Check that the Vendo theme block is enabled in `,_jsx(_components.strong,{children:`App embeds`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`In the Vendo app under `,_jsx(_components.strong,{children:`OneSignal > Push Settings`}),`, confirm at least one prompt toggle (Subscription Bell, Push Slide Prompt, or Native Browser Prompt) is turned on — all four are off by default.`]}),`\n`,_jsx(_components.li,{children:`Check the trigger delay — a Push Slide set to multiple page views won’t fire on the first page load.`}),`\n`,_jsx(_components.li,{children:`Verify your browser allows notifications (click the lock icon in the address bar).`}),`\n`,_jsx(_components.li,{children:`Try an incognito/private window in case the prompt was previously dismissed.`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`tags-not-appearing-in-onesignal`,children:`Tags not appearing in OneSignal`}),`\n`,_jsx(_components.p,{children:`Tags only sync for identified users — anonymous visitors are not tracked. Ensure the user has been identified via push subscription, login, newsletter signup, or checkout. Initial tag syncs can take several hours.`}),`\n`,_jsx(Heading,{level:`3`,id:`events-not-triggering`,children:`Events not triggering`}),`\n`,_jsxs(_components.p,{children:[`Verify events are enabled in the Vendo app under `,_jsx(_components.strong,{children:`OneSignal > Events`}),`. Client-side events require the Shopify Web Pixel to be active and the user to be identified. Server-side events require the REST API Key to be configured.`]}),`\n`,_jsx(Heading,{level:`3`,id:`notifications-show-“delivered”-but-don’t-appear`,children:`Notifications show “Delivered” but don’t appear`}),`\n`,_jsx(_components.p,{children:`The integration is working — the issue is with your browser or OS notification settings. Check your OS notification settings for your browser, ensure Do Not Disturb / Focus mode is off, and verify browser-level notification permissions.`}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`faq`,children:`FAQ`}),`\n`,_jsx(Heading,{level:`3`,id:`can-i-change-the-customer-identifier-after-setup`,children:`Can I change the customer identifier after setup?`}),`\n`,_jsxs(_components.p,{children:[`Yes. Update the setting in the Vendo app under `,_jsx(_components.strong,{children:`Settings > Customer Identifier`}),`. Changing the identifier may create separate user profiles if existing users were already identified with the previous method.`]}),`\n`,_jsx(Heading,{level:`3`,id:`does-the-vendo-integration-support-mobile-apps`,children:`Does the Vendo integration support mobile apps?`}),`\n`,_jsx(_components.p,{children:`The Vendo integration focuses on Shopify storefronts and web push. If you also have a mobile app, ensure the identifier you select in Vendo matches the one you use in your mobile app so user profiles stay consistent.`}),`\n`,_jsx(Heading,{level:`3`,id:`what-happens-if-a-visitor-is-never-identified`,children:`What happens if a visitor is never identified?`}),`\n`,_jsx(_components.p,{children:`Events from unidentified visitors are not sent to OneSignal. Once the visitor identifies themselves (by subscribing to push, logging in, signing up for a newsletter, or completing checkout), Vendo begins sending events. This identified-only approach prevents duplicate users and ensures clean data.`}),`\n`,_jsx(Heading,{level:`3`,id:`why-does-vendo-use-an-identified-only-approach`,children:`Why does Vendo use an identified-only approach?`}),`\n`,_jsx(_components.p,{children:`Tracking anonymous visitors creates duplicate OneSignal users that can never be properly merged, leading to inflated user counts and fragmented data. The identified-only approach ensures every OneSignal user is real and actionable.`}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`related-pages`,children:`Related pages`}),`\n`,_jsxs(Columns,{cols:2,children:[_jsx(Card,{title:`Keys \u0026 IDs`,icon:`key`,href:`/docs/en/keys-and-ids`,children:_jsx(_components.p,{children:`Find your OneSignal App ID and REST API key.`})}),_jsx(Card,{title:`Custom events`,icon:`bolt`,href:`/docs/en/custom-events`,children:_jsx(_components.p,{children:`Track user behavior and trigger automations based on Shopify events.`})}),_jsx(Card,{title:`Web push setup`,icon:`globe`,href:`/docs/en/web-push-setup`,children:_jsx(_components.p,{children:`Set up web push notifications for your Shopify store.`})}),_jsx(Card,{title:`Web permission prompts`,icon:`bell`,href:`/docs/en/permission-requests`,children:_jsx(_components.p,{children:`Configure how and when to prompt visitors for web push permission.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Shopify web push integration","description":"Connect Shopify to OneSignal through the Vendo integration for web push notifications, customer tags, commerce events, and behavioral targeting.","keywords":["Shopify","Vendo","integration","web push","custom events","customer tags","e-commerce","abandoned cart"],"href":"/docs/en/shopify"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"OneSignal setup","slug":"onesignal-setup","depth":2,"children":[]},{"title":"Vendo setup","slug":"vendo-setup","depth":2,"children":[]},{"title":"Tracking","slug":"tracking","depth":2,"children":[{"title":"User identification","slug":"user-identification","depth":3,"children":[]},{"title":"Identity merging","slug":"identity-merging","depth":4,"children":[]},{"title":"Customer tags","slug":"customer-tags","depth":3,"children":[]},{"title":"Identity \u0026 profile","slug":"identity-\u0026-profile","depth":4,"children":[]},{"title":"Marketing consent","slug":"marketing-consent","depth":4,"children":[]},{"title":"Commerce stats","slug":"commerce-stats","depth":4,"children":[]},{"title":"Attribution tags","slug":"attribution-tags","depth":4,"children":[]},{"title":"Segment membership","slug":"segment-membership","depth":4,"children":[]},{"title":"Client-side events","slug":"client-side-events","depth":3,"children":[]},{"title":"Server-side events","slug":"server-side-events","depth":3,"children":[]}]},{"title":"Platform details","slug":"platform-details","depth":2,"children":[]},{"title":"Use cases","slug":"use-cases","depth":2,"children":[{"title":"Abandoned cart recovery","slug":"abandoned-cart-recovery","depth":3,"children":[]},{"title":"Order status updates","slug":"order-status-updates","depth":3,"children":[]},{"title":"VIP customer engagement","slug":"vip-customer-engagement","depth":3,"children":[]},{"title":"Re-engagement campaigns","slug":"re-engagement-campaigns","depth":3,"children":[]}]},{"title":"Compatible sources","slug":"compatible-sources","depth":2,"children":[]},{"title":"Testing","slug":"testing","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[{"title":"Service worker returns 404","slug":"service-worker-returns-404","depth":3,"children":[]},{"title":"”Typical Site” was selected during OneSignal setup","slug":"”typical-site”-was-selected-during-onesignal-setup","depth":3,"children":[]},{"title":"Push prompt not appearing","slug":"push-prompt-not-appearing","depth":3,"children":[]},{"title":"Tags not appearing in OneSignal","slug":"tags-not-appearing-in-onesignal","depth":3,"children":[]},{"title":"Events not triggering","slug":"events-not-triggering","depth":3,"children":[]},{"title":"Notifications show “Delivered” but don’t appear","slug":"notifications-show-“delivered”-but-don’t-appear","depth":3,"children":[]}]},{"title":"FAQ","slug":"faq","depth":2,"children":[{"title":"Can I change the customer identifier after setup?","slug":"can-i-change-the-customer-identifier-after-setup","depth":3,"children":[]},{"title":"Does the Vendo integration support mobile apps?","slug":"does-the-vendo-integration-support-mobile-apps","depth":3,"children":[]},{"title":"What happens if a visitor is never identified?","slug":"what-happens-if-a-visitor-is-never-identified","depth":3,"children":[]},{"title":"Why does Vendo use an identified-only approach?","slug":"why-does-vendo-use-an-identified-only-approach","depth":3,"children":[]}]},{"title":"Related pages","slug":"related-pages","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/onesignal/e069c1b9f3157e14/hotjar-koala.js","/_mintlify/custom/onesignal/3e5d03885ab32f49/intercom.js","/_mintlify/custom/onesignal/dbb7af4794d1b586/munchkin-marketo.js"],"subdomain":"onesignal","siteName":"OneSignal","title":"Shopify web push integration - OneSignal","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/docs/en/shopify","matchLevel":0},"cn":{"href":"/docs/cn/shopify","matchLevel":1},"ko":{"href":"/docs/ko/shopify","matchLevel":1},"ja":{"href":"/docs/ja/shopify","matchLevel":1},"tr":{"href":"/docs/tr/shopify","matchLevel":1},"pt-BR":{"href":"/docs/pt-BR/shopify","matchLevel":1},"es":{"href":"/docs/es/shopify","matchLevel":1},"fr":{"href":"/docs/fr/shopify","matchLevel":1}}},"lastModified":"2026-10-22T23:02:47.343Z","originalFileLocation":"docs/en/shopify.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Connect Shopify to OneSignal through the Vendo integration for web push notifications, customer tags, commerce events, and behavioral targeting.\">\u003cmeta data-mint-head name=\"application-name\" content=\"OneSignal\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/onesignal/eCiRydtW5fLfLRWp/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/onesignal/eCiRydtW5fLfLRWp/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/onesignal/eCiRydtW5fLfLRWp/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/onesignal/eCiRydtW5fLfLRWp/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/onesignal/eCiRydtW5fLfLRWp/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/onesignal/eCiRydtW5fLfLRWp/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/onesignal/eCiRydtW5fLfLRWp/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/onesignal/eCiRydtW5fLfLRWp/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/onesignal/eCiRydtW5fLfLRWp/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Shopify web push integration - OneSignal\">\u003cmeta data-mint-head property=\"og:description\" content=\"Connect Shopify to OneSignal through the Vendo integration for web push notifications, customer tags, commerce events, and behavioral targeting.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"OneSignal\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://documentation.onesignal.com/docs/en/shopify\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://onesignal.mintlify.app/_mintlify/api/og/v2?division=Web+push\u0026amp;title=Shopify+web+push+integration\u0026amp;description=Connect+Shopify+to+OneSignal+through+the+Vendo+integration+for+web+push+notifications%2C+customer+tags%2C+commerce+events%2C+and+behavioral+targeting.\u0026amp;theme=8d648f04f85028b307bd669b\u0026amp;signature=74632fa8c3f63f618e25b10a563eedb476ee4aeabdf3db4bf240afd2145ca30a\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Shopify web push integration - OneSignal\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Connect Shopify to OneSignal through the Vendo integration for web push notifications, customer tags, commerce events, and behavioral targeting.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://onesignal.mintlify.app/_mintlify/api/og/v2?division=Web+push\u0026amp;title=Shopify+web+push+integration\u0026amp;description=Connect+Shopify+to+OneSignal+through+the+Vendo+integration+for+web+push+notifications%2C+customer+tags%2C+commerce+events%2C+and+behavioral+targeting.\u0026amp;theme=8d648f04f85028b307bd669b\u0026amp;signature=74632fa8c3f63f618e25b10a563eedb476ee4aeabdf3db4bf240afd2145ca30a\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/onesignal/eCiRydtW5fLfLRWp/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"OneSignal Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3A3DB3\">\u003clink data-mint-head rel=\"canonical\" href=\"https://documentation.onesignal.com/docs/en/shopify\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/en/shopify.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://documentation.onesignal.com/docs/en/shopify\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://documentation.onesignal.com/docs/cn/shopify\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://documentation.onesignal.com/docs/ko/shopify\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://documentation.onesignal.com/docs/ja/shopify\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"tr\" href=\"https://documentation.onesignal.com/docs/tr/shopify\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"pt-BR\" href=\"https://documentation.onesignal.com/docs/pt-BR/shopify\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://documentation.onesignal.com/docs/es/shopify\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr\" href=\"https://documentation.onesignal.com/docs/fr/shopify\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://documentation.onesignal.com/docs/en/shopify\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://documentation.onesignal.com/#organization\",\"name\":\"OneSignal\",\"url\":\"https://documentation.onesignal.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/onesignal/yJcueeDCO7UpHnnY/logo/OneSignal-Logo.svg?fit=max\u0026auto=format\u0026n=yJcueeDCO7UpHnnY\u0026q=85\u0026s=1fcfb6fef6d820fd9d99c74850711107\"}},{\"@type\":\"WebSite\",\"@id\":\"https://documentation.onesignal.com#website\",\"name\":\"OneSignal\",\"url\":\"https://documentation.onesignal.com\",\"publisher\":{\"@id\":\"https://documentation.onesignal.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://documentation.onesignal.com/docs/en/shopify#webpage\",\"url\":\"https://documentation.onesignal.com/docs/en/shopify\",\"name\":\"Shopify web push integration\",\"description\":\"Connect Shopify to OneSignal through the Vendo integration for web push notifications, customer tags, commerce events, and behavioral targeting.\",\"dateModified\":\"2026-10-22T23:02:47.343Z\",\"isPartOf\":{\"@id\":\"https://documentation.onesignal.com#website\"},\"breadcrumb\":{\"@id\":\"https://documentation.onesignal.com/docs/en/shopify#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://documentation.onesignal.com/docs/en/shopify#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Message channels\",\"item\":\"https://documentation.onesignal.com/docs/en/channel-setup\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Push\",\"item\":\"https://documentation.onesignal.com/docs/en/push\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Web push\",\"item\":\"https://documentation.onesignal.com/docs/en/web-push-setup\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Shopify web push integration\",\"item\":\"https://documentation.onesignal.com/docs/en/shopify\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://documentation.onesignal.com/docs/en/shopify#article\",\"headline\":\"Shopify web push integration\",\"name\":\"Shopify web push integration\",\"description\":\"Connect Shopify to OneSignal through the Vendo integration for web push notifications, customer tags, commerce events, and behavioral targeting.\",\"url\":\"https://documentation.onesignal.com/docs/en/shopify\",\"mainEntityOfPage\":{\"@id\":\"https://documentation.onesignal.com/docs/en/shopify#webpage\"},\"dateModified\":\"2026-10-22T23:02:47.343Z\",\"keywords\":\"Shopify, Vendo, integration, web push, custom events, customer tags, e-commerce, abandoned cart\",\"publisher\":{\"@id\":\"https://documentation.onesignal.com/#organization\"},\"isPartOf\":{\"@id\":\"https://documentation.onesignal.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"OneSignal\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"OneSignal","nav":{"global":null,"languages":[{"language":"en","tabs":[{"tab":"Home","pages":[{"title":"Home","href":"/docs/en/home"}]},{"tab":"User Guides","groups":[{"group":"First steps \u0026 settings","pages":[{"title":"Getting started with OneSignal","href":"/docs/en/quickstart-guide"},{"group":"OneSignal dashboard","pages":[{"title":"Apps, Organizations, \u0026 Accounts","href":"/docs/en/apps-organizations"},{"title":"Team members","href":"/docs/en/manage-team-members"},{"title":"Keys \u0026 IDs","href":"/docs/en/keys-and-ids"},{"title":"Audit logs","href":"/docs/en/audit-logs"},{"title":"Usage \u0026 billing","href":"/docs/en/billing-faq"},{"title":"Disabled apps \u0026 organizations","href":"/docs/en/disabled-apps"}]},{"title":"Migrating to OneSignal","href":"/docs/en/migrating-to-onesignal"}]},{"group":"Message channels","pages":[{"title":"Channel setup","href":"/docs/en/channel-setup"},{"group":"Push","pages":[{"title":"Push overview","href":"/docs/en/push"},{"group":"Mobile push","pages":[{"title":"Mobile push setup","href":"/docs/en/mobile-push-setup"},{"title":"Prompt for push permissions","href":"/docs/en/prompt-for-push-permissions"},{"title":"iOS provisional push notifications","href":"/docs/en/ios-provisional-push-notifications"},{"title":"Android notification categories","href":"/docs/en/android-notification-categories"},{"title":"Data \u0026 background notifications","href":"/docs/en/data-notifications"},{"title":"VoIP push notifications","href":"/docs/en/voip-notifications"}]},{"group":"Web push","pages":[{"title":"Web push setup","href":"/docs/en/web-push-setup"},{"title":"Web permission prompts","href":"/docs/en/permission-requests"},{"title":"Web push FAQ","href":"/docs/en/web-push-setup-faq"},{"title":"Web push browser behavior","href":"/docs/en/browser-behavior-and-unsubscribes"},{"title":"OneSignal WordPress plugin setup for web push","href":"/docs/en/wordpress"},{"title":"WordPress troubleshooting","description":"Troubleshoot OneSignal web push on WordPress, including plugin setup issues, browser compatibility, and CDN or caching plugin conflicts.","href":"/docs/en/troubleshooting-wordpress-web-push"},{"title":"Shopify web push integration","href":"/docs/en/shopify"}]},{"group":"Push features","pages":[{"title":"Notification icons","description":"Choose default and per-message push notification icons on Android, iOS, and Web, including sizes and the transparency rule that prevents a white square.","href":"/docs/en/notification-icons"},{"title":"Notification images \u0026 rich media","href":"/docs/en/rich-media"},{"title":"Notification sounds","href":"/docs/en/notification-sounds"},{"title":"Notification badges","href":"/docs/en/badges"},{"title":"Action buttons for push notifications","href":"/docs/en/action-buttons"},{"title":"Push frequency capping","href":"/docs/en/frequency-capping"},{"title":"Push throttling","href":"/docs/en/throttling"},{"title":"iOS: Focus modes and interruption levels","href":"/docs/en/ios-focus-modes-and-interruption-levels"},{"title":"iOS: Relevance score","href":"/docs/en/ios-relevance-score"}]},{"group":"Push analytics \u0026 troubleshooting","pages":[{"title":"Push message reports","href":"/docs/en/push-notification-message-reports"},{"title":"Confirmed receipt","href":"/docs/en/confirmed-delivery"},{"title":"Notification click-through rate (CTR)","href":"/docs/en/notification-ctr"},{"title":"Mobile push: Notifications not shown or delayed","href":"/docs/en/notifications-show-successful-but-are-not-being-shown"},{"title":"Web push: Notifications not shown","href":"/docs/en/notifications-not-shown-web-push"},{"title":"Notification Images Not Showing","href":"/docs/en/notification-images-not-showing"},{"title":"Duplicated notifications","href":"/docs/en/duplicated-notifications"},{"title":"FCM expired token FAQ","href":"/docs/en/fcm-expired-token-faq"}]}]},{"group":"In-app messages","pages":[{"title":"In-app overview","href":"/docs/en/in-app-messages-setup"},{"title":"In-app triggers","href":"/docs/en/iam-triggers"},{"title":"In-app click actions","href":"/docs/en/iam-click-actions"},{"group":"In-app design","pages":[{"title":"Design in-app messages with drag-and-drop","href":"/docs/en/design-your-in-app-message"},{"title":"Design in-app messages with HTML","href":"/docs/en/design-your-in-app-message-with-html"},{"title":"In-app message templates \u0026 quickstarts","href":"/docs/en/in-app-html-templates"},{"title":"In-app message JavaScript API reference","href":"/docs/en/in-app-message-api"}]},{"title":"In-app message reports","href":"/docs/en/in-app-message-reports"},{"title":"In-app troubleshooting","href":"/docs/en/in-app-message-troubleshooting"}]},{"group":"Email","pages":[{"title":"Email overview","href":"/docs/en/email-messaging"},{"group":"Email setup","pages":[{"title":"Email setup","href":"/docs/en/email-setup"},{"title":"Email DNS configuration","href":"/docs/en/email-dns-configuration"},{"title":"Senders","href":"/docs/en/senders"},{"title":"BCC emails","href":"/docs/en/email-bcc"},{"title":"Transactional emails","href":"/docs/en/setup-transactional-emails"},{"title":"Create a custom email unsubscribe page","href":"/docs/en/create-custom-unsubscribe-page"}]},{"group":"Email deliverability \u0026 analytics","pages":[{"title":"Email message reports","href":"/docs/en/email-message-reports"},{"title":"Email deliverability","href":"/docs/en/email-deliverability"},{"title":"Deliverability insights by inbox provider","href":"/docs/en/email-deliverability-insights"},{"title":"Email reputation best practices","href":"/docs/en/email-reputation-best-practices"},{"title":"Email address validation","href":"/docs/en/email-address-validation"},{"title":"Email warm-up","href":"/docs/en/email-warm-up"},{"title":"Google Postmaster Tools","href":"/docs/en/google-postmaster-tools"},{"title":"Suppressions","href":"/docs/en/suppressions"},{"title":"Email troubleshooting","href":"/docs/en/email-troubleshooting"}]},{"group":"Design your emails","pages":[{"title":"Design emails with drag-and-drop","href":"/docs/en/design-emails-with-drag-and-drop"},{"title":"Design emails with HTML","href":"/docs/en/design-emails-with-html"},{"title":"Email unsubscribe links \u0026 headers","href":"/docs/en/unsubscribe-links-email-subscriptions"},{"title":"Email template forwarding","href":"/docs/en/email-template-forwarding"}]}]},{"group":"SMS \u0026 RCS","pages":[{"title":"SMS, MMS, and RCS overview","href":"/docs/en/sms-messaging"},{"title":"Rich Communication Services (RCS)","href":"/docs/en/rcs-messaging"},{"group":"SMS setup","pages":[{"title":"SMS setup","href":"/docs/en/sms-setup"},{"title":"Sender resource applications and country requirements","sidebarTitle":"Sender resource applications","href":"/docs/en/sms-registration-requirements"},{"title":"SMS opt-in and collection","href":"/docs/en/sms-opt-in-and-collection"},{"title":"SMS consent keyword management","href":"/docs/en/sms-consent-keyword-management"},{"title":"SMS keywords","href":"/docs/en/keywords"}]},{"group":"SMS messaging","pages":[{"title":"Promotional messaging","href":"/docs/en/sms-promotional-messaging"},{"title":"Transactional messaging","href":"/docs/en/sms-transactional-messaging"},{"title":"One-time passwords (OTP)","sidebarTitle":"One-time passwords","href":"/docs/en/sms-verify"},{"title":"Composing messages","href":"/docs/en/sms-composing-messages"},{"title":"SMS message reports","href":"/docs/en/sms-message-reports"}]}]},{"group":"Live Activities","pages":[{"title":"Live Activities","href":"/docs/en/live-activities"},{"title":"Live Activities analytics","href":"/docs/en/live-activities-analytics"}]},{"group":"Features","pages":[{"title":"A/B testing","href":"/docs/en/ab-testing"},{"title":"Multi-language messaging","href":"/docs/en/multi-language-messaging"},{"title":"Brand Kit","href":"/docs/en/brand-kit"},{"group":"Personalization","pages":[{"title":"Personalization","href":"/docs/en/message-personalization"},{"title":"Using Liquid syntax","href":"/docs/en/using-liquid-syntax"},{"title":"Data feeds","href":"/docs/en/data-feeds"},{"title":"Personalize with Custom Events","href":"/docs/en/personalization-custom-event"},{"title":"Personalize with properties","href":"/docs/en/personalization-properties-and-tags"},{"title":"Personalize messages with API custom_data","href":"/docs/en/personalization-api-custom-data"},{"title":"Dynamic Content with CSV","href":"/docs/en/dynamic-content"}]},{"group":"URLs, Links, \u0026 Deep Links","pages":[{"title":"URLs, links, \u0026 deep links","href":"/docs/en/links"},{"title":"Deep linking","href":"/docs/en/deep-linking"},{"title":"Email unsubscribe links \u0026 headers","href":"/docs/en/unsubscribe-links-email-subscriptions"}]},{"title":"Retargeting messages","href":"/docs/en/retargeting"},{"title":"Templates","href":"/docs/en/templates"},{"title":"Labels","href":"/docs/en/labels"}]}]},{"group":"Journeys","pages":[{"title":"Journeys overview","href":"/docs/en/journeys-overview"},{"group":"Journey features","pages":[{"title":"Journey settings","href":"/docs/en/journeys-settings"},{"title":"Journey messages","href":"/docs/en/journeys-messages"},{"title":"Journey message A/B testing","sidebarTitle":"A/B testing","tag":"BETA","href":"/docs/en/journeys-ab-testing"},{"title":"Journey actions","href":"/docs/en/journeys-actions"},{"title":"Journey webhooks","href":"/docs/en/journeys-webhook"},{"title":"Send WhatsApp Messages via Journey Webhooks","href":"/docs/en/sending-whatsapp-messages-via-journey-webhooks"},{"title":"Managing journeys","href":"/docs/en/managing-journeys"},{"title":"Journey version history","tag":"NEW","href":"/docs/en/journeys-version-history"},{"title":"Journey analytics","href":"/docs/en/journeys-analytics"}]},{"title":"Journey examples","href":"/docs/en/journeys-examples"},{"title":"Control Journey membership with tags","href":"/docs/en/journeys-membership-tags"}]},{"group":"OneSignal AI","pages":[{"title":"OneSignal AI","tag":"BETA","href":"/docs/en/onesignal-ai"},{"title":"OneSignal AI skills","sidebarTitle":"Skills","tag":"BETA","href":"/docs/en/onesignal-ai-skills"},{"title":"Check message","tag":"BETA","href":"/docs/en/check-message"},{"title":"OneSignal Home","href":"/docs/en/onesignal-home"},{"title":"OneSignal MCP Server","href":"/docs/en/model-context-protocol"},{"title":"OneSignal AI data practices","mode":"frame","href":"/docs/en/ai-data-practices"},{"title":"AI message composer","href":"/docs/en/ai-message-composer"},{"title":"OneSignal Slack Agent","hidden":true,"tag":"BETA","href":"/docs/en/slack-agent"}]},{"group":"Audience \u0026 events","pages":[{"title":"Segments","href":"/docs/en/segmentation"},{"title":"User-based segmentation","tag":"BETA","href":"/docs/en/user-based-segmentation"},{"group":"Users \u0026 Subscriptions","pages":[{"title":"Users","href":"/docs/en/users"},{"title":"Subscriptions","href":"/docs/en/subscriptions"},{"title":"Sessions","href":"/docs/en/sessions"},{"title":"User and Subscription Profiles","href":"/docs/en/user-subscription-profiles"},{"title":"Aliases","href":"/docs/en/aliases"},{"title":"Test users","href":"/docs/en/test-users"},{"title":"Delete users","href":"/docs/en/delete-users"}]},{"group":"Events","pages":[{"title":"Message events","href":"/docs/en/message-events"},{"title":"Session events","href":"/docs/en/session-events"},{"group":"Custom events","pages":[{"title":"Custom events","href":"/docs/en/custom-events"},{"title":"Custom event best practices","href":"/docs/en/custom-event-best-practices"},{"title":"Custom event storage and retention","href":"/docs/en/custom-event-storage"}]}]},{"group":"Tags","pages":[{"title":"Tags","href":"/docs/en/add-user-data-tags"},{"title":"Tags: Time Operators","href":"/docs/en/time-operators"}]},{"title":"Import","href":"/docs/en/import"}]},{"group":"Analytics \u0026 Integrations","pages":[{"group":"Analytics","pages":[{"title":"Analytics overview","href":"/docs/en/analytics-overview"},{"title":"Metrics glossary","href":"/docs/en/analytics-metrics-glossary"},{"title":"Goals","sidebarTitle":"Goals","tag":"BETA","href":"/docs/en/goals"},{"title":"Exporting data","href":"/docs/en/exporting-data"},{"title":"Template analytics","href":"/docs/en/template-analytics"},{"title":"Conversion metrics","href":"/docs/en/conversion-metrics"},{"title":"Engagement trends","href":"/docs/en/engagement-analytics"},{"title":"Subscription trends","href":"/docs/en/subscription-trends"},{"title":"Sessions volume","href":"/docs/en/sessions-volume"},{"group":"Retention metrics","pages":[{"title":"Retention metrics","href":"/docs/en/retention-metrics"},{"title":"Interpreting retention curves","href":"/docs/en/interpreting-retention-curves"}]},{"title":"Custom Outcomes","href":"/docs/en/custom-outcomes"}]},{"group":"Event Streams","pages":[{"title":"Event Streams","href":"/docs/en/event-streams"},{"title":"Event Stream data reference","sidebarTitle":"Event Stream data","href":"/docs/en/event-streams-data"},{"title":"In-app message event streams","href":"/docs/en/iam-event-streams"},{"title":"Google Sheets integration with Event Streams","href":"/docs/en/google-sheets-integration-with-event-streams"}]},{"group":"Integrations","pages":[{"title":"Integrations overview","href":"/docs/en/integrations"},{"title":"Data warehouse, DMP, \u0026 CRM integration","href":"/docs/en/database-dmp-crm-integration"},{"group":"OneSignal as data source","pages":[{"title":"Amplitude","href":"/docs/en/amplitude"},{"title":"Databricks","href":"/docs/en/databricks"},{"title":"Google BigQuery","href":"/docs/en/bigquery"},{"title":"Mixpanel","href":"/docs/en/mixpanel"},{"title":"Snowflake","href":"/docs/en/snowflake"},{"title":"Segment (Twilio)","href":"/docs/en/segment-onesignal-integration"}]},{"group":"OneSignal as destination","pages":[{"title":"Adobe Audience Manager","href":"/docs/en/adobe-audience-manager"},{"title":"AlloyDB","href":"/docs/en/alloydb"},{"title":"Amazon Athena","href":"/docs/en/amazon-athena"},{"title":"Amazon S3","href":"/docs/en/s3"},{"title":"Amplitude","href":"/docs/en/amplitude"},{"title":"Apache Kafka","href":"/docs/en/kafka"},{"title":"Amazon Redshift","href":"/docs/en/amazon-redshift"},{"title":"Azure Synapse","href":"/docs/en/azure-synapse"},{"title":"ClickHouse","href":"/docs/en/clickhouse"},{"title":"Confluent Cloud","href":"/docs/en/confluent-cloud"},{"title":"Databricks","href":"/docs/en/databricks"},{"title":"Elasticsearch","href":"/docs/en/elasticsearch"},{"title":"Google BigQuery","href":"/docs/en/bigquery"},{"title":"Google Cloud SQL","href":"/docs/en/google-cloud-sql"},{"title":"Google Sheets","href":"/docs/en/google-sheets"},{"title":"Greenplum","href":"/docs/en/greenplum"},{"title":"HubSpot","href":"/docs/en/hubspot"},{"title":"Materialize","href":"/docs/en/materialize"},{"title":"Microsoft Fabric","href":"/docs/en/microsoft-fabric"},{"title":"Mixpanel","href":"/docs/en/mixpanel"},{"title":"MotherDuck","href":"/docs/en/motherduck"},{"title":"MySQL","href":"/docs/en/mysql"},{"title":"PostgreSQL","href":"/docs/en/postgresql"},{"title":"Pub/Sub","href":"/docs/en/google-pubsub"},{"title":"SingleStore","href":"/docs/en/singlestore"},{"title":"Snowflake","href":"/docs/en/snowflake"},{"title":"SQL Server","href":"/docs/en/sql-server"},{"title":"Starburst Enterprise","href":"/docs/en/starburst-enterprise"},{"title":"Starburst Galaxy","href":"/docs/en/starburst-galaxy"},{"title":"Trino","href":"/docs/en/trino"},{"title":"Segment (Twilio)","href":"/docs/en/segment-onesignal-integration"}]},{"group":"Attribution","pages":[{"title":"RevenueCat","href":"/docs/en/revenuecat"},{"title":"Adjust","href":"/docs/en/adjust"},{"title":"BlueConic","href":"/docs/en/blueconic"}]},{"title":"Building an integration with OneSignal: partner guide","href":"/docs/en/building-an-integration-with-onesignal-partner-guide"}]}]},{"group":"Privacy \u0026 Security","pages":[{"group":"Security credentials","pages":[{"title":"SOC 2 Type II","href":"/docs/en/soc-2-type-ii"},{"title":"ISO 27001","href":"/docs/en/iso27001"},{"title":"HIPAA","href":"/docs/en/hipaa"}]},{"group":"Data privacy \u0026 regulatory compliance","pages":[{"title":"GDPR \u0026 Individual Rights","href":"/docs/en/gdpr-compliance"},{"title":"EU-US Data Privacy Framework","href":"/docs/en/eu-us-data-privacy-framework"},{"title":"Email regulatory compliance","href":"/docs/en/email-compliance"},{"title":"SMS regulatory compliance","href":"/docs/en/sms-regulatory-compliance"},{"title":"Apple App Privacy Requirements","href":"/docs/en/apple-app-privacy-requirements"},{"title":"Google Play Data Safety Requirements","href":"/docs/en/google-play-data-safety-requirements"},{"title":"Data collection \u0026 security FAQs","href":"/docs/en/data-questions"},{"title":"Data collected by the OneSignal SDK","href":"/docs/en/data-collected-by-the-onesignal-sdk"},{"title":"Handling personal data","href":"/docs/en/handling-personal-data"},{"title":"Data taxonomy","href":"/docs/en/data-taxonomy"},{"title":"OneSignal AI data practices","mode":"frame","href":"/docs/en/ai-data-practices"}]},{"group":"Authentication","pages":[{"title":"2-step authentication","href":"/docs/en/2-step-authentication"},{"title":"Single Sign-On (SSO)","href":"/docs/en/sso"}]}]}]},{"tab":"Developer Guides","pages":[{"title":"Developer Guides","href":"/docs/en/developers"}]},{"tab":"Tutorials","pages":[{"title":"Tutorials","href":"/docs/en/tutorials"}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/reference/rest-api-overview"}]},{"tab":"Release Notes","pages":[{"title":"Release Notes","href":"/release-notes/changelog"}]},{"tab":"Customer Success Hub","pages":[{"title":"Customer Success Hub","href":"/docs/en/customer-success-hub"}]}],"global":{"anchors":[{"anchor":"Blog","icon":"newspaper","href":"https://onesignal.com/blog"},{"anchor":"GitHub","icon":"github","href":"https://github.com/OneSignal"},{"anchor":"YouTube","icon":"youtube","href":"https://www.youtube.com/@onesignalofficial/playlists"}]}},{"language":"cn","pages":[{"title":"cn","href":"/docs/cn/shopify"}]},{"language":"ko","pages":[{"title":"ko","href":"/docs/ko/shopify"}]},{"language":"ja","pages":[{"title":"ja","href":"/docs/ja/shopify"}]},{"language":"tr","pages":[{"title":"tr","href":"/docs/tr/shopify"}]},{"language":"pt-BR","pages":[{"title":"pt-BR","href":"/docs/pt-BR/shopify"}]},{"language":"es","pages":[{"title":"es","href":"/docs/es/shopify"}]},{"language":"fr","pages":[{"title":"fr","href":"/docs/fr/shopify"}]}]},"basePath":"","title":"Shopify web push integration - OneSignal","buildId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","deploymentId":"dpl_9VVk5y1P8k1ATeJguVngy9Q3cmbD","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-BdiBGm0H.js","DynamicMarkdown-CbqEDjbV.js","zoom-image-lightbox-CvtNkYOX.js","lightbox-handle-r17bVUz3.js"]}