Build an automated flash sale campaign that drives conversions during a time-limited promotion, from a simple time-based flow to a fully personalized Journey with VIP early access and buyer suppression.
This tutorial walks through a complete flash sale Journey using Black Friday as the running example (40% off sitewide, midnight to midnight). The pattern applies to any time-limited promotion.
Case 1 – Basic: Pure time-based, no tags. Everyone receives the same messages at scheduled times. Good for your first flash sale or teams without tag infrastructure.
Case 2 – Advanced: Uses tags (vip_customer, wishlist_count, last_purchase_date) for VIP early access, wishlist personalization, and buyer suppression. Start with Case 1 and layer in Case 2 targeting as your data matures.
These templates are starting points: clone, edit, and re-use them in your own Journey. They use Liquid syntax for personalization.
Push Notification templates
Email templates
In-App Message templates
When
Name
Title
Message
Day before sale
Sale tomorrow
🛍️ Tomorrow only. 40% off sitewide.
Your Black Friday sale starts at midnight tonight. Don’t miss it.
Mid-sale
Mid-sale nudge
⏰ Still going, 40% off ends tonight
The Black Friday sale is still live. Don’t leave your items behind.
2 hours before close
Last chance
🔥 2 hours left, last chance
The Black Friday sale closes at midnight. This is your last chance.
Sale launch, VIPs (Case 2)
VIP early access
🎉 You’re in early, {{first_name}}
VIP early access is live. 40% off everything, shop before everyone else.
Sale launch + 1 hour (Case 2)
Sale launch
🛍️ Black Friday is LIVE
40% off sitewide, ends tonight at midnight. Shop now.
Sale launch, wishlist users (Case 2)
Wishlist on sale
💜 Your saved items are 40% off
You have {{user.tags.wishlist_count}} items on your wishlist. They’re all on sale right now.
Templates
Create and manage reusable message templates.
Message personalization
Overview of all personalization options available in OneSignal.
Emails carry the long-form moments of the Journey. Three emails fire: pre-sale excitement, sale launch, and a halfway reminder.Pre-sale excitement (2 days before)Purpose: Build anticipation and drive wishlist adds before the sale opens.Suggested subject: Black Friday is almost here 🛍️Content outline:
A teaser of what’s coming (40% off everything)
Preview of featured products or categories
CTA to browse and add items to wishlist
Countdown to sale start
Sale is live (sale day)Purpose: Announce the sale launch and drive immediate traffic.Suggested subject: Black Friday is LIVE, 40% off everythingContent outline:
Bold announcement that the sale has started
Featured deals and product highlights
Clear CTA to shop now
Sale end time prominently displayed
Final reminder (halfway through sale)Purpose: Recover users who haven’t purchased yet.Suggested subject: Don’t miss out, sale ends tonightContent outline:
Reminder that time is running out
Highlight top-selling or low-stock items
Urgency messaging with countdown
CTA to complete purchase
Email messaging
Create and send email campaigns.
Message personalization
Overview of all personalization options available in OneSignal.
In-app messages fire when users open your app. Two are included: a pre-sale teaser and a sale-day banner.Pre-sale excitement (2 days before)Use a banner or modal to build anticipation:
Headline: “Black Friday is coming!”
Body: “40% off everything starts Friday at midnight. Add items to your wishlist now.”
CTA: Deep link to wishlist or sale preview page
Sale is live banner (sale day)Show a banner when users open the app during the sale:
This Journey runs entirely on time-based Wait nodes. No tags, no targeting. Everyone receives the same messages at scheduled times. Set it live 2 days before the sale opens.
Email + In-App Message: Pre-sale excitement (2 days before)
Goal: Build anticipation a few days before the sale.Add an Email node as the first step, then an In-App Message node immediately after.The email lands when the user enters the Journey. The IAM is queued and displays the next time they open your app.
2
Wait: 1 day
Goal: Advance to the day before the sale.Add a Wait node set to 1 day.
3
Push Notification: Sale starts tomorrow (day before)
Goal: Reminder the day before.Add a Push Notification node.
Field
Value
Title
Tomorrow only. 40% off sitewide.
Body
Your Black Friday sale starts at midnight tonight. Don't miss it.
Launch URL
Your sale landing page
4
Wait: 1 day
Goal: Advance to sale day.Add a Wait node set to 1 day.
5
Email + In-App Message: Sale is live (sale day)
Goal: Announce the sale launch.Add an Email node, then an In-App Message node.The email announces the sale is live. The IAM displays a sale banner when users open the app.
6
Wait: a few hours
Goal: Give users time to see the launch messages before the mid-sale nudge.Add a Wait node set to 3–4 hours (adjust based on your sale duration).
7
Push Notification: Mid-sale nudge
Goal: Re-engage users who haven’t visited yet.Add a Push Notification node.
Field
Value
Title
Still going, 40% off ends tonight
Body
The Black Friday sale is still live. Don't leave your items behind.
Launch URL
Your sale page
8
Wait: until halfway through sale
Goal: Advance to the halfway point.Add a Wait node. For a 24-hour sale that started at midnight, set this to 6–8 hours to land around midday/afternoon.
9
Email: Final reminder
Goal: Last email push to recover non-purchasers.Add an Email node with urgency messaging and countdown.
10
Wait: until 2 hours before end
Goal: Advance to the final urgency window.Add a Wait node to land 2 hours before the sale ends. For a midnight-to-midnight sale, this is around 10 PM.
11
Push Notification: Last chance
Goal: Final urgency push.Add a Push Notification node.
Field
Value
Title
2 hours left, last chance
Body
The Black Friday sale closes at midnight. This is your last chance.
Time of the user’s most recent purchase, stored as a Unix timestamp in seconds (10 digits)
These tags must be maintained by your backend and synced to OneSignal. See Tags for setup.
The time elapsed greater than operator compares the current time to a Unix timestamp stored on the tag. Store last_purchase_date as a Unix timestamp in seconds (10 digits), not milliseconds or a formatted date. See Tags: Time Operators for details.
Case 2 follows the same overall timing as Case 1, but adds a VIP branch at launch, a wishlist branch right after, and a buyer-suppression filter on every urgency message.
1
Email + In-App Message: Pre-sale excitement (2 days before)
Goal: Build anticipation a few days before the sale.Add an Email node as the first step, then an In-App Message node immediately after.The email lands when the user enters the Journey. The IAM is queued and displays the next time they open your app.
2
Wait: 1 day
Goal: Advance to the day before the sale.Add a Wait node set to 1 day.
3
Push Notification: Sale starts tomorrow (day before)
Goal: Reminder the day before.Add a Push Notification node.
Field
Value
Title
Tomorrow only. 40% off sitewide.
Body
Your Black Friday sale starts at midnight tonight. Don't miss it.
Launch URL
Your sale landing page
4
Wait: 1 day
Goal: Advance to sale day.Add a Wait node set to 1 day.
5
Branch: VIP / General split (sale launch)
Goal: Give VIPs a 1-hour head start.Add a Yes/No Branch node:
Condition:User Tagvip_customer · operator is · value true
Yes branch (VIP): Add a Push Notification node immediately:
Field
Value
Title
You're in early, {{first_name}} 🎉
Body
VIP early access is live. 40% off everything, shop before everyone else.
Launch URL
Your sale page
No branch (general): Add a Wait node set to 1 hour, then a Push Notification node:
Field
Value
Title
Black Friday is LIVE 🛍️
Body
40% off sitewide, ends tonight at midnight. Shop now.
Launch URL
Your sale page
6
Email + In-App Message: Sale is live
Goal: Announce the sale to everyone.Connect both branches into the same next node. Add an Email node, then an In-App Message node. The email announces the sale is live and the IAM displays a sale banner when users open the app.
7
Branch: Wishlist personalization
Goal: Send a personalized push to wishlist users.Add a Yes/No Branch node:
Condition:User Tagwishlist_count · operator greater than · value 0
Yes branch (wishlist users): Add a Push Notification node:
Field
Value
Title
Your saved items are 40% off
Body
You have {{user.tags.wishlist_count}} items on your wishlist. They're all on sale right now.
Launch URL
Your wishlist page
No branch (no wishlist): Continue with no message.Connect both branches into the next step.
8
Wait: a few hours
Goal: Give users time before the mid-sale nudge.Add a Wait node set to 3–4 hours.
9
Branch + Push: Mid-sale nudge (buyer suppression)
Goal: Nudge non-buyers only.Add a Yes/No Branch node. Match any of these filters:
User Taglast_purchase_date · operator time elapsed greater than · value 4 hours
User Taglast_purchase_date · operator does not exist
Adjust the 4 hours value based on how long after sale launch this step fires in your Journey.Yes branch (non-buyers): Add a Push Notification node:
Field
Value
Title
Still going, 40% off ends tonight
Body
The Black Friday sale is still live. Don't leave your items behind.
Launch URL
Your sale page
No branch (buyers): Skip the push, route directly to the next step.
10
Wait: until halfway through sale
Add a Wait node to reach the halfway point.
11
Branch + Email: Final reminder (buyer suppression)
Goal: Email non-buyers only.Add a Yes/No Branch node. Match any of these filters:
User Taglast_purchase_date · operator time elapsed greater than · value 12 hours (halfway through a 24-hour sale)
User Taglast_purchase_date · operator does not exist
Yes branch (non-buyers): Add an Email node with urgency messaging.No branch (buyers): Skip the email.
12
Wait: until 2 hours before end
Add a Wait node to reach the final urgency window.
13
Branch + Push: Last chance (buyer suppression)
Goal: Final push to non-buyers only.Add a Yes/No Branch node. Match any of these filters:
User Taglast_purchase_date · operator time elapsed greater than · value 22 hours (two hours before a midnight close)
User Taglast_purchase_date · operator does not exist
Yes branch (non-buyers): Add a Push Notification node:
Field
Value
Title
2 hours left, last chance
Body
The Black Friday sale closes at midnight. This is your last chance.
Launch URL
Your sale page or cart
No branch (buyers): End of Journey.
The last_purchase_date filter only suppresses buyers if your backend updates the tag in near-real-time. If your stack updates the tag nightly, buyers in the early hours of the sale will still receive urgency messages later that day. Verify the sync cadence before launch.
Apply buyer suppression to every urgency message. Without it, users who bought early still receive “last chance” pushes, which is the most common cause of unsubscribes after a flash sale.
Verify tag freshness before launch by simulating a purchase and confirming the last_purchase_date tag updates within minutes.
All Case 1 best practices still apply. Quiet hours, deep linking, and pausing the Journey if the sale ends early.
Be aware of message volume. A VIP wishlist user who never buys can receive up to 4 pushes and 3 emails across the full sequence. Make sure that volume feels appropriate for your audience before launch.
Start with Case 1 if you’re running your first flash sale or don’t have tag infrastructure in place. As you add tags to your data layer, upgrade to Case 2 by adding the VIP branch, wishlist branch, and buyer-suppression filters. The VIP early access alone is worth the effort: it rewards your best customers and creates social proof when they share their finds.After this Journey is live, consider adding SMS for the final urgency push (see SMS messaging) or extending the pattern to other time-limited promotions like summer sales, anniversary events, or new product launches.
Learn how to build, branch, and manage automated message flows.
Message personalization
Use Liquid tags to personalize message copy with user data.
Segments
Build reusable audiences based on tags, behavior, and more.
In-app messages
Create banners and modals to reach users inside your app.
Email setup
Configure email messaging for your campaigns.
Tags
Add custom data to user profiles for targeting and personalization.
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":"6ae52961fd814923a414a631","collectionId":"557b4321-d598-4270-86c9-36902a5eccfe","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae52961fd814923a414a631"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae52961fd814923a414a631","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"en","tag":"User Guides","count":201},{"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":"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":"byok-sep-25","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":"billing-updated-9-15","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/flash-sale","slug":"/docs/en/flash-sale","pageMetadata":{"title":"Flash sale Journey","description":"Build an automated flash sale campaign that drives conversions during a time-limited promotion, from a simple time-based flow to a fully personalized Journey with VIP early access and buyer suppression.","keywords":["flash sale","journeys","push notifications","black friday","time-limited promotion"],"href":"/docs/en/flash-sale"},"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: \"Build an automated flash sale campaign that drives conversions during a time-limited promotion, from a simple time-based flow to a fully personalized Journey with VIP early access and buyer suppression.\"\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`,em:`em`,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,Heading,Note,Step,Steps,Tab,Table,Tabs,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!Columns)_missingMdxReference(`Columns`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`This tutorial walks through a complete flash sale Journey using `,_jsx(_components.strong,{children:`Black Friday`}),` as the running example (40% off sitewide, midnight to midnight). The pattern applies to any time-limited promotion.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Case 1 – Basic:`}),` Pure time-based, no tags. Everyone receives the same messages at scheduled times. Good for your first flash sale or teams without tag infrastructure.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Case 2 – Advanced:`}),` Uses tags (`,_jsx(_components.code,{children:`vip_customer`}),`, `,_jsx(_components.code,{children:`wishlist_count`}),`, `,_jsx(_components.code,{children:`last_purchase_date`}),`) for VIP early access, wishlist personalization, and buyer suppression. Start with Case 1 and layer in Case 2 targeting as your data matures.`]}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`at-a-glance`,children:`At a glance`}),`\n`,_jsx(_components.p,{children:`Setup is the same for both cases. The only difference is how targeting and branching are applied.`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Define the `,_jsx(_components.a,{href:`#segments`,children:`entry segment`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Build the `,_jsx(_components.a,{href:`#templates`,children:`push, email, and in-app message templates`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Configure `,_jsx(_components.a,{href:`#journey-settings`,children:`Journey entry, exit, and re-entry rules`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Wire up the Journey steps:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Case 1:`}),` `,_jsx(_components.a,{href:`#case-1-basic-time-based-journey`,children:`Linear flow with Wait nodes`}),`, everyone gets the same messages.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Case 2:`}),` `,_jsx(_components.a,{href:`#case-2-advanced-tag-based-journey`,children:`Add VIP branch, wishlist branch, and buyer suppression`}),`.`]}),`\n`]}),`\n`]}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`campaign-goals`,children:`Campaign goals`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Goal`}),_jsx(_components.th,{children:`How this campaign achieves it`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Build pre-sale anticipation`})}),_jsx(_components.td,{children:`Email + in-app message before the sale`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Remind users the day before`})}),_jsx(_components.td,{children:`Push the day before to keep the sale top of mind`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Announce the sale launch`})}),_jsx(_components.td,{children:`Email + in-app message when the sale goes live`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Re-engage mid-sale`})}),_jsx(_components.td,{children:`Push a few hours after launch for non-visitors`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Final email reminder`})}),_jsx(_components.td,{children:`Email halfway through to recover non-purchasers`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Last-chance urgency`})}),_jsx(_components.td,{children:`Push 2 hours before the sale ends`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Personalize and protect trust`}),` (Case 2)`]}),_jsx(_components.td,{children:`VIP early access, wishlist push, and buyer suppression via tags`})]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A OneSignal account with push notifications set up for your app or site`}),`\n`,_jsx(_components.li,{children:`Push permission enabled for your users`}),`\n`,_jsxs(_components.li,{children:[`Familiarity with `,_jsx(_components.a,{href:`/docs/en/journeys-overview`,children:`Journeys`}),` concepts (entry/exit rules, message and action steps, etc.)`]}),`\n`,_jsxs(_components.li,{children:[`Email channel set up if you want to send emails (see `,_jsx(_components.a,{href:`/docs/en/email-setup`,children:`Email setup`}),`)`]}),`\n`,_jsxs(_components.li,{children:[`In-app messaging enabled if you want to show banners during the sale window (see `,_jsx(_components.a,{href:`/docs/en/in-app-messages-setup`,children:`In-app messages setup`}),`)`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Case 2 also requires tags maintained by your backend. See `,_jsx(_components.a,{href:`#case-2-advanced-tag-based-journey`,children:`Case 2: Advanced tag-based Journey`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`segments`,children:`Segments`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Entry segment (both cases):`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Name: “Total Subscriptions”`}),`\n`,_jsx(_components.li,{children:`Built-in, no setup needed. All push-subscribed users enter the Journey.`}),`\n`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`VIP segment (Case 2 only):`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Name: “VIP Customers”`}),`\n`,_jsxs(_components.li,{children:[`Filter: `,_jsx(_components.strong,{children:`User Tag`}),` `,_jsx(_components.code,{children:`vip_customer`}),` · operator `,_jsx(_components.strong,{children:`is`}),` · value `,_jsx(_components.code,{children:`true`})]}),`\n`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Wishlist segment (Case 2 only):`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Name: “Wishlist Users”`}),`\n`,_jsxs(_components.li,{children:[`Filter: `,_jsx(_components.strong,{children:`User Tag`}),` `,_jsx(_components.code,{children:`wishlist_count`}),` · operator `,_jsx(_components.strong,{children:`greater than`}),` · value `,_jsx(_components.code,{children:`0`})]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`templates`,children:`Templates`}),`\n`,_jsxs(_components.p,{children:[`These templates are starting points: clone, edit, and re-use them in your own Journey. They use `,_jsx(_components.a,{href:`/docs/en/using-liquid-syntax`,children:`Liquid syntax`}),` for personalization.`]}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Push Notification templates`,id:`push-notification-templates`,children:[_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`When`}),_jsx(_components.th,{children:`Name`}),_jsx(_components.th,{children:`Title`}),_jsx(_components.th,{children:`Message`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Day before sale`}),_jsx(_components.td,{children:`Sale tomorrow`}),_jsx(_components.td,{children:`🛍️ Tomorrow only. 40% off sitewide.`}),_jsx(_components.td,{children:`Your Black Friday sale starts at midnight tonight. Don’t miss it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Mid-sale`}),_jsx(_components.td,{children:`Mid-sale nudge`}),_jsx(_components.td,{children:`⏰ Still going, 40% off ends tonight`}),_jsx(_components.td,{children:`The Black Friday sale is still live. Don’t leave your items behind.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`2 hours before close`}),_jsx(_components.td,{children:`Last chance`}),_jsx(_components.td,{children:`🔥 2 hours left, last chance`}),_jsx(_components.td,{children:`The Black Friday sale closes at midnight. This is your last chance.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Sale launch, VIPs (Case 2)`}),_jsx(_components.td,{children:`VIP early access`}),_jsx(_components.td,{children:`🎉 You’re in early, {{first_name}}`}),_jsx(_components.td,{children:`VIP early access is live. 40% off everything, shop before everyone else.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Sale launch + 1 hour (Case 2)`}),_jsx(_components.td,{children:`Sale launch`}),_jsx(_components.td,{children:`🛍️ Black Friday is LIVE`}),_jsx(_components.td,{children:`40% off sitewide, ends tonight at midnight. Shop now.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Sale launch, wishlist users (Case 2)`}),_jsx(_components.td,{children:`Wishlist on sale`}),_jsx(_components.td,{children:`💜 Your saved items are 40% off`}),_jsx(_components.td,{children:`You have {{user.tags.wishlist_count}} items on your wishlist. They’re all on sale right now.`})]})]})]}),_jsxs(Columns,{cols:2,children:[_jsx(Card,{title:`Templates`,icon:`clone`,href:`/docs/en/templates`,children:_jsx(_components.p,{children:`Create and manage reusable message templates.`})}),_jsx(Card,{title:`Message personalization`,icon:`wand-magic-sparkles`,href:`/docs/en/message-personalization`,children:_jsx(_components.p,{children:`Overview of all personalization options available in OneSignal.`})})]})]}),_jsxs(Tab,{title:`Email templates`,id:`email-templates`,children:[_jsx(_components.p,{children:`Emails carry the long-form moments of the Journey. Three emails fire: pre-sale excitement, sale launch, and a halfway reminder.`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Pre-sale excitement (2 days before)`})}),_jsxs(_components.p,{children:[_jsx(_components.em,{children:`Purpose:`}),` Build anticipation and drive wishlist adds before the sale opens.`]}),_jsxs(_components.p,{children:[_jsx(_components.em,{children:`Suggested subject:`}),` Black Friday is almost here 🛍️`]}),_jsx(_components.p,{children:_jsx(_components.em,{children:`Content outline:`})}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A teaser of what’s coming (40% off everything)`}),`\n`,_jsx(_components.li,{children:`Preview of featured products or categories`}),`\n`,_jsx(_components.li,{children:`CTA to browse and add items to wishlist`}),`\n`,_jsx(_components.li,{children:`Countdown to sale start`}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Sale is live (sale day)`})}),_jsxs(_components.p,{children:[_jsx(_components.em,{children:`Purpose:`}),` Announce the sale launch and drive immediate traffic.`]}),_jsxs(_components.p,{children:[_jsx(_components.em,{children:`Suggested subject:`}),` Black Friday is LIVE, 40% off everything`]}),_jsx(_components.p,{children:_jsx(_components.em,{children:`Content outline:`})}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Bold announcement that the sale has started`}),`\n`,_jsx(_components.li,{children:`Featured deals and product highlights`}),`\n`,_jsx(_components.li,{children:`Clear CTA to shop now`}),`\n`,_jsx(_components.li,{children:`Sale end time prominently displayed`}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Final reminder (halfway through sale)`})}),_jsxs(_components.p,{children:[_jsx(_components.em,{children:`Purpose:`}),` Recover users who haven’t purchased yet.`]}),_jsxs(_components.p,{children:[_jsx(_components.em,{children:`Suggested subject:`}),` Don’t miss out, sale ends tonight`]}),_jsx(_components.p,{children:_jsx(_components.em,{children:`Content outline:`})}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Reminder that time is running out`}),`\n`,_jsx(_components.li,{children:`Highlight top-selling or low-stock items`}),`\n`,_jsx(_components.li,{children:`Urgency messaging with countdown`}),`\n`,_jsx(_components.li,{children:`CTA to complete purchase`}),`\n`]}),_jsxs(Columns,{cols:2,children:[_jsx(Card,{title:`Email messaging`,icon:`envelope`,href:`/docs/en/email-messaging`,children:_jsx(_components.p,{children:`Create and send email campaigns.`})}),_jsx(Card,{title:`Message personalization`,icon:`wand-magic-sparkles`,href:`/docs/en/message-personalization`,children:_jsx(_components.p,{children:`Overview of all personalization options available in OneSignal.`})})]})]}),_jsxs(Tab,{title:`In-App Message templates`,id:`in-app-message-templates`,children:[_jsx(_components.p,{children:`In-app messages fire when users open your app. Two are included: a pre-sale teaser and a sale-day banner.`}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Pre-sale excitement (2 days before)`})}),_jsx(_components.p,{children:`Use a banner or modal to build anticipation:`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Headline: “Black Friday is coming!”`}),`\n`,_jsx(_components.li,{children:`Body: “40% off everything starts Friday at midnight. Add items to your wishlist now.”`}),`\n`,_jsx(_components.li,{children:`CTA: Deep link to wishlist or sale preview page`}),`\n`]}),_jsx(_components.p,{children:_jsx(_components.strong,{children:`Sale is live banner (sale day)`})}),_jsx(_components.p,{children:`Show a banner when users open the app during the sale:`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Headline: “Black Friday is LIVE”`}),`\n`,_jsx(_components.li,{children:`Body: “40% off sitewide, ends at midnight”`}),`\n`,_jsx(_components.li,{children:`CTA: Deep link to sale page`}),`\n`]}),_jsxs(Columns,{cols:2,children:[_jsx(Card,{title:`Design your in-app message`,icon:`pen-ruler`,href:`/docs/en/design-your-in-app-message`,children:_jsx(_components.p,{children:`Full reference for the in-app message editor.`})}),_jsx(Card,{title:`Deep linking`,icon:`arrow-up-right-from-square`,href:`/docs/en/deep-linking`,children:_jsx(_components.p,{children:`Route users to the correct page.`})})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`journey-configuration`,children:`Journey configuration`}),`\n`,_jsx(_components.p,{children:`Both cases share the same Journey settings. Define them once and use them for either case.`}),`\n`,_jsx(Heading,{level:`3`,id:`journey-settings`,children:`Journey settings`}),`\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:_jsx(_components.strong,{children:`Entry`})}),_jsx(_components.td,{children:`Audience Segment: “Total Subscriptions”`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Exit`})}),_jsx(_components.td,{children:`User reaches the end of the flow`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Re-entry`})}),_jsx(_components.td,{children:`No, users receive this Journey only once per sale`})]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`case-1-basic-time-based-journey`,children:`Case 1: Basic time-based Journey`}),`\n`,_jsxs(_components.p,{children:[`This Journey runs entirely on time-based `,_jsx(_components.strong,{children:`Wait`}),` nodes. No tags, no targeting. Everyone receives the same messages at scheduled times. Set it live 2 days before the sale opens.`]}),`\n`,_jsx(Heading,{level:`3`,id:`journey-timing`,children:`Journey timing`}),`\n`,_jsx(_components.p,{children:`The campaign progresses through anticipation (2 days before through the day before), launch (sale day), and urgency (afternoon through close):`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Step`}),_jsx(_components.th,{children:`When`}),_jsx(_components.th,{children:`Channel`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`1`}),_jsx(_components.td,{children:`2 days before sale (on entry)`}),_jsx(_components.td,{children:`Email + IAM`}),_jsx(_components.td,{children:`Build excitement`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`2`}),_jsx(_components.td,{children:`Day before sale`}),_jsx(_components.td,{children:`Push`}),_jsx(_components.td,{children:`Sale starts tomorrow`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`3`}),_jsx(_components.td,{children:`Sale launch`}),_jsx(_components.td,{children:`Email + IAM`}),_jsx(_components.td,{children:`Sale is live`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`4`}),_jsx(_components.td,{children:`A few hours after launch`}),_jsx(_components.td,{children:`Push`}),_jsx(_components.td,{children:`Mid-sale nudge`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`5`}),_jsx(_components.td,{children:`Halfway through sale`}),_jsx(_components.td,{children:`Email`}),_jsx(_components.td,{children:`Final email reminder`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`6`}),_jsx(_components.td,{children:`2 hours before close`}),_jsx(_components.td,{children:`Push`}),_jsx(_components.td,{children:`Last chance`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`basic-journey-steps`,children:`Basic Journey steps`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Email + In-App Message: Pre-sale excitement (2 days before)`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Build anticipation a few days before the sale.`]}),_jsxs(_components.p,{children:[`Add an `,_jsx(_components.strong,{children:`Email`}),` node as the first step, then an `,_jsx(_components.strong,{children:`In-App Message`}),` node immediately after.`]}),_jsx(_components.p,{children:`The email lands when the user enters the Journey. The IAM is queued and displays the next time they open your app.`})]}),_jsxs(Step,{title:`Wait: 1 day`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Advance to the day before the sale.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Wait`}),` node set to `,_jsx(_components.strong,{children:`1 day`}),`.`]})]}),_jsxs(Step,{title:`Push Notification: Sale starts tomorrow (day before)`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Reminder the day before.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Push Notification`}),` node.`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Title`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Tomorrow only. 40% off sitewide.`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Body`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Your Black Friday sale starts at midnight tonight. Don't miss it.`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Launch URL`})}),_jsx(_components.td,{children:`Your sale landing page`})]})]})]})]}),_jsxs(Step,{title:`Wait: 1 day`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Advance to sale day.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Wait`}),` node set to `,_jsx(_components.strong,{children:`1 day`}),`.`]})]}),_jsxs(Step,{title:`Email + In-App Message: Sale is live (sale day)`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Announce the sale launch.`]}),_jsxs(_components.p,{children:[`Add an `,_jsx(_components.strong,{children:`Email`}),` node, then an `,_jsx(_components.strong,{children:`In-App Message`}),` node.`]}),_jsx(_components.p,{children:`The email announces the sale is live. The IAM displays a sale banner when users open the app.`})]}),_jsxs(Step,{title:`Wait: a few hours`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Give users time to see the launch messages before the mid-sale nudge.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Wait`}),` node set to `,_jsx(_components.strong,{children:`3–4 hours`}),` (adjust based on your sale duration).`]})]}),_jsxs(Step,{title:`Push Notification: Mid-sale nudge`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Re-engage users who haven’t visited yet.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Push Notification`}),` node.`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Title`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Still going, 40% off ends tonight`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Body`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`The Black Friday sale is still live. Don't leave your items behind.`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Launch URL`})}),_jsx(_components.td,{children:`Your sale page`})]})]})]})]}),_jsxs(Step,{title:`Wait: until halfway through sale`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Advance to the halfway point.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Wait`}),` node. For a 24-hour sale that started at midnight, set this to `,_jsx(_components.strong,{children:`6–8 hours`}),` to land around midday/afternoon.`]})]}),_jsxs(Step,{title:`Email: Final reminder`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Last email push to recover non-purchasers.`]}),_jsxs(_components.p,{children:[`Add an `,_jsx(_components.strong,{children:`Email`}),` node with urgency messaging and countdown.`]})]}),_jsxs(Step,{title:`Wait: until 2 hours before end`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Advance to the final urgency window.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Wait`}),` node to land `,_jsx(_components.strong,{children:`2 hours before the sale ends`}),`. For a midnight-to-midnight sale, this is around 10 PM.`]})]}),_jsxs(Step,{title:`Push Notification: Last chance`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Final urgency push.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Push Notification`}),` node.`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Title`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`2 hours left, last chance`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Body`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`The Black Friday sale closes at midnight. This is your last chance.`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Launch URL`})}),_jsx(_components.td,{children:`Your sale page or cart`})]})]})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`best-practices-for-case-1`,children:`Best practices for Case 1`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Set the Journey live 2 days before the sale.`}),` The pre-sale email fires immediately for users who enter.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Respect quiet hours.`}),` Avoid sending pushes between 10 PM and 7 AM in the user’s timezone. Adjust Wait nodes if needed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Pause the Journey if the sale ends early.`}),` From the dashboard, pause stops remaining Wait nodes and prevents any remaining messages from firing.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[_jsx(_components.a,{href:`/docs/en/deep-linking`,children:`Deep-link`}),` every message to the right page.`]}),` Tapping a push should land users on the sale page, not the app home.`]}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`case-2-advanced-tag-based-journey`,children:`Case 2: Advanced tag-based Journey`}),`\n`,_jsx(_components.p,{children:`Case 2 builds on Case 1 by adding targeting with tags. The timing is the same, but you add:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`VIP early access:`}),` VIPs get a 1-hour head start at sale launch`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Wishlist personalization:`}),` Users with wishlist items get a personalized push`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Buyer suppression:`}),` Filter out buyers from urgency messages`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`required-tags`,children:`Required tags`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Tag`}),_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`vip_customer`})}),_jsx(_components.td,{children:`Boolean`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`true`}),` if the user is a VIP customer`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`wishlist_count`})}),_jsx(_components.td,{children:`Number`}),_jsx(_components.td,{children:`Count of items in the user’s wishlist`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`last_purchase_date`})}),_jsx(_components.td,{children:`Unix timestamp (seconds)`}),_jsx(_components.td,{children:`Time of the user’s most recent purchase, stored as a Unix timestamp in seconds (10 digits)`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`These tags must be maintained by your backend and synced to OneSignal. See `,_jsx(_components.a,{href:`/docs/en/add-user-data-tags`,children:`Tags`}),` for setup.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`time elapsed greater than`}),` operator compares the current time to a Unix timestamp stored on the tag. Store `,_jsx(_components.code,{children:`last_purchase_date`}),` as a `,_jsx(_components.strong,{children:`Unix timestamp in seconds`}),` (10 digits), not milliseconds or a formatted date. See `,_jsx(_components.a,{href:`/docs/en/time-operators`,children:`Tags: Time Operators`}),` for details.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`advanced-journey-steps`,children:`Advanced Journey steps`}),`\n`,_jsx(_components.p,{children:`Case 2 follows the same overall timing as Case 1, but adds a VIP branch at launch, a wishlist branch right after, and a buyer-suppression filter on every urgency message.`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Email + In-App Message: Pre-sale excitement (2 days before)`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Build anticipation a few days before the sale.`]}),_jsxs(_components.p,{children:[`Add an `,_jsx(_components.strong,{children:`Email`}),` node as the first step, then an `,_jsx(_components.strong,{children:`In-App Message`}),` node immediately after.`]}),_jsx(_components.p,{children:`The email lands when the user enters the Journey. The IAM is queued and displays the next time they open your app.`})]}),_jsxs(Step,{title:`Wait: 1 day`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Advance to the day before the sale.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Wait`}),` node set to `,_jsx(_components.strong,{children:`1 day`}),`.`]})]}),_jsxs(Step,{title:`Push Notification: Sale starts tomorrow (day before)`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Reminder the day before.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Push Notification`}),` node.`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Title`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Tomorrow only. 40% off sitewide.`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Body`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Your Black Friday sale starts at midnight tonight. Don't miss it.`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Launch URL`})}),_jsx(_components.td,{children:`Your sale landing page`})]})]})]})]}),_jsxs(Step,{title:`Wait: 1 day`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Advance to sale day.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Wait`}),` node set to `,_jsx(_components.strong,{children:`1 day`}),`.`]})]}),_jsxs(Step,{title:`Branch: VIP / General split (sale launch)`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Give VIPs a 1-hour head start.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Yes/No Branch`}),` node:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Condition:`}),` `,_jsx(_components.strong,{children:`User Tag`}),` `,_jsx(_components.code,{children:`vip_customer`}),` · operator `,_jsx(_components.strong,{children:`is`}),` · value `,_jsx(_components.code,{children:`true`})]}),`\n`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Yes branch (VIP):`}),` Add a `,_jsx(_components.strong,{children:`Push Notification`}),` node immediately:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Title`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`You're in early, {{first_name}} 🎉`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Body`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`VIP early access is live. 40% off everything, shop before everyone else.`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Launch URL`})}),_jsx(_components.td,{children:`Your sale page`})]})]})]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`No branch (general):`}),` Add a `,_jsx(_components.strong,{children:`Wait`}),` node set to `,_jsx(_components.strong,{children:`1 hour`}),`, then a `,_jsx(_components.strong,{children:`Push Notification`}),` node:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Title`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Black Friday is LIVE 🛍️`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Body`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`40% off sitewide, ends tonight at midnight. Shop now.`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Launch URL`})}),_jsx(_components.td,{children:`Your sale page`})]})]})]})]}),_jsxs(Step,{title:`Email + In-App Message: Sale is live`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Announce the sale to everyone.`]}),_jsxs(_components.p,{children:[`Connect both branches into the same next node. Add an `,_jsx(_components.strong,{children:`Email`}),` node, then an `,_jsx(_components.strong,{children:`In-App Message`}),` node. The email announces the sale is live and the IAM displays a sale banner when users open the app.`]})]}),_jsxs(Step,{title:`Branch: Wishlist personalization`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Send a personalized push to wishlist users.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Yes/No Branch`}),` node:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Condition:`}),` `,_jsx(_components.strong,{children:`User Tag`}),` `,_jsx(_components.code,{children:`wishlist_count`}),` · operator `,_jsx(_components.strong,{children:`greater than`}),` · value `,_jsx(_components.code,{children:`0`})]}),`\n`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Yes branch (wishlist users):`}),` Add a `,_jsx(_components.strong,{children:`Push Notification`}),` node:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Title`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Your saved items are 40% off`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Body`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`You have {{user.tags.wishlist_count}} items on your wishlist. They're all on sale right now.`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Launch URL`})}),_jsx(_components.td,{children:`Your wishlist page`})]})]})]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`No branch (no wishlist):`}),` Continue with no message.`]}),_jsx(_components.p,{children:`Connect both branches into the next step.`})]}),_jsxs(Step,{title:`Wait: a few hours`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Give users time before the mid-sale nudge.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Wait`}),` node set to `,_jsx(_components.strong,{children:`3–4 hours`}),`.`]})]}),_jsxs(Step,{title:`Branch + Push: Mid-sale nudge (buyer suppression)`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Nudge non-buyers only.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Yes/No Branch`}),` node. Match `,_jsx(_components.strong,{children:`any`}),` of these filters:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`User Tag`}),` `,_jsx(_components.code,{children:`last_purchase_date`}),` · operator `,_jsx(_components.strong,{children:`time elapsed greater than`}),` · value `,_jsx(_components.code,{children:`4 hours`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`User Tag`}),` `,_jsx(_components.code,{children:`last_purchase_date`}),` · operator `,_jsx(_components.strong,{children:`does not exist`})]}),`\n`]}),_jsxs(_components.p,{children:[`Adjust the `,_jsx(_components.code,{children:`4 hours`}),` value based on how long after sale launch this step fires in your Journey.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Yes branch (non-buyers):`}),` Add a `,_jsx(_components.strong,{children:`Push Notification`}),` node:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Title`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Still going, 40% off ends tonight`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Body`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`The Black Friday sale is still live. Don't leave your items behind.`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Launch URL`})}),_jsx(_components.td,{children:`Your sale page`})]})]})]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`No branch (buyers):`}),` Skip the push, route directly to the next step.`]})]}),_jsx(Step,{title:`Wait: until halfway through sale`,children:_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Wait`}),` node to reach the halfway point.`]})}),_jsxs(Step,{title:`Branch + Email: Final reminder (buyer suppression)`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Email non-buyers only.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Yes/No Branch`}),` node. Match `,_jsx(_components.strong,{children:`any`}),` of these filters:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`User Tag`}),` `,_jsx(_components.code,{children:`last_purchase_date`}),` · operator `,_jsx(_components.strong,{children:`time elapsed greater than`}),` · value `,_jsx(_components.code,{children:`12 hours`}),` (halfway through a 24-hour sale)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`User Tag`}),` `,_jsx(_components.code,{children:`last_purchase_date`}),` · operator `,_jsx(_components.strong,{children:`does not exist`})]}),`\n`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Yes branch (non-buyers):`}),` Add an `,_jsx(_components.strong,{children:`Email`}),` node with urgency messaging.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`No branch (buyers):`}),` Skip the email.`]})]}),_jsx(Step,{title:`Wait: until 2 hours before end`,children:_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Wait`}),` node to reach the final urgency window.`]})}),_jsxs(Step,{title:`Branch + Push: Last chance (buyer suppression)`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal:`}),` Final push to non-buyers only.`]}),_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Yes/No Branch`}),` node. Match `,_jsx(_components.strong,{children:`any`}),` of these filters:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`User Tag`}),` `,_jsx(_components.code,{children:`last_purchase_date`}),` · operator `,_jsx(_components.strong,{children:`time elapsed greater than`}),` · value `,_jsx(_components.code,{children:`22 hours`}),` (two hours before a midnight close)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`User Tag`}),` `,_jsx(_components.code,{children:`last_purchase_date`}),` · operator `,_jsx(_components.strong,{children:`does not exist`})]}),`\n`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Yes branch (non-buyers):`}),` Add a `,_jsx(_components.strong,{children:`Push Notification`}),` node:`]}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Title`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`2 hours left, last chance`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Body`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`The Black Friday sale closes at midnight. This is your last chance.`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Launch URL`})}),_jsx(_components.td,{children:`Your sale page or cart`})]})]})]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`No branch (buyers):`}),` End of Journey.`]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`last_purchase_date`}),` filter only suppresses buyers if your backend updates the tag in `,_jsx(_components.strong,{children:`near-real-time`}),`. If your stack updates the tag nightly, buyers in the early hours of the sale will still receive urgency messages later that day. Verify the sync cadence before launch.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`best-practices-for-case-2`,children:`Best practices for Case 2`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Apply buyer suppression to every urgency message.`}),` Without it, users who bought early still receive “last chance” pushes, which is the most common cause of unsubscribes after a flash sale.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Verify tag freshness`}),` before launch by simulating a purchase and confirming the `,_jsx(_components.code,{children:`last_purchase_date`}),` tag updates within minutes.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`All Case 1 best practices still apply.`}),` Quiet hours, deep linking, and pausing the Journey if the sale ends early.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Be aware of message volume.`}),` A VIP wishlist user who never buys can receive up to 4 pushes and 3 emails across the full sequence. Make sure that volume feels appropriate for your audience before launch.`]}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`compare-case-1-and-case-2`,children:`Compare Case 1 and Case 2`}),`\n`,_jsx(_components.p,{children:`Both cases share the same entry segment, Journey settings, and templates. Case 2 adds targeting.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{children:`Case 1: Basic`}),_jsx(_components.th,{children:`Case 2: Advanced`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Data required`})}),_jsx(_components.td,{children:`None`}),_jsxs(_components.td,{children:[`Tags: `,_jsx(_components.code,{children:`vip_customer`}),`, `,_jsx(_components.code,{children:`wishlist_count`}),`, `,_jsx(_components.code,{children:`last_purchase_date`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Setup effort`})}),_jsx(_components.td,{children:`Low, no tag infrastructure needed`}),_jsx(_components.td,{children:`Medium, requires backend tag sync`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`VIP early access`})}),_jsx(_components.td,{children:`No, everyone gets sale launch at same time`}),_jsx(_components.td,{children:`Yes, VIPs get 1-hour head start`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Wishlist personalization`})}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`Yes, “your saved items are on sale” push`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Buyer suppression`})}),_jsx(_components.td,{children:`No, everyone gets urgency messages`}),_jsxs(_components.td,{children:[`Yes, filter out buyers via `,_jsx(_components.code,{children:`last_purchase_date`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Best for`})}),_jsx(_components.td,{children:`First flash sale, no tag infrastructure`}),_jsx(_components.td,{children:`Teams with existing tags, better UX`})]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`where-to-go-from-here`,children:`Where to go from here`}),`\n`,_jsx(_components.p,{children:`Start with Case 1 if you’re running your first flash sale or don’t have tag infrastructure in place. As you add tags to your data layer, upgrade to Case 2 by adding the VIP branch, wishlist branch, and buyer-suppression filters. The VIP early access alone is worth the effort: it rewards your best customers and creates social proof when they share their finds.`}),`\n`,_jsxs(_components.p,{children:[`After this Journey is live, consider adding SMS for the final urgency push (see `,_jsx(_components.a,{href:`/docs/en/sms-messaging`,children:`SMS messaging`}),`) or extending the pattern to other time-limited promotions like summer sales, anniversary events, or new product launches.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`related-pages`,children:`Related pages`}),`\n`,_jsxs(Columns,{cols:2,children:[_jsx(Card,{title:`Journeys overview`,icon:`route`,href:`/docs/en/journeys-overview`,children:_jsx(_components.p,{children:`Learn how to build, branch, and manage automated message flows.`})}),_jsx(Card,{title:`Message personalization`,icon:`user`,href:`/docs/en/message-personalization`,children:_jsx(_components.p,{children:`Use Liquid tags to personalize message copy with user data.`})}),_jsx(Card,{title:`Segments`,icon:`filter`,href:`/docs/en/segmentation`,children:_jsx(_components.p,{children:`Build reusable audiences based on tags, behavior, and more.`})}),_jsx(Card,{title:`In-app messages`,icon:`mobile`,href:`/docs/en/in-app-messages-setup`,children:_jsx(_components.p,{children:`Create banners and modals to reach users inside your app.`})}),_jsx(Card,{title:`Email setup`,icon:`envelope`,href:`/docs/en/email-setup`,children:_jsx(_components.p,{children:`Configure email messaging for your campaigns.`})}),_jsx(Card,{title:`Tags`,icon:`tag`,href:`/docs/en/add-user-data-tags`,children:_jsx(_components.p,{children:`Add custom data to user profiles for targeting and personalization.`})})]})]})}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":"Flash sale Journey","description":"Build an automated flash sale campaign that drives conversions during a time-limited promotion, from a simple time-based flow to a fully personalized Journey with VIP early access and buyer suppression.","keywords":["flash sale","journeys","push notifications","black friday","time-limited promotion"],"href":"/docs/en/flash-sale"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"At a glance","slug":"at-a-glance","depth":2,"children":[]},{"title":"Campaign goals","slug":"campaign-goals","depth":2,"children":[]},{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Segments","slug":"segments","depth":2,"children":[]},{"title":"Templates","slug":"templates","depth":2,"children":[]},{"title":"Journey configuration","slug":"journey-configuration","depth":2,"children":[{"title":"Journey settings","slug":"journey-settings","depth":3,"children":[]}]},{"title":"Case 1: Basic time-based Journey","slug":"case-1-basic-time-based-journey","depth":2,"children":[{"title":"Journey timing","slug":"journey-timing","depth":3,"children":[]},{"title":"Basic Journey steps","slug":"basic-journey-steps","depth":3,"children":[]},{"title":"Best practices for Case 1","slug":"best-practices-for-case-1","depth":3,"children":[]}]},{"title":"Case 2: Advanced tag-based Journey","slug":"case-2-advanced-tag-based-journey","depth":2,"children":[{"title":"Required tags","slug":"required-tags","depth":3,"children":[]},{"title":"Advanced Journey steps","slug":"advanced-journey-steps","depth":3,"children":[]},{"title":"Best practices for Case 2","slug":"best-practices-for-case-2","depth":3,"children":[]}]},{"title":"Compare Case 1 and Case 2","slug":"compare-case-1-and-case-2","depth":2,"children":[]},{"title":"Where to go from here","slug":"where-to-go-from-here","depth":2,"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":"Flash sale Journey - OneSignal","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/docs/en/flash-sale","matchLevel":0},"cn":{"href":"/docs/cn/home","matchLevel":4},"ko":{"href":"/docs/ko/home","matchLevel":4},"ja":{"href":"/docs/ja/home","matchLevel":4},"tr":{"href":"/docs/tr/home","matchLevel":4},"pt-BR":{"href":"/docs/pt-BR/home","matchLevel":4},"es":{"href":"/docs/es/home","matchLevel":4},"fr":{"href":"/docs/fr/home","matchLevel":4}}},"lastModified":"2026-06-03T23:13:59.777Z","originalFileLocation":"docs/en/flash-sale.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=\"Build an automated flash sale campaign that drives conversions during a time-limited promotion, from a simple time-based flow to a fully personalized Journey with VIP early access and buyer suppression.\">\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=\"Flash sale Journey - OneSignal\">\u003cmeta data-mint-head property=\"og:description\" content=\"Build an automated flash sale campaign that drives conversions during a time-limited promotion, from a simple time-based flow to a fully personalized Journey with VIP early access and buyer suppression.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"OneSignal\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://documentation.onesignal.com/docs/en/flash-sale\">\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=Engage+and+convert\u0026amp;title=Flash+sale+Journey\u0026amp;description=Build+an+automated+flash+sale+campaign+that+drives+conversions+during+a+time-limited+promotion%2C+from+a+simple+time-based+flow+to+a+fully+personalized+Journey+wi\u0026amp;theme=8d648f04f85028b307bd669b\u0026amp;signature=7f63a6bf976d618a3bc4f89c99122bc62f591d2ee3a9c7cd0266006e5e342eed\">\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=\"Flash sale Journey - OneSignal\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Build an automated flash sale campaign that drives conversions during a time-limited promotion, from a simple time-based flow to a fully personalized Journey with VIP early access and buyer suppression.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://onesignal.mintlify.app/_mintlify/api/og/v2?division=Engage+and+convert\u0026amp;title=Flash+sale+Journey\u0026amp;description=Build+an+automated+flash+sale+campaign+that+drives+conversions+during+a+time-limited+promotion%2C+from+a+simple+time-based+flow+to+a+fully+personalized+Journey+wi\u0026amp;theme=8d648f04f85028b307bd669b\u0026amp;signature=7f63a6bf976d618a3bc4f89c99122bc62f591d2ee3a9c7cd0266006e5e342eed\">\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/flash-sale\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/en/flash-sale.md\">\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/flash-sale#webpage\",\"url\":\"https://documentation.onesignal.com/docs/en/flash-sale\",\"name\":\"Flash sale Journey\",\"description\":\"Build an automated flash sale campaign that drives conversions during a time-limited promotion, from a simple time-based flow to a fully personalized Journey with VIP early access and buyer suppression.\",\"dateModified\":\"2026-06-03T23:13:59.777Z\",\"isPartOf\":{\"@id\":\"https://documentation.onesignal.com#website\"},\"breadcrumb\":{\"@id\":\"https://documentation.onesignal.com/docs/en/flash-sale#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://documentation.onesignal.com/docs/en/flash-sale#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Engage and convert\",\"item\":\"https://documentation.onesignal.com/docs/en/event-driven-journeys\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flash sale Journey\",\"item\":\"https://documentation.onesignal.com/docs/en/flash-sale\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://documentation.onesignal.com/docs/en/flash-sale#article\",\"headline\":\"Flash sale Journey\",\"name\":\"Flash sale Journey\",\"description\":\"Build an automated flash sale campaign that drives conversions during a time-limited promotion, from a simple time-based flow to a fully personalized Journey with VIP early access and buyer suppression.\",\"url\":\"https://documentation.onesignal.com/docs/en/flash-sale\",\"mainEntityOfPage\":{\"@id\":\"https://documentation.onesignal.com/docs/en/flash-sale#webpage\"},\"dateModified\":\"2026-06-03T23:13:59.777Z\",\"keywords\":\"flash sale, journeys, push notifications, black friday, time-limited promotion\",\"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","pages":[{"title":"User Guides","href":"/docs/en/quickstart-guide"}]},{"tab":"Developer Guides","pages":[{"title":"Developer Guides","href":"/docs/en/developers"}]},{"tab":"Tutorials","groups":[{"group":"Tutorials","pages":[{"title":"Tutorials \u0026 use cases","href":"/docs/en/tutorials"}]},{"group":"Industry strategies","pages":[{"title":"Mobile-first strategies","href":"/docs/en/mobile-first"},{"title":"Gaming strategies","href":"/docs/en/gaming-industry"},{"title":"Ecommerce strategies","href":"/docs/en/ecommerce-strategies"},{"title":"News and media strategies","href":"/docs/en/news-and-media-industry"},{"title":"Financial and fintech strategies","href":"/docs/en/financial-fintech-industry"}]},{"group":"Onboard new users","pages":[{"title":"Mobile-first lifecycle Journeys","href":"/docs/en/mobile-first-journeys"},{"title":"Welcome Journey: Mobile gaming","href":"/docs/en/welcome-journey-mobile-gaming"},{"title":"Category onboarding for news and media","href":"/docs/en/welcome-journey-news-media"},{"title":"Build a button-driven onboarding carousel","href":"/docs/en/in-app-onboarding-carousel-tutorial"},{"title":"Request location permissions with in-app messages","href":"/docs/en/location-opt-in-prompt"},{"title":"Onboard users with banner in-app messages","href":"/docs/en/example-create-a-tutorial"}]},{"group":"Engage and convert","pages":[{"title":"Event-driven Journeys","href":"/docs/en/event-driven-journeys"},{"title":"Abandoned cart tutorial","href":"/docs/en/abandoned-cart"},{"title":"Loyalty Journey","description":"Build automated loyalty messaging that keeps customers informed about their points balance, notifies them when rewards unlock and drives repeat purchases with measurable ROI.","href":"/docs/en/loyalty-journey"},{"title":"Flash sale Journey","href":"/docs/en/flash-sale"},{"title":"Back-in-stock alerts","description":"Send restock alerts via push, email, or SMS to users who opted in. Use SKU-keyed tags with the Create Message API or Custom Events with a Journey.","href":"/docs/en/back-in-stock-alerts"},{"title":"Location-based messages","href":"/docs/en/location-triggered-event"},{"title":"iOS: Image Carousel Push Notifications","href":"/docs/en/ios-image-carousel-push-notifications"},{"title":"Social activity","href":"/docs/en/social-activity"},{"title":"Create activity feed","href":"/docs/en/create-an-activity-feed"},{"title":"Create a survey to ask for feedback","href":"/docs/en/example-create-a-survey"}]},{"group":"Retain and re-engage","pages":[{"title":"Paid plan subscription renewal \u0026 expiry Journey","href":"/docs/en/paid-plan-renewal-expiry"},{"title":"Daily streak journey","href":"/docs/en/daily-streak"},{"title":"Get more app store reviews","href":"/docs/en/example-app-store-review"},{"title":"Target outdated app versions to encourage app updates","sidebarTitle":"App version update prompts","href":"/docs/en/app-version-update"},{"title":"Fallback messages: Ensuring delivery across channels","href":"/docs/en/push-fallback-method"}]},{"group":"Operational","pages":[{"title":"Transactional messages","href":"/docs/en/transactional-messages"},{"title":"Set up confirmed opt-in for email","href":"/docs/en/double-opt-in-email"},{"title":"Preference center","href":"/docs/en/preference-center"},{"title":"Booking confirmations","href":"/docs/en/booking-confirmations"},{"title":"Send verification, magic link, OTP, and double opt-in messages","href":"/docs/en/example-verification-magic-link-otp"},{"title":"Track topic interest for smarter targeting","href":"/docs/en/auto-segment-users-by-page-visit"},{"title":"Target certain Android manufacturers and devices","href":"/docs/en/example-target-certain-android-manufacturers-and-devices"}]}]},{"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/home"}]},{"language":"ko","pages":[{"title":"ko","href":"/docs/ko/home"}]},{"language":"ja","pages":[{"title":"ja","href":"/docs/ja/home"}]},{"language":"tr","pages":[{"title":"tr","href":"/docs/tr/home"}]},{"language":"pt-BR","pages":[{"title":"pt-BR","href":"/docs/pt-BR/home"}]},{"language":"es","pages":[{"title":"es","href":"/docs/es/home"}]},{"language":"fr","pages":[{"title":"fr","href":"/docs/fr/home"}]}]},"basePath":"","title":"Flash sale Journey - OneSignal","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":[],"chunks":[]}