Daily streaks are one of the most effective retention mechanics in mobile and web apps. By reminding users to return each day, you can build habits, increase engagement, and reduce churn.This tutorial walks through three Journey configurations:
Goal: Send multiple daily push notifications throughout the day to users who haven’t opened the app today, reminding them to keep their streak alive. When the user opens the app, they exit the Journey. The next day, the cycle repeats.This approach uses user session activity only to trigger and manage the journey - no tags or custom events required. Users move through the journey using time window nodes, ensuring that your push notifications are sent at specific times of day.
In order to check if the user was active before the first time window.
If your first time window is not set to start at 8am in the user’s timezone, change the settings of the Active in last X hours segment to a suitable time (e.g. for a 10am time window, the segment should check for users that were active in the last 10 hours)
Exit when user becomes active in your app/website. & Tag users when they exit early: streak_ongoing: true
Re-entry rules
Yes, after a certain amount of time: 10 minutes
Schedule
Start immediately, never stops
Setting re-entry to 10 minutes ensures users re-enter the Journey as soon as possible. This is important to ensure that all eligible users are in the journey at the start of the new day.
Begin by setting a Time Window node to your preferred delivery hours for the first reminder push, for example 8:00 AM – 8:15 AM every day. Enable Use user’s time zone so messages arrive at a reasonable local time.
Time Window
Users who enter the journey after this window will wait until the next day before receiving the first push notification (this will only affect new sign-ups who have had their first ever session after 8am).
2
Check for activity before first Time Window - Add a Yes/No branch
Before we send any messages, we need to check if the user was active in the last 8 hours, in case they joined the journey after 0:00am.
Yes/No branch
The Yes/No branch will check membership of this segment and if the user has been active in the last 8 hours, then they skip all of the messaging steps of the journey (following the yes branch).
If you have selected a different time for your first check, then you will need to adjust this segment’s name and filters accordingly to check if the user’s last session was between this time window and 00:00am
3
Add a Yes/No branch
On the “No” branch of the previous Yes/No check, we want to ensure that we send appropriate messaging to our users. Here we want to branch based on whether the user has a streak ongoing or not. To do this, we need a segment of users who already have the streak_ongoing: true tag that is set when a user exits this journey early:
Yes/No branch
The Yes/No branch will check membership of this segment and send different push notifications depending on whether the user is in the streak or not.
4
First push notifications
Create two different push templates which remind the user to return to the app. One should mention continuing a streak, the other should mention starting a streak. Add the continuing template to the “Yes” branch, and the starting template to the “No” branch.
Push notifications
5
Repeat the above steps.
After the branches converge, repeat the above steps - Time Window → Yes/No branch → Push notifications - as many times as you think necessary, changing the time window appropriately each time.
Think about your users’ daily routines: Set the time windows for times of the day when your users might be active on their device (e.g. during their commute, at lunch time, after dinner time). Always avoid times when users are likely to be asleep.
Don’t be repetitive: Make sure that you use a different push template each time you repeat the steps - users will quickly get frustrated with seeing the same notification repeatedly throughout the day.
6
Add a final time window
Add a time window for 12:00 AM to 12:15 AM. This signifies the start of a new day and the end of the streak.
Final time window
7
Update the "streak_ongoing" tag
If the user has made it this far through the messaging branch of the journey without exiting early, it means that they have failed their streak. We need to update the streak_ongoing tag to false with a “Tag” node, both for tracking purposes and also so that when they rejoin the journey, they are sent the appropriate push notifications.Similarly, on the “Yes” branch of our first Yes/No node (from step 2), we need to update the streak_ongoing tag to true, as the user completed their streak before our first Time Window check:
Update the 'streak_ongoing' tag
That’s it - set the Journey live. Each day users will enter the journey and be sent one of two sets of push notifications (depending on whether they are continuing or starting a streak) reminding them to log in to maintain/build their streak.
Goal: Guide users through a 7-day streak challenge. This can be a one-off, one-shot streak (ideal for time-limited events), or a repeatable streak that users can reattempt (for weekly streaks).This approach uses user activity only to trigger and manage the journey - no tags or custom events required.
Include: Total Users segment. (Optional: Exclude 7 day streak completed to make it so that users can only complete the streak once, and 7 day streak failed to make it so that a user can only attempt the streak once)
Exit rules
Exit when user enters a segment: 7 day streak failed (Optional : Tag users when they exit early: 7_day_streak: 0 - removes users from 7 day streak failed segment and allows them to re-enter the journey after failing)
Re-entry rules
Yes, after a certain amount of time: 10 minutes (if repeating) OR No, they can receive this only once (for single attempts)
Schedule
Start immediately, never stops
The above journey settings are a guide only. If you want to change your target audience or allow users to repeat the journey, simply adjust the settings accordingly. Only the Exit rules criteria laid out above are mandatory for this journey to function correctly.
Begin by setting a Time Window node to your preferred delivery hours for the first reminder push, for example 8:00 AM – 8:15 AM every day. Enable Use user’s time zone so messages arrive at a reasonable local time.
Journey settings and Time Window
Users who enter the journey after this window will wait until the next day before receiving the first push notification (this will only affect new sign-ups who have had their first ever session after 8am).
2
Check for activity before first Time Window - Add a Yes/No branch
Before we send any messages, we need to check if the user was active in the last 8 hours, in case they joined the journey after 0:00am.
Yes/No branch
The Yes/No branch will check membership of this segment and if the user has been active in the last 8 hours, then they skip all of the messaging steps for the first day (following the yes branch).
If you have selected a different time for your first check, then you will need to adjust this segment’s name and filters accordingly to check if the user’s last session was between this time window and 00:00am
3
First push notification
Send your Day 1, first push notification.
First push notification
4
Add another Time Window node
Add another time window node so that you can send a second reminder push for Day 1 (in this example at 12pm).
A second Time Window
5
Check for activity before Time Window - Add a Yes/No branch
Before we send the next message, we need to check if the user was active since the last message, and only send the next message if they were not.
Yes/No branch
The Yes/No branch will check membership of this segment and if the user has been active in the last X hours, then they skip all of the messaging steps for the rest of the day if so (following the yes branch).
6
Second push notification
Send your Day 1, second push notification.
Push notification
7
Repeat steps 4, 5 & 6 to send more notifications.
Add more time window and message nodes to send as many push notifications in this day as you like.
Time Window
8
Add another Time Window node for 12:00am
Add another time window node set to 12:00am to move to the next day.
Time Window
9
Check for activity before Time Window - Add a Yes/No branch
Before we move to the next day’s messages, we need to check if the user was active since the last message, and only continue the journey if they were.
Yes/No branch
The Yes/No branch will check membership of this segment. If the user has not been active in the last X hours, they have failed the journey.
10
Add a tag to eject the user from the journey.
Down the “No” branch of the above Yes/No check, we need to add a tag to eject the user from the journey as they have failed to continue their streak. Add the tag 7_day_streak with the value failed here. This will put the user into the “7 day streak failed” segment and automatically end the journey for them.
Optionally, you can also add a streak_failed_day tag here with the day number as the value in order to track what days your users failed their streaks.
Streak failed tag
11
Add a wait node on the original 'Yes' branch of this day.
On the “Yes” branch from the Yes/No node in step 2, add a wait node for 16 hours (or whatever the time difference between your first time window time and midnight of the next day). This ensures that the users on this branch are kept in line with users who have been receiving messages on the other branch.
Wait node
12
Add a tag to signify the streak day achieved.
For tracking and personalization purposes, you may want to update the value of your “7_day_streak” tag to the number of the day the user is on at this stage (this step is optional).
Update '7_day_streak' tag
13
Repeat for days 2-7.
After the Yes/No branches from step 2 converge, repeat steps 2-12 for each day. Make sure that you vary your messaging each day to reflect the user’s progress through the streak.
You can use message personalisation if you want to reuse your message templates each day. Simply use liquid syntax and the 7_day_streak tag that was updated in step 12 to remind users how big their streak is so far.
14
Add a final data tag
For tracking purposes, and to prevent users from re-entering if you want to only allow them to finish the streak once, just before the exit node as the final step of your journey, update the 7_day_streak to completed.If you have been setting the streak_failed_day tag as well, update this to a blank value to delete the tag.
Update '7_day_streak' tag
15
Optional: Send a 'Congratulations' push notification
At this point you may want to congratulate your users via a push notification for completing your 7 day streak before exiting the journey.
That’s it - set the Journey live. Your users will enter the journey on day 1 and will progress until they either complete their entire streak or until they have been inactive for a full calendar day. If they are inactive for a full day they will be ejected from the journey early, and depending on your journey settings, may re-enter the journey later.
1-day recurring streak with tags and custom events
Goal: Send escalating push reminders throughout the day, using a custom event (streak_continued) to detect when the user completes their daily action. As soon as the event fires, the user skips all remaining reminders for that day. If the user doesn’t act, they receive up to four reminders spaced 4 hours apart. The cycle resets the next day.This approach uses a custom event (streak_continued) to signal that a user has completed their daily streak action, and Wait Until nodes to listen for that event between reminders. Unlike the previous examples, this journey doesn’t rely on segment-based activity checks: instead, it reacts directly to an event fired by your app.
This journey focuses on sending reminders. Your app or backend should handle streak count tracking: incrementing the counter when the user completes their daily action, and resetting it when a day is missed. The journey uses a streak_counttag on the user profile to personalize messages with liquid syntax, so users who are continuing a streak see different copy than users who are starting fresh.
Send the custom event and update streak tags from your app
Each time a user completes their daily streak action (opening the app, finishing a lesson, logging a workout, etc.), send a streak_continued custom event to OneSignal and update the streak_count tag on the user profile:
Frontend SDK
REST API
// Fire the custom event to signal streak completionOneSignal.User.trackEvent("streak_continued");// Update the streak count tag (your app calculates the value)OneSignal.User.addTags({ streak_count: currentStreakCount.toString()});
When a user misses a day, your app should reset the streak_count tag to 0 (or remove it). This ensures the journey’s push templates always reflect the correct streak state.
Use liquid syntax in your push notification templates to show different copy depending on whether the user has an active streak or is starting fresh. This keeps the journey structure simple: a single push node handles both cases.Example push template:
Field
Value
Title
{% if streak_count and streak_count != "0" %}Keep your streak alive!{% else %}Start a streak today!{% endif %}
Message
{% if streak_count and streak_count != "0" %}You're on a {{streak_count}}-day streak. Don't let it end!{% else %}Open the app to start building your streak.{% endif %}
Launch URL
https://yourapp.com/streak
Create a separate template for each time slot (8am, 12pm, 4pm, 8pm) so you can vary the tone throughout the day. For example, the morning template can be encouraging while the evening template adds gentle urgency, but each template should include the liquid conditional so it adapts to both streak states.
Alternative approach: If you prefer to manage “continue” and “start” messages as separate templates rather than using liquid syntax, you can add a Yes/No branch before each push node. Branch on segment membership (e.g., a segment where streak_count is greater than 0) and route each path to a different template. This gives you more visual control in the journey builder but adds extra nodes to the canvas.
Include: Total Users (or your preferred audience segment)
Exit rules
They moved through the entire journey
Re-entry rules
Yes, after a certain amount of time: 10 minutes
Schedule
Start immediately, never stops
Journey entry rules
Re-entry rules set to 10 minutes
Setting re-entry to 10 minutes ensures users re-enter the journey as soon as possible after exiting. Combined with the Time Window as the first step, users will wait at the time window until the next morning before starting a new cycle.
The journey uses Wait Until nodes to listen for the streak_continued custom event between each reminder. If the event fires at any point, the user follows the A branch and skips all remaining reminders for the day. If the event doesn’t fire before the expiration, the user receives a push notification and moves to the next Wait Until node.
1
Add a Time Window node
Begin by setting a Time Window node that starts slightly before your first desired reminder time, for example 7:00 AM – 7:15 AM every day. Enable Use user’s time zone so the cycle starts at a reasonable local time.
Time Window
Users who enter the journey after this window will wait until the next day before the reminder cycle begins. The window starts at 7:00 AM to give the first Wait Until node time to expire before the 8am reminder.
2
Add a Wait Until node (1-hour expiration)
Add a Wait Until node with the condition: Custom Event streak_continued occurs. Set the expiration to 1 hour.
A branch (event fires): The user already completed their daily action early in the morning, so they skip all reminders and proceed directly to the exit.
Expire branch (1 hour, no event): The user hasn’t acted yet. Continue to the first push reminder.
The 1-hour expiration covers the gap between the Time Window (7:00 AM) and the first reminder (~8:00 AM). This gives users who are already active a chance to trigger the event before any push is sent.
Wait Until node with 1-hour expiration
3
Send the 8am Streak Reminder push
On the Expire branch, add a Push Notification node with your first personalized template (e.g., “8am Streak Reminder”). The liquid syntax in the template will automatically show “Keep your streak alive!” for users with an active streak, or “Start a streak today!” for users starting fresh.
8am Streak Reminder push notification
4
Add a second Wait Until node (4-hour expiration)
After the push notification, add another Wait Until node with the same condition: Custom Event streak_continued. This time, set the expiration to 4 hours.
A branch: User completed their action after the first reminder. Skip remaining reminders and proceed to the exit.
Expire branch: No action after 4 hours. Continue to the 12pm reminder.
5
Send the 12pm Streak Reminder push
On the Expire branch, add a Push Notification node for your midday reminder (e.g., “12pm Streak Reminder”). Use a different template from the 8am one, but include the same liquid conditional so it adapts to the user’s streak state.
12pm Streak Reminder push notification
6
Continue the pattern for afternoon and evening reminders
Repeat the Wait Until (4 hours) → Push Notification pattern for each additional reminder you want to send. In this example:
Wait Until (4 hours) → 4pm Streak Reminder push
Wait Until (4 hours) → 8pm Streak Reminder push
At each Wait Until node, the streak_continued event can fire to skip all remaining reminders and jump straight to the exit.
Don’t be repetitive: Use a different push template for each time slot. Vary the tone and messaging. Morning reminders can be encouraging, while evening reminders can add gentle urgency. Users will tune out identical repeated notifications.
7
Converge all branches to the Exit node
All A branches (from each Wait Until node where the streak_continued event fired) and the final push notification branch should converge at the end of the journey, leading to the Exit node.
Exit node
The user exits and re-enters after 10 minutes. Since the Time Window is the first step, they’ll wait there until 7:00 AM the next morning before starting a new reminder cycle.
Wait Until condition met → user follows A branch, skips 4pm and 8pm reminders
-
-
User exits journey → re-enters after 10 min → waits at Time Window for next 7:00 AM
If the user never acts, they receive all four reminders (8am, 12pm, 4pm, 8pm), then exit and re-enter the cycle the next day.
The first Wait Until uses a 1-hour expiration while all subsequent ones use 4 hours. This is because the Time Window starts at 7:00 AM, so the short first expiration ensures the 8am reminder fires on time. Adjust these values if you change your Time Window start time.
That’s it. Set the Journey live. Each day, users will be prompted up to four times to complete their daily action, with messaging that automatically adapts based on their streak status. As soon as the streak_continued event fires, all remaining reminders are skipped for the day. The cycle resets the next morning at your configured Time Window.
Don’t over-message. Ensure that you send an appropriate amount of reminders, and use Time Window nodes to control when messages are sent and avoid interrupting users during off-hours.
Use different channels where appropriate. If your users are subscribed to multiple channels, try experimenting with SMS and Email messages as part of your flow to see if streak retention increases. Note that in-app messages are not appropriate for streak reminders, as the user has to be in the app to see them, and in-app messages in journeys can only be shown to a user once, even if they re-enter the journey.
Combine with outcomes. Track streak completions as Custom Outcomes to measure the impact of your streak Journeys on retention and engagement.
Test your timing. Experiment with different delivery windows and message frequencies. Use Split Branch nodes to A/B test.
Reset streaks gracefully. When a streak breaks, consider sending an encouraging “start a new streak” message rather than a punitive one.
Can I track the actual streak count without tags or custom events?
Not directly. OneSignal’s Last Session filter tells you when a user was last active but does not count consecutive days. For streak counting, use tags or custom events as shown in the third example.
What happens if a user has multiple subscriptions?
Segment checks evaluate all of a user’s subscriptions. If a user has both a mobile and web subscription, activity on either device updates their last session time. Assign External IDs to unify subscriptions under a single user profile.
Yes. At the end of a streak Journey, use a Tag User action to mark the user (for example, streak_7day_complete: true). Your app can read this tag to unlock rewards, badges, or other incentives. You can also use a Journey webhook to notify your backend when a user completes the streak.
How do I prevent users from getting multiple streak reminders in one day?
The combination of re-entry rules and Time Window nodes handles this. Set re-entry to at least 12 hours and use a single daily time window. This ensures each user receives at most one reminder per day.
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/daily-streak","slug":"/docs/en/daily-streak","pageMetadata":{"title":"Daily streak journey","description":"Use Journeys to build daily streak reminders that keep users coming back, using last session time or tags and custom events.","keywords":["daily streak","streak","journey","retention","reminders","habit","repeat","daily"],"href":"/docs/en/daily-streak"},"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: \"Use Journeys to build daily streak reminders that keep users coming back, using last session time or tags and custom events.\"\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`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Check,CodeBlock,Frame,Heading,Note,OptimizedImage,Step,Steps,Tab,Table,Tabs,Tip,Warning}=_components;if(!Check)_missingMdxReference(`Check`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`overview`,children:`Overview`}),`\n`,_jsx(_components.p,{children:`Daily streaks are one of the most effective retention mechanics in mobile and web apps. By reminding users to return each day, you can build habits, increase engagement, and reduce churn.`}),`\n`,_jsx(_components.p,{children:`This tutorial walks through three Journey configurations:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.a,{href:`#1-day-recurring-streak-reminder`,children:`1-day recurring streak reminder (last session time)`})}),`: A simple daily nudge for users who haven’t opened the app yet today.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.a,{href:`#7-day-streak-journey`,children:`7-day streak Journey (last session time)`})}),`: A guided 7-day challenge that checks daily activity and rewards users who complete the full streak.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.a,{href:`#1-day-recurring-streak-with-tags-and-custom-events`,children:`1-day recurring streak with tags and custom events`})}),`: A tag-based approach that tracks streak count and sends personalized reminders based on progress.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsx(_components.p,{children:`Before starting, make sure you have:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A OneSignal app with `,_jsx(_components.a,{href:`/docs/en/channel-setup`,children:`push notifications`}),` configured`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/en/users`,children:`External IDs`}),` assigned to your users (recommended for cross-channel accuracy)`]}),`\n`,_jsxs(_components.li,{children:[`Familiarity with `,_jsx(_components.a,{href:`/docs/en/journeys-overview`,children:`Journeys`}),`, `,_jsx(_components.a,{href:`/docs/en/segmentation`,children:`Segments`}),`, and `,_jsx(_components.a,{href:`/docs/en/journeys-actions`,children:`Journey actions`})]}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`1-day-recurring-streak-reminder`,children:`1-day recurring streak reminder`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal`}),`: Send multiple daily push notifications throughout the day to users who haven’t opened the app today, reminding them to keep their streak alive. When the user opens the app, they exit the Journey. The next day, the cycle repeats.`]}),`\n`,_jsx(_components.p,{children:`This approach uses user session activity only to trigger and manage the journey - no tags or custom events required. Users move through the journey using time window nodes, ensuring that your push notifications are sent at specific times of day.`}),`\n`,_jsx(Heading,{level:`4`,id:`segments-used`,children:`Segments used`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Segment`}),_jsx(_components.th,{children:`Filters`}),_jsx(_components.th,{children:`Notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Total Users`}),` (optional)`]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`No filters`})}),_jsx(_components.td,{children:`To include all users in the journey`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Active in last 8 hours`}),` (required)`]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Last session less than 8 hours ago`})}),_jsx(_components.td,{children:`In order to check if the user was active before the first time window.`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`If your first time window is not set to start at 8am in the user’s timezone, change the settings of the `,_jsx(_components.code,{children:`Active in last X hours`}),` segment to a suitable time (e.g. for a 10am time window, the segment should check for users that were active in the last 10 hours)`]})}),`\n`,_jsx(Heading,{level:`4`,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:`Configuration`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Entry rules`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Audience Segment`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Audience`})}),_jsxs(_components.td,{children:[`Include: `,_jsx(_components.code,{children:`Total Users`}),` segment`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Exit rules`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Exit when user becomes active in your app/website`}),`. \u0026 `,_jsx(_components.strong,{children:`Tag users when they exit early`}),`: `,_jsx(_components.code,{children:`streak_ongoing: true`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Re-entry rules`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Yes, after a certain amount of time`}),`: `,_jsx(_components.code,{children:`10 minutes`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Schedule`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Start immediately, never stops`})})]})]})]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Setting re-entry to 10 minutes ensures users re-enter the Journey as soon as possible. This is important to ensure that all eligible users are in the journey at the start of the new day.`})}),`\n`,_jsx(Heading,{level:`4`,id:`journey-steps`,children:`Journey steps`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Add a Time Window node`,children:[_jsxs(_components.p,{children:[`Begin by setting a Time Window node to your preferred delivery hours for the first reminder push, for example `,_jsx(_components.strong,{children:`8:00 AM – 8:15 AM`}),` every day. Enable `,_jsx(_components.strong,{children:`Use user’s time zone`}),` so messages arrive at a reasonable local time.`]}),_jsx(Frame,{caption:`Time Window`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=dab1da0aae9f74ccf943230d3e0a98c7`,alt:`A time window node for 8:00 AM – 8:15 AM every day`,\"data-og-width\":`450`,width:`450`,\"data-og-height\":`255`,height:`255`,\"data-path\":`images/docs/simple-streak-1.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=0fc4fe06245007a3ab82b84cb2ea5066 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=11cf5a2f13eadb9793aa3749682a6d77 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=b02b8ccd03c4f7502f69820e75329c4d 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e122cb341d6137cd66946c2058a0573b 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=ae76c7546a86b9b7b01ee912e0bf7ce8 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=b8339226e5a4d5353d4a68d0d2eed092 2500w`})}),_jsx(_components.p,{children:`Users who enter the journey after this window will wait until the next day before receiving the first push notification (this will only affect new sign-ups who have had their first ever session after 8am).`})]}),_jsxs(Step,{title:`Check for activity before first Time Window - Add a Yes/No branch`,children:[_jsx(_components.p,{children:`Before we send any messages, we need to check if the user was active in the last 8 hours, in case they joined the journey after 0:00am.`}),_jsx(Frame,{caption:`Yes/No branch`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1a.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=2f8255945aaa3c72ebfcde8cd13f532d`,alt:`A yes/no branch for a 'Active in last 8 hours' segment`,\"data-og-width\":`685`,width:`685`,\"data-og-height\":`321`,height:`321`,\"data-path\":`images/docs/simple-streak-1a.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1a.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=92ec5bacadfda233b0a88613fa682b7e 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1a.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=18c201ac5eb2b80cba8cfb8c46749a62 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1a.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=5b10850160eb234f44277aee7ad62b96 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1a.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=2d318525e6ebb360b902ee497905f400 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1a.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=7fd415e829253a38c17d753d71685398 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-1a.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=9e290d114838e0476f0263ab30a7fd22 2500w`})}),_jsxs(_components.p,{children:[`The Yes/No branch will check membership of this segment and if the user has been active in the last 8 hours, then they skip all of the messaging steps of the journey (following the yes branch).\n`,_jsx(Warning,{children:`If you have selected a different time for your first check, then you will need to adjust this segment’s name and filters accordingly to check if the user’s last session was between this time window and 00:00am`})]})]}),_jsxs(Step,{title:`Add a Yes/No branch`,children:[_jsxs(_components.p,{children:[`On the “No” branch of the previous Yes/No check, we want to ensure that we send appropriate messaging to our users. Here we want to branch based on whether the user has a streak ongoing or not. To do this, we need a segment of users who already have the `,_jsx(_components.code,{children:`streak_ongoing: true`}),` tag that is set when a user exits this journey early:`]}),_jsx(Frame,{caption:`Yes/No branch`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-2.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=316399a06d0d250e6233a081408bdcc0`,alt:`A yes/no branch for a 'Currently in streak' segment`,\"data-og-width\":`539`,width:`539`,\"data-og-height\":`207`,height:`207`,\"data-path\":`images/docs/simple-streak-2.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-2.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=6c5c2d47301cb906bef467ed8d666b6d 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-2.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e8f9d9ed70f34901f2d66c1e6965d9aa 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-2.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=3b2ee1e09f617aaa39953cbfaa097d31 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-2.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=ec382b4a654f55edf0db0a0852d4201e 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-2.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=44d26073d2a26e4521edf9d1ff71e491 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-2.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=d997bd3d85606b62f36cd2c4fe717001 2500w`})}),_jsx(_components.p,{children:`The Yes/No branch will check membership of this segment and send different push notifications depending on whether the user is in the streak or not.`})]}),_jsxs(Step,{title:`First push notifications`,children:[_jsx(_components.p,{children:`Create two different push templates which remind the user to return to the app. One should mention continuing a streak, the other should mention starting a streak. Add the continuing template to the “Yes” branch, and the starting template to the “No” branch.`}),_jsx(Frame,{caption:`Push notifications`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-3.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=d47bb46a0ce3f3484e0d7fa7736a2f74`,alt:`Two push notification nodes.`,\"data-og-width\":`770`,width:`770`,\"data-og-height\":`103`,height:`103`,\"data-path\":`images/docs/simple-streak-3.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-3.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=fe8c3e378bba620642721a3defd424f7 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-3.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=3a9511e5c99afea3e089d622ebca4b0b 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-3.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=59de196b6f7542de37d1dcc2156548e9 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-3.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=fa9eceebc4e56f96b99fd1186186b4d5 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-3.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=dfdc88d8bcd4232d9bc244768d45b396 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-3.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=59c82fc756ca4fbbc150f56d8d97f16d 2500w`})})]}),_jsx(Step,{title:`Repeat the above steps.`,children:_jsxs(_components.p,{children:[`After the branches converge, repeat the above steps - Time Window → Yes/No branch → Push notifications - as many times as you think necessary, changing the time window appropriately each time.\n`,_jsxs(Note,{children:[_jsx(_components.strong,{children:`Think about your users’ daily routines`}),`: Set the time windows for times of the day when your users might be active on their device (e.g. during their commute, at lunch time, after dinner time). Always avoid times when users are likely to be asleep.`]}),`\n`,_jsxs(Warning,{children:[_jsx(_components.strong,{children:`Don’t be repetitive`}),`: Make sure that you use a different push template each time you repeat the steps - users will quickly get frustrated with seeing the same notification repeatedly throughout the day.`]})]})}),_jsxs(Step,{title:`Add a final time window`,children:[_jsx(_components.p,{children:`Add a time window for 12:00 AM to 12:15 AM. This signifies the start of a new day and the end of the streak.`}),_jsx(Frame,{caption:`Final time window`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-4.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=0f366ce2d920c8088287eaee6c8d337d`,alt:`A time window node for 12:00 AM – 12:15 AM every day`,\"data-og-width\":`644`,width:`644`,\"data-og-height\":`498`,height:`498`,\"data-path\":`images/docs/simple-streak-4.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-4.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e869235ad5b0830dcd9f4b63bbd3055c 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-4.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=896e7bca308c6f473827114f55295e64 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-4.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=7811dc04493ef5fdf0afb81cce66eb49 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-4.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e08cdf2908761f35b2c24eb8f4fddbfd 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-4.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=ca919b9a52dadbfd11118fd502c56e16 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-4.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=edf522c35c60cb71d9e46e20b0264292 2500w`})})]}),_jsxs(Step,{title:`Update the \"streak_ongoing\" tag`,children:[_jsxs(_components.p,{children:[`If the user has made it this far through the messaging branch of the journey without exiting early, it means that they have failed their streak. We need to update the `,_jsx(_components.code,{children:`streak_ongoing`}),` tag to `,_jsx(_components.code,{children:`false`}),` with a “Tag” node, both for tracking purposes and also so that when they rejoin the journey, they are sent the appropriate push notifications.`]}),_jsxs(_components.p,{children:[`Similarly, on the “Yes” branch of our first Yes/No node (from step 2), we need to update the `,_jsx(_components.code,{children:`streak_ongoing`}),` tag to `,_jsx(_components.code,{children:`true`}),`, as the user completed their streak before our first Time Window check:`]}),_jsx(Frame,{caption:`Update the 'streak_ongoing' tag`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-5a.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=88691830515c9b40151bafe408b8ee04`,alt:`A tag node setting the 'streak_ongoing' tag on two branches.`,\"data-og-width\":`1077`,width:`1077`,\"data-og-height\":`249`,height:`249`,\"data-path\":`images/docs/simple-streak-5a.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-5a.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=564f1c86186f5754f037a0b5f2a91b4d 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-5a.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=be14959aff1fd52ec24b9f5b6d5251a3 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-5a.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=775b07c8d1345d7373a972421ffbed26 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-5a.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=31d5b4530fb136d3387baadeedcc7ce4 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-5a.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=0876c3bcbe2b95594d8d0a4366d78bd2 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/simple-streak-5a.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=6757add801e20e754870276e05dd2943 2500w`})})]})]}),`\n`,_jsx(Check,{children:_jsx(_components.p,{children:`That’s it - set the Journey live. Each day users will enter the journey and be sent one of two sets of push notifications (depending on whether they are continuing or starting a streak) reminding them to log in to maintain/build their streak.`})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`7-day-streak-journey`,children:`7-day streak Journey`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal`}),`: Guide users through a 7-day streak challenge. This can be a one-off, one-shot streak (ideal for time-limited events), or a repeatable streak that users can reattempt (for weekly streaks).`]}),`\n`,_jsx(_components.p,{children:`This approach uses user activity only to trigger and manage the journey - no tags or custom events required.`}),`\n`,_jsx(Heading,{level:`4`,id:`segments-used-2`,children:`Segments used`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Segment`}),_jsx(_components.th,{children:`Filters`}),_jsx(_components.th,{children:`Notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Total Users`}),` (optional)`]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`No filters`})}),_jsx(_components.td,{children:`To include all users in the journey. You can use other segments in place of this to target a more limited audience`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`7 day streak completed`}),` (optional)`]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`“7_day_streak” tag is “completed”`})}),_jsx(_components.td,{children:`Can be used to exclude users that have already completed the streak or for tracking purposes`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Active in last 8 hours`}),` (required)`]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Last session less than 8 hours ago`})}),_jsx(_components.td,{children:`To check for user activity between time windows.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Active in last 6 hours`}),` (required)`]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Last session less than 6 hours ago`})}),_jsx(_components.td,{children:`To check for user activity between time windows.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Active in last 4 hours`}),` (required)`]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Last session less than 4 hours ago`})}),_jsx(_components.td,{children:`To check for user activity between time windows.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`7 day streak failed`}),` (required)`]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`“7_day_streak” tag is “failed”`})}),_jsx(_components.td,{children:`Used to force the user to exit the journey early if they are inactive for more than a day.`})]})]})]}),`\n`,_jsx(Heading,{level:`4`,id:`journey-settings-2`,children:`Journey settings`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Setting`}),_jsx(_components.th,{children:`Configuration`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Entry rules`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Audience Segment`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Audience`})}),_jsxs(_components.td,{children:[_jsxs(_components.strong,{children:[`Include: `,_jsx(_components.code,{children:`Total Users`})]}),` segment. (`,_jsxs(_components.strong,{children:[`Optional: Exclude `,_jsx(_components.code,{children:`7 day streak completed`})]}),` to make it so that users can only complete the streak once, and `,_jsx(_components.code,{children:`7 day streak failed`}),` to make it so that a user can only attempt the streak once)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Exit rules`})}),_jsxs(_components.td,{children:[_jsxs(_components.strong,{children:[`Exit when user enters a segment: `,_jsx(_components.code,{children:`7 day streak failed`})]}),` (`,_jsx(_components.strong,{children:`Optional : Tag users when they exit early`}),`: `,_jsx(_components.code,{children:`7_day_streak: 0`}),` - removes users from `,_jsx(_components.code,{children:`7 day streak failed`}),` segment and allows them to re-enter the journey after failing)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Re-entry rules`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Yes, after a certain amount of time`}),`: `,_jsx(_components.code,{children:`10 minutes`}),` (if repeating) OR `,_jsx(_components.strong,{children:`No, they can receive this only once`}),` (for single attempts)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Schedule`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Start immediately, never stops`})})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`The above journey settings are a guide only. If you want to change your target audience or allow users to repeat the journey, simply adjust the settings accordingly. Only the `,_jsx(_components.strong,{children:`Exit rules`}),` criteria laid out above are mandatory for this journey to function correctly.`]})}),`\n`,_jsx(Heading,{level:`4`,id:`journey-steps-2`,children:`Journey steps`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Add a Time Window node`,children:[_jsxs(_components.p,{children:[`Begin by setting a Time Window node to your preferred delivery hours for the first reminder push, for example `,_jsx(_components.strong,{children:`8:00 AM – 8:15 AM`}),` every day. Enable `,_jsx(_components.strong,{children:`Use user’s time zone`}),` so messages arrive at a reasonable local time.`]}),_jsx(Frame,{caption:`Journey settings and Time Window`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day1.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=f5c51c51bee6f3800815e3eea8d37947`,alt:`A time window node for 8:00 AM – 8:15 AM every day`,\"data-og-width\":`744`,width:`744`,\"data-og-height\":`535`,height:`535`,\"data-path\":`images/docs/7day1.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day1.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=a590ef2bad7f7f78c3279ecbcfa1d876 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day1.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=6e1b3b4a97209dfc692cbbc8ceaa79af 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day1.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=38bb680c232acb6976be90ef74476966 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day1.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=fa407395bf072c8a2247e3bf516085e0 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day1.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=89c78187c07001b8ad13cb467937e6ed 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day1.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=247172ddccda3e93e74a5d37822ebb09 2500w`})}),_jsx(_components.p,{children:`Users who enter the journey after this window will wait until the next day before receiving the first push notification (this will only affect new sign-ups who have had their first ever session after 8am).`})]}),_jsxs(Step,{title:`Check for activity before first Time Window - Add a Yes/No branch`,children:[_jsx(_components.p,{children:`Before we send any messages, we need to check if the user was active in the last 8 hours, in case they joined the journey after 0:00am.`}),_jsx(Frame,{caption:`Yes/No branch`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day2.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=8e85ffc4f0b0e675680c1c59cc884052`,alt:`Yes/no branch for Active in last 8 hours segment`,\"data-og-width\":`899`,width:`899`,\"data-og-height\":`272`,height:`272`,\"data-path\":`images/docs/7day2.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day2.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=ba155aa109f21069d175672cb0e9ca7d 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day2.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=2ac9fd4bc740dd76085f467b22b4247c 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day2.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=dde7f21487f2d9928022ab5a8835c503 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day2.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=1590be6b426b63233ef35b1110a78bf1 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day2.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e852ad57ed95960845b92d2389d88bf4 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day2.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=716a5539db04fd213f5ec5e359d8f502 2500w`})}),_jsxs(_components.p,{children:[`The Yes/No branch will check membership of this segment and if the user has been active in the last 8 hours, then they skip all of the messaging steps for the first day (following the yes branch).\n`,_jsx(Warning,{children:`If you have selected a different time for your first check, then you will need to adjust this segment’s name and filters accordingly to check if the user’s last session was between this time window and 00:00am`})]})]}),_jsxs(Step,{title:`First push notification`,children:[_jsx(_components.p,{children:`Send your Day 1, first push notification.`}),_jsx(Frame,{caption:`First push notification`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day3.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=0e0856d64941d102dcbe086ff01a6b2e`,alt:`A 'Day 1 - Morning' push notification`,\"data-og-width\":`533`,width:`533`,\"data-og-height\":`347`,height:`347`,\"data-path\":`images/docs/7day3.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day3.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=48c93623253be662299deea925e9ff74 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day3.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=d3a9842015b9051b043746e37818f300 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day3.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=3f0b6ac0bc9438841b9d2232aef7ea82 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day3.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=d0055cbc53856b50fb83954530a08ef5 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day3.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=69da3a9e11fe06ef29a1a1277ce3bf5b 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day3.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=7832da8175d1998a77a120f6c707d81c 2500w`})})]}),_jsxs(Step,{title:`Add another Time Window node`,children:[_jsx(_components.p,{children:`Add another time window node so that you can send a second reminder push for Day 1 (in this example at 12pm).`}),_jsx(Frame,{caption:`A second Time Window`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day4.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=4a9c53df821b33edc36fd9adb6ae16d3`,alt:`A time window node for 12:00 PM – 12:15 PM every day`,\"data-og-width\":`481`,width:`481`,\"data-og-height\":`219`,height:`219`,\"data-path\":`images/docs/7day4.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day4.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=8cba7fdc0305624dfbe0355f0faaf526 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day4.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=4374ff4550d9c258ead43d5a7d1eafdf 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day4.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=b46d00908b18949d2d99bc726b070d40 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day4.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=0751dbe4dd00548c206e45d73e2d7d84 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day4.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=29753b9ee699776f7e1f5d85c07306e9 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day4.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e6928059064de682fcb19040286fea7c 2500w`})})]}),_jsxs(Step,{title:`Check for activity before Time Window - Add a Yes/No branch`,children:[_jsx(_components.p,{children:`Before we send the next message, we need to check if the user was active since the last message, and only send the next message if they were not.`}),_jsx(Frame,{caption:`Yes/No branch`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day5.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=816da2f9b4167fd984cbd5521f0d2804`,alt:`Yes/no branch for Active in last 4 hours segment`,\"data-og-width\":`831`,width:`831`,\"data-og-height\":`203`,height:`203`,\"data-path\":`images/docs/7day5.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day5.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e68569a3a69aeca6f6652dc650d4dbce 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day5.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=a1568ff275aad2d9953dc4e214229120 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day5.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=5606dc4b5731d0d2b83fd4d5913d97b4 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day5.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=b9d5f056a93cffb6850b2da1eed38abe 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day5.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=35d41f1119dd88af2f9c0bd029c15494 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day5.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=f4b4111e2a8c30b05f7b5c78ace9f053 2500w`})}),_jsx(_components.p,{children:`The Yes/No branch will check membership of this segment and if the user has been active in the last X hours, then they skip all of the messaging steps for the rest of the day if so (following the yes branch).`})]}),_jsxs(Step,{title:`Second push notification`,children:[_jsx(_components.p,{children:`Send your Day 1, second push notification.`}),_jsx(Frame,{caption:`Push notification`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day6.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=c57fb4afc4479c2595f080889255f4f5`,alt:`A 'Day 1 - Afternoon' push notification`,\"data-og-width\":`534`,width:`534`,\"data-og-height\":`288`,height:`288`,\"data-path\":`images/docs/7day6.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day6.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=d046d54a5e17d363e677cb304c3728c3 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day6.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=3ea156629090193d60318536306bb02e 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day6.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=0fc28b26a13c16599052122d7508a2f7 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day6.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=6a5083b65ed4480696271ba4850385be 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day6.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=5d0becb4a53b348954223c72b2272aac 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day6.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=676f6528033ca7e3715aa780777bdfa8 2500w`})})]}),_jsxs(Step,{title:`Repeat steps 4, 5 \u0026 6 to send more notifications.`,children:[_jsx(_components.p,{children:`Add more time window and message nodes to send as many push notifications in this day as you like.`}),_jsx(Frame,{caption:`Time Window`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day7.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=a8a670d217c32c89461064a69fd32210`,alt:`A time window node for 8:00 AM – 8:15 AM every day`,\"data-og-width\":`414`,width:`414`,\"data-og-height\":`200`,height:`200`,\"data-path\":`images/docs/7day7.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day7.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=a4a4bc308673f1d6db2e2701dd511001 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day7.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=221428afac395715b31a95f03f5fe49e 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day7.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=5e95d9e20698d397248bb933cc9f2f84 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day7.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=ca07b7ce2475a24b90e28c3a5de44d48 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day7.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=545fa1b93a222cfb883115506e5a1b1e 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day7.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=be8af98769ad579b168248ca0e2cff9e 2500w`})})]}),_jsxs(Step,{title:`Add another Time Window node for 12:00am`,children:[_jsx(_components.p,{children:`Add another time window node set to 12:00am to move to the next day.`}),_jsx(Frame,{caption:`Time Window`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day10.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=2cb3d5ffeacd118d7d39ccccb879aa4e`,alt:`A time window node for 12:00 AM – 12:15 AM every day`,\"data-og-width\":`490`,width:`490`,\"data-og-height\":`249`,height:`249`,\"data-path\":`images/docs/7day10.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day10.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e224ac241ae98a2f52d6822157bedb87 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day10.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=1c50fef3196bcaccae7b5fe82431941c 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day10.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=817fc85662ff3465b1a249fe64d5a8eb 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day10.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=943f50af02df5ad807a9abfa48eb12f0 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day10.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=5c3dfbd6197909213d2c7f38789ec5ef 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day10.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=2c7a36ba442b80f804dac4e6ff569712 2500w`})})]}),_jsxs(Step,{title:`Check for activity before Time Window - Add a Yes/No branch`,children:[_jsx(_components.p,{children:`Before we move to the next day’s messages, we need to check if the user was active since the last message, and only continue the journey if they were.`}),_jsx(Frame,{caption:`Yes/No branch`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day11.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=30e37166ed3cd31f30342425225020e7`,alt:`A yes/no branch for Active in last 6 hours segment`,\"data-og-width\":`645`,width:`645`,\"data-og-height\":`225`,height:`225`,\"data-path\":`images/docs/7day11.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day11.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=d2b905a416b8d4624db4a6b5ffaf0c9a 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day11.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=3bea358a23321308f40907a0bbd6a3c7 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day11.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=f8c85e7c8034bf0821198ca38197cf0b 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day11.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=cb0badf7a1ea4ed8417a45d92a6a7907 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day11.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=0d0d82bfcdb5eb63cab1d211b5339993 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day11.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=700985c958e22e7722bb006c3594f91a 2500w`})}),_jsx(_components.p,{children:`The Yes/No branch will check membership of this segment. If the user has not been active in the last X hours, they have failed the journey.`})]}),_jsxs(Step,{title:_jsx(_Fragment,{children:`Add a tag to eject the user from the journey.`}),children:[_jsxs(_components.p,{children:[`Down the “No” branch of the above Yes/No check, we need to add a tag to eject the user from the journey as they have failed to continue their streak. Add the tag `,_jsx(_components.code,{children:`7_day_streak`}),` with the value `,_jsx(_components.code,{children:`failed`}),` here. This will put the user into the “7 day streak failed” segment and automatically end the journey for them.\nOptionally, you can also add a `,_jsx(_components.code,{children:`streak_failed_day`}),` tag here with the day number as the value in order to track what days your users failed their streaks.`]}),_jsx(Frame,{caption:`Streak failed tag`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day12.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=f8b988a3333a90e295c3e5e3815f19e6`,alt:`A tag node setting 7_day_streak to failed`,\"data-og-width\":`401`,width:`401`,\"data-og-height\":`289`,height:`289`,\"data-path\":`images/docs/7day12.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day12.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=442fdaa338d252799f07607cc3dffe2e 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day12.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=2bcc8df91f2c2f436459a27977d0c047 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day12.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=a81fa8e44fe27e2fd7d7724c944f77c3 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day12.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=f5df66a34b0c49a8299b9a498a1da650 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day12.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=24acf003e5dd63d2974c07b43e6a393a 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day12.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=84c7419371f7417cde918f086cc1ec7b 2500w`})})]}),_jsxs(Step,{title:`Add a wait node on the original 'Yes' branch of this day.`,children:[_jsx(_components.p,{children:`On the “Yes” branch from the Yes/No node in step 2, add a wait node for 16 hours (or whatever the time difference between your first time window time and midnight of the next day). This ensures that the users on this branch are kept in line with users who have been receiving messages on the other branch.`}),_jsx(Frame,{caption:`Wait node`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day14.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=39818ca185d41af57101973a4543da0e`,alt:`A 16 hour wait node`,\"data-og-width\":`467`,width:`467`,\"data-og-height\":`252`,height:`252`,\"data-path\":`images/docs/7day14.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day14.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=3c71fd2cc3ebf1e60aa7edf2d6bb6852 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day14.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=580fea6735c452ea28c9166e20587c0b 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day14.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=cbe64b43d17c5a16c14526639626f1de 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day14.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=192e848dcd73a06c3655830a17f766ee 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day14.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=51288869a51a986665f36ca2392f693f 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day14.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e75ac97d6afb57b5dd286e81f6507ae9 2500w`})})]}),_jsxs(Step,{title:`Add a tag to signify the streak day achieved.`,children:[_jsx(_components.p,{children:`For tracking and personalization purposes, you may want to update the value of your “7_day_streak” tag to the number of the day the user is on at this stage (this step is optional).`}),_jsx(Frame,{caption:`Update '7_day_streak' tag`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day13.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=65ef2d52c410e31d590e84d2034c9405`,alt:`An update tag node`,\"data-og-width\":`549`,width:`549`,\"data-og-height\":`248`,height:`248`,\"data-path\":`images/docs/7day13.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day13.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e48c60ee4431559c13a209adfd6006e7 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day13.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=7d67b4858af5ca3e6c12d3ec01018803 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day13.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=2ac5373c1e9e263d61bfa68b9ec85446 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day13.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=b42519c022994e23d22ccc5405249e04 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day13.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=07a774c4aa03a96a5e8d691487649de7 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day13.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e7bfa4d7b2f39418aa13ade09342e9e6 2500w`})})]}),_jsxs(Step,{title:`Repeat for days 2-7.`,children:[_jsx(_components.p,{children:`After the Yes/No branches from step 2 converge, repeat steps 2-12 for each day. Make sure that you vary your messaging each day to reflect the user’s progress through the streak.`}),_jsx(Note,{children:_jsxs(_components.p,{children:[`You can use message personalisation if you want to reuse your message templates each day. Simply use liquid syntax and the `,_jsx(_components.code,{children:`7_day_streak`}),` tag that was updated in step 12 to remind users how big their streak is so far.`]})})]}),_jsxs(Step,{title:`Add a final data tag`,children:[_jsxs(_components.p,{children:[`For tracking purposes, and to prevent users from re-entering if you want to only allow them to finish the streak once, just before the exit node as the final step of your journey, update the `,_jsx(_components.code,{children:`7_day_streak`}),` to `,_jsx(_components.code,{children:`completed`}),`.`]}),_jsxs(_components.p,{children:[`If you have been setting the `,_jsx(_components.code,{children:`streak_failed_day`}),` tag as well, update this to a blank value to delete the tag.`]}),_jsx(Frame,{caption:`Update '7_day_streak' tag`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day15.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=a78c43894c304d3cb90dd71f2610985a`,alt:`7 day streak tag updated and exit settings`,\"data-og-width\":`977`,width:`977`,\"data-og-height\":`715`,height:`715`,\"data-path\":`images/docs/7day15.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day15.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=d1ddff6adf90f5836b8d6e0851e32693 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day15.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=f292876b5f8c513c8bd529551332aaa5 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day15.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=eff0557277d3825c002b7d344757065b 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day15.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=b04536a2122b3364f0810338233f2158 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day15.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=3ef33d49e97f7c57b18b54c6fcd87cdc 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/7day15.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=f0ffde9bf47ded0d35bbdb706e8a0862 2500w`})})]}),_jsx(Step,{title:`Optional: Send a 'Congratulations' push notification`,children:_jsx(_components.p,{children:`At this point you may want to congratulate your users via a push notification for completing your 7 day streak before exiting the journey.`})})]}),`\n`,_jsx(Check,{children:_jsx(_components.p,{children:`That’s it - set the Journey live. Your users will enter the journey on day 1 and will progress until they either complete their entire streak or until they have been inactive for a full calendar day. If they are inactive for a full day they will be ejected from the journey early, and depending on your journey settings, may re-enter the journey later.`})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`1-day-recurring-streak-with-tags-and-custom-events`,children:`1-day recurring streak with tags and custom events`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Goal`}),`: Send escalating push reminders throughout the day, using a custom event (`,_jsx(_components.code,{children:`streak_continued`}),`) to detect when the user completes their daily action. As soon as the event fires, the user skips all remaining reminders for that day. If the user doesn’t act, they receive up to four reminders spaced 4 hours apart. The cycle resets the next day.`]}),`\n`,_jsxs(_components.p,{children:[`This approach uses a `,_jsx(_components.strong,{children:_jsx(_components.a,{href:`/docs/en/custom-events`,children:`custom event`})}),` (`,_jsx(_components.code,{children:`streak_continued`}),`) to signal that a user has completed their daily streak action, and `,_jsx(_components.strong,{children:_jsx(_components.a,{href:`/docs/en/journeys-actions#wait-until`,children:`Wait Until`})}),` nodes to listen for that event between reminders. Unlike the previous examples, this journey doesn’t rely on segment-based activity checks: instead, it reacts directly to an event fired by your app.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`This journey focuses on `,_jsx(_components.strong,{children:`sending reminders`}),`. Your app or backend should handle streak count tracking: incrementing the counter when the user completes their daily action, and resetting it when a day is missed. The journey uses a `,_jsx(_components.code,{children:`streak_count`}),` `,_jsx(_components.a,{href:`/docs/en/add-user-data-tags`,children:`tag`}),` on the user profile to personalize messages with `,_jsx(_components.a,{href:`/docs/en/using-liquid-syntax`,children:`liquid syntax`}),`, so users who are continuing a streak see different copy than users who are starting fresh.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`send-the-custom-event-and-update-streak-tags-from-your-app`,children:`Send the custom event and update streak tags from your app`}),`\n`,_jsxs(_components.p,{children:[`Each time a user completes their daily streak action (opening the app, finishing a lesson, logging a workout, etc.), send a `,_jsx(_components.code,{children:`streak_continued`}),` custom event to OneSignal `,_jsx(_components.strong,{children:`and`}),` update the `,_jsx(_components.code,{children:`streak_count`}),` tag on the user profile:`]}),`\n`,_jsxs(Tabs,{children:[_jsx(Tab,{title:`Frontend SDK`,id:`frontend-sdk`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Fire the custom event to signal streak completion`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`OneSignal`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`User`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`trackEvent`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"streak_continued\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Update the streak count tag (your app calculates the value)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`OneSignal`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`User`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`addTags`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` streak_count:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` currentStreakCount`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`]})})})}),_jsxs(Tab,{title:`REST API`,id:`rest-api`,children:[_jsxs(_components.p,{children:[`Fire the custom event via the `,_jsx(_components.a,{href:`/reference/create-custom-events`,children:`Custom Events API`}),`:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"events\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"streak_continued\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"external_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"USER_EXTERNAL_ID\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsxs(_components.p,{children:[`Update the tag via the `,_jsx(_components.a,{href:`/reference/update-user`,children:`Update User API`}),`:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"properties\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"tags\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"streak_count\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"5\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})]})]}),`\n`,_jsxs(_components.p,{children:[`When a user misses a day, your app should reset the `,_jsx(_components.code,{children:`streak_count`}),` tag to `,_jsx(_components.code,{children:`0`}),` (or remove it). This ensures the journey’s push templates always reflect the correct streak state.`]}),`\n`,_jsx(Heading,{level:`3`,id:`create-personalized-message-templates`,children:`Create personalized message templates`}),`\n`,_jsxs(_components.p,{children:[`Use `,_jsx(_components.a,{href:`/docs/en/using-liquid-syntax`,children:`liquid syntax`}),` in your push notification templates to show different copy depending on whether the user has an active streak or is starting fresh. This keeps the journey structure simple: a single push node handles both cases.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Example push template:`})}),`\n`,_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:`{% if streak_count and streak_count != \"0\" %}Keep your streak alive!{% else %}Start a streak today!{% endif %}`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Message`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`{% if streak_count and streak_count != \"0\" %}You're on a {{streak_count}}-day streak. Don't let it end!{% else %}Open the app to start building your streak.{% endif %}`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Launch URL`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://yourapp.com/streak`})})]})]})]}),`\n`,_jsx(_components.p,{children:`Create a separate template for each time slot (8am, 12pm, 4pm, 8pm) so you can vary the tone throughout the day. For example, the morning template can be encouraging while the evening template adds gentle urgency, but each template should include the liquid conditional so it adapts to both streak states.`}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Alternative approach`}),`: If you prefer to manage “continue” and “start” messages as separate templates rather than using liquid syntax, you can add a `,_jsx(_components.a,{href:`/docs/en/journeys-actions#yesno-branch`,children:`Yes/No branch`}),` before each push node. Branch on segment membership (e.g., a segment where `,_jsx(_components.code,{children:`streak_count`}),` is greater than `,_jsx(_components.code,{children:`0`}),`) and route each path to a different template. This gives you more visual control in the journey builder but adds extra nodes to the canvas.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`segments-used-3`,children:`Segments used`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Segment`}),_jsx(_components.th,{children:`Filters`}),_jsx(_components.th,{children:`Notes`})]})}),_jsx(_components.tbody,{children:_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Total Users`}),` (or your preferred audience)`]}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`No filters`})}),_jsx(_components.td,{children:`To include all users in the journey. Replace with a more targeted segment if needed.`})]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`journey-settings-3`,children:`Journey settings`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Setting`}),_jsx(_components.th,{children:`Configuration`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Entry rules`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Audience Segment`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Audience`})}),_jsxs(_components.td,{children:[`Include: `,_jsx(_components.code,{children:`Total Users`}),` (or your preferred audience segment)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Exit rules`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`They moved through the entire journey`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Re-entry rules`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Yes, after a certain amount of time`}),`: `,_jsx(_components.code,{children:`10 minutes`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Schedule`})}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Start immediately, never stops`})})]})]})]}),`\n`,_jsx(Frame,{caption:`Journey entry rules`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-1.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=12c1a46192a638e9ea10707c002667f1`,alt:`Journey settings showing Audience Segment entry with Total Users segment included`,\"data-og-width\":`783`,width:`783`,\"data-og-height\":`376`,height:`376`,\"data-path\":`images/docs/streak-tags-events-1.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-1.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=d90ae9cd5ebcabe2a8df2c198cec5bf8 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-1.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=bff046ec597d00496d65470a7e316ca9 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-1.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=3b6d911e0f891566b232637cfc72fa70 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-1.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=c07e955a786e3b50e0e68f68d65f73a5 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-1.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=8912ee393e6021b047401b627b1a79f0 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-1.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=ebbc32ee48b679ab12d105b2b4aec541 2500w`})}),`\n`,_jsx(Frame,{caption:`Re-entry rules set to 10 minutes`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-2.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=893b087ba7864888c5dbef565b15cd13`,alt:`Re-entry rules set to Yes, after 10 minutes`,\"data-og-width\":`786`,width:`786`,\"data-og-height\":`327`,height:`327`,\"data-path\":`images/docs/streak-tags-events-2.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-2.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=f77dd0f93878a34d88080b477ce0dd78 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-2.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=3b8bf70ee779b199a18a5f1cb9495f02 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-2.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=953750e6ba8ffa4604b8734f2eefbbe9 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-2.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=4568782713d9d31a3071465235d3bd22 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-2.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=4555d911af5cf87a16b6a687da55a5e2 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-2.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=cfe0236945b7a46056013c3a56e49b0a 2500w`})}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Setting re-entry to 10 minutes ensures users re-enter the journey as soon as possible after exiting. Combined with the Time Window as the first step, users will wait at the time window until the next morning before starting a new cycle.`})}),`\n`,_jsx(Heading,{level:`3`,id:`journey-steps-3`,children:`Journey steps`}),`\n`,_jsxs(_components.p,{children:[`The journey uses `,_jsx(_components.strong,{children:`Wait Until`}),` nodes to listen for the `,_jsx(_components.code,{children:`streak_continued`}),` custom event between each reminder. If the event fires at any point, the user follows the `,_jsx(_components.strong,{children:`A branch`}),` and skips all remaining reminders for the day. If the event doesn’t fire before the expiration, the user receives a push notification and moves to the next Wait Until node.`]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Add a Time Window node`,children:[_jsxs(_components.p,{children:[`Begin by setting a Time Window node that starts slightly before your first desired reminder time, for example `,_jsx(_components.strong,{children:`7:00 AM – 7:15 AM`}),` every day. Enable `,_jsx(_components.strong,{children:`Use user’s time zone`}),` so the cycle starts at a reasonable local time.`]}),_jsx(Frame,{caption:`Time Window`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-3.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=aa5742337a342da1c56137652892a3cd`,alt:`A time window node for 7:00 AM – 7:15 AM every day`,\"data-og-width\":`576`,width:`576`,\"data-og-height\":`336`,height:`336`,\"data-path\":`images/docs/streak-tags-events-3.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-3.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=01a979a0745db808eeda78ec6da0aa03 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-3.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=10596605e25b25197b486a678f575ba2 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-3.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=ec3da47a389d1be39c582e811496e054 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-3.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=b034302e486b52c7c7715611e84e0e14 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-3.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=4be58a2fe52ad6f1a7056cf42aa7dc82 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-3.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=ee4f7f4ff083cf07ad0e24271d14acc8 2500w`})}),_jsx(_components.p,{children:`Users who enter the journey after this window will wait until the next day before the reminder cycle begins. The window starts at 7:00 AM to give the first Wait Until node time to expire before the 8am reminder.`})]}),_jsxs(Step,{title:`Add a Wait Until node (1-hour expiration)`,children:[_jsxs(_components.p,{children:[`Add a `,_jsx(_components.strong,{children:`Wait Until`}),` node with the condition: Custom Event `,_jsx(_components.code,{children:`streak_continued`}),` occurs. Set the `,_jsx(_components.strong,{children:`expiration`}),` to `,_jsx(_components.code,{children:`1 hour`}),`.`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A branch`}),` (event fires): The user already completed their daily action early in the morning, so they skip all reminders and proceed directly to the exit.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Expire branch`}),` (1 hour, no event): The user hasn’t acted yet. Continue to the first push reminder.`]}),`\n`]}),_jsx(_components.p,{children:`The 1-hour expiration covers the gap between the Time Window (7:00 AM) and the first reminder (~8:00 AM). This gives users who are already active a chance to trigger the event before any push is sent.`}),_jsx(Frame,{caption:`Wait Until node with 1-hour expiration`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-4.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=f018b4bf5f05af31e5cd1fc8940d37dd`,alt:`Wait Until node listening for streak_continued event with 1-hour expiration`,\"data-og-width\":`1457`,width:`1457`,\"data-og-height\":`355`,height:`355`,\"data-path\":`images/docs/streak-tags-events-4.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-4.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=2d31d35223f5a61ffa87bc2138f0e2a2 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-4.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=dfe5d2b74ada64ae3ae9f06a093c9c78 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-4.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e4521e27a70528d5cba309a96803b2f7 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-4.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=1d31ff22181455ceeaa324ca7bdaeb16 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-4.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=a1969b15f68f431718a646eb0f188353 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-4.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=2c19bc70bafe09e84298745edbb9e535 2500w`})})]}),_jsxs(Step,{title:`Send the 8am Streak Reminder push`,children:[_jsxs(_components.p,{children:[`On the `,_jsx(_components.strong,{children:`Expire branch`}),`, add a Push Notification node with your first personalized template (e.g., “8am Streak Reminder”). The liquid syntax in the template will automatically show “Keep your streak alive!” for users with an active streak, or “Start a streak today!” for users starting fresh.`]}),_jsx(Frame,{caption:`8am Streak Reminder push notification`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-5.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=2098d73841df638ba83f0e4b05d75783`,alt:`Push notification node for 8am Streak Reminder`,\"data-og-width\":`696`,width:`696`,\"data-og-height\":`446`,height:`446`,\"data-path\":`images/docs/streak-tags-events-5.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-5.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=0a2245f4522c400c8112c0a8276ccb8c 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-5.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=53bc23753d4e8c524f01446f12f59a6a 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-5.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=8ae415584b0892f0696d528237a9a292 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-5.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=fad3f3f05c7cb685e50c9cc5fd359236 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-5.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=ee5392044dcdbe4e0ca494d0eaed8a2b 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-5.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=e4f70d2567427a974ddaffab4b14f8e3 2500w`})})]}),_jsxs(Step,{title:`Add a second Wait Until node (4-hour expiration)`,children:[_jsxs(_components.p,{children:[`After the push notification, add another `,_jsx(_components.strong,{children:`Wait Until`}),` node with the same condition: Custom Event `,_jsx(_components.code,{children:`streak_continued`}),`. This time, set the `,_jsx(_components.strong,{children:`expiration`}),` to `,_jsx(_components.code,{children:`4 hours`}),`.`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A branch`}),`: User completed their action after the first reminder. Skip remaining reminders and proceed to the exit.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Expire branch`}),`: No action after 4 hours. Continue to the 12pm reminder.`]}),`\n`]})]}),_jsxs(Step,{title:`Send the 12pm Streak Reminder push`,children:[_jsxs(_components.p,{children:[`On the `,_jsx(_components.strong,{children:`Expire branch`}),`, add a Push Notification node for your midday reminder (e.g., “12pm Streak Reminder”). Use a different template from the 8am one, but include the same liquid conditional so it adapts to the user’s streak state.`]}),_jsx(Frame,{caption:`12pm Streak Reminder push notification`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-6.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=c209a25ea053b5a10a5ba281c02f7f08`,alt:`Push notification node for 12pm Streak Reminder`,\"data-og-width\":`895`,width:`895`,\"data-og-height\":`631`,height:`631`,\"data-path\":`images/docs/streak-tags-events-6.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-6.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=1ef5c7035efbadd78a4c5c58c2f7562e 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-6.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=7341bf3e81b56790d9de76744440e922 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-6.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=b02601cfc0226b24bdb9ab7e0c7f8d9a 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-6.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=a293e0de22d14a6c31c18f9c4dc7e389 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-6.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=20a0395c23a0c65eb6422e89698c7c1d 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-6.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=3598f326a6a631b79ade233ea1b36cf4 2500w`})})]}),_jsxs(Step,{title:`Continue the pattern for afternoon and evening reminders`,children:[_jsxs(_components.p,{children:[`Repeat the `,_jsx(_components.strong,{children:`Wait Until (4 hours) → Push Notification`}),` pattern for each additional reminder you want to send. In this example:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Wait Until`}),` (4 hours) → `,_jsx(_components.strong,{children:`4pm Streak Reminder`}),` push`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Wait Until`}),` (4 hours) → `,_jsx(_components.strong,{children:`8pm Streak Reminder`}),` push`]}),`\n`]}),_jsxs(_components.p,{children:[`At each Wait Until node, the `,_jsx(_components.code,{children:`streak_continued`}),` event can fire to skip all remaining reminders and jump straight to the exit.`]}),_jsxs(Warning,{children:[_jsx(_components.strong,{children:`Don’t be repetitive`}),`: Use a different push template for each time slot. Vary the tone and messaging. Morning reminders can be encouraging, while evening reminders can add gentle urgency. Users will tune out identical repeated notifications.`]})]}),_jsxs(Step,{title:`Converge all branches to the Exit node`,children:[_jsxs(_components.p,{children:[`All `,_jsx(_components.strong,{children:`A branches`}),` (from each Wait Until node where the `,_jsx(_components.code,{children:`streak_continued`}),` event fired) and the final push notification branch should converge at the end of the journey, leading to the `,_jsx(_components.strong,{children:`Exit`}),` node.`]}),_jsx(Frame,{caption:`Exit node`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-7.png?fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=3473d114a0558bdc187da8636b3b5691`,alt:`Exit node showing re-entry after 10 minutes`,\"data-og-width\":`1226`,width:`1226`,\"data-og-height\":`768`,height:`768`,\"data-path\":`images/docs/streak-tags-events-7.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-7.png?w=280\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=ab1858f9807e34ea47bd14bfda75459f 280w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-7.png?w=560\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=12f95b6bd4b64e85045df01f38526278 560w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-7.png?w=840\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=b44a71f08a09d9784e6385184085463a 840w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-7.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=675437f79d12c3ca65d1878bfaadf4f4 1100w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-7.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=d3c364891492b60cfe6c069a3653dd3c 1650w, https://mintcdn.com/onesignal/I9R4hrWwQuMLErhC/images/docs/streak-tags-events-7.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I9R4hrWwQuMLErhC\u0026q=85\u0026s=42f91d88c6a9c9febccbc030719b04af 2500w`})}),_jsx(_components.p,{children:`The user exits and re-enters after 10 minutes. Since the Time Window is the first step, they’ll wait there until 7:00 AM the next morning before starting a new reminder cycle.`})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`how-the-flow-works`,children:`How the flow works`}),`\n`,_jsx(_components.p,{children:`Here’s a walkthrough of a typical day for a user in this journey:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Time`}),_jsx(_components.th,{children:`User action`}),_jsx(_components.th,{children:`Journey behavior`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`7:00 AM`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`-`}),_jsx(_components.td,{children:`User passes through Time Window, enters first Wait Until (1-hour expiration)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`7:00–8:00 AM`}),_jsxs(_components.td,{children:[`No `,_jsx(_components.code,{children:`streak_continued`}),` event`]}),_jsxs(_components.td,{children:[`Wait Until expires → sends `,_jsx(_components.strong,{children:`8am Streak Reminder`}),` push`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`8:00 AM–12:00 PM`}),_jsx(_components.td,{children:`No event`}),_jsxs(_components.td,{children:[`Wait Until expires (4 hours) → sends `,_jsx(_components.strong,{children:`12pm Streak Reminder`}),` push`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`2:30 PM`}),_jsxs(_components.td,{children:[`User opens app, `,_jsx(_components.code,{children:`streak_continued`}),` fires`]}),_jsxs(_components.td,{children:[`Wait Until condition met → user follows A branch, `,_jsx(_components.strong,{children:`skips 4pm and 8pm reminders`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{\"data-numeric\":`true`,children:`-`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`-`}),_jsx(_components.td,{children:`User exits journey → re-enters after 10 min → waits at Time Window for next 7:00 AM`})]})]})]}),`\n`,_jsx(_components.p,{children:`If the user never acts, they receive all four reminders (8am, 12pm, 4pm, 8pm), then exit and re-enter the cycle the next day.`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`The first Wait Until uses a `,_jsx(_components.strong,{children:`1-hour expiration`}),` while all subsequent ones use `,_jsx(_components.strong,{children:`4 hours`}),`. This is because the Time Window starts at 7:00 AM, so the short first expiration ensures the 8am reminder fires on time. Adjust these values if you change your Time Window start time.`]})}),`\n`,_jsx(Check,{children:_jsxs(_components.p,{children:[`That’s it. Set the Journey live. Each day, users will be prompted up to four times to complete their daily action, with messaging that automatically adapts based on their streak status. As soon as the `,_jsx(_components.code,{children:`streak_continued`}),` event fires, all remaining reminders are skipped for the day. The cycle resets the next morning at your configured Time Window.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`comparison-of-approaches`,children:`Comparison of approaches`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{children:`Last session (1-day)`}),_jsx(_components.th,{children:`Last session (7-day)`}),_jsx(_components.th,{children:`Tags + custom events`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Complexity`})}),_jsx(_components.td,{children:`Low`}),_jsx(_components.td,{children:`Medium`}),_jsx(_components.td,{children:`High`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Setup required`})}),_jsx(_components.td,{children:`Segment only`}),_jsx(_components.td,{children:`Segment + branching`}),_jsx(_components.td,{children:`SDK/API integration + segments`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Personalization`})}),_jsx(_components.td,{children:`Generic messages`}),_jsx(_components.td,{children:`Day-specific messages`}),_jsx(_components.td,{children:`Streak count in messages`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Tracks streak count`})}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`Implicitly (by day in Journey)`}),_jsx(_components.td,{children:`Yes (via tags)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Best for`})}),_jsx(_components.td,{children:`Simple daily reminders`}),_jsx(_components.td,{children:`Time-limited challenges`}),_jsx(_components.td,{children:`Apps with streak UI/rewards`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Code required`})}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`Yes (events + tag updates)`})]})]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`tips-and-best-practices`,children:`Tips and best practices`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Don’t over-message.`}),` Ensure that you send an appropriate amount of reminders, and use `,_jsx(_components.a,{href:`/docs/en/journeys-actions#time-window`,children:`Time Window`}),` nodes to control when messages are sent and avoid interrupting users during off-hours.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Use different channels where appropriate.`}),` If your users are subscribed to multiple channels, try experimenting with SMS and Email messages as part of your flow to see if streak retention increases. Note that in-app messages are not appropriate for streak reminders, as the user has to be in the app to see them, and in-app messages in journeys can only be shown to a user once, even if they re-enter the journey.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Combine with outcomes.`}),` Track streak completions as `,_jsx(_components.a,{href:`/docs/en/custom-outcomes`,children:`Custom Outcomes`}),` to measure the impact of your streak Journeys on retention and engagement.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Test your timing.`}),` Experiment with different delivery windows and message frequencies. Use `,_jsx(_components.a,{href:`/docs/en/journeys-actions#split-branch`,children:`Split Branch`}),` nodes to A/B test.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Reset streaks gracefully.`}),` When a streak breaks, consider sending an encouraging “start a new streak” message rather than a punitive one.`]}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`faq`,children:`FAQ`}),`\n`,_jsx(Heading,{level:`3`,id:`can-i-track-the-actual-streak-count-without-tags-or-custom-events`,children:`Can I track the actual streak count without tags or custom events?`}),`\n`,_jsxs(_components.p,{children:[`Not directly. OneSignal’s `,_jsx(_components.strong,{children:`Last Session`}),` filter tells you `,_jsx(_components.em,{children:`when`}),` a user was last active but does not count consecutive days. For streak counting, use `,_jsx(_components.a,{href:`/docs/en/add-user-data-tags`,children:`tags`}),` or `,_jsx(_components.a,{href:`/docs/en/custom-events`,children:`custom events`}),` as shown in the third example.`]}),`\n`,_jsx(Heading,{level:`3`,id:`what-happens-if-a-user-has-multiple-subscriptions`,children:`What happens if a user has multiple subscriptions?`}),`\n`,_jsxs(_components.p,{children:[`Segment checks evaluate all of a user’s subscriptions. If a user has both a mobile and web subscription, activity on `,_jsx(_components.em,{children:`either`}),` device updates their last session time. Assign `,_jsx(_components.a,{href:`/docs/en/users`,children:`External IDs`}),` to unify subscriptions under a single user profile.`]}),`\n`,_jsx(Heading,{level:`3`,id:`can-i-reward-users-for-completing-a-streak`,children:`Can I reward users for completing a streak?`}),`\n`,_jsxs(_components.p,{children:[`Yes. At the end of a streak Journey, use a `,_jsx(_components.a,{href:`/docs/en/journeys-actions#tag-user`,children:`Tag User`}),` action to mark the user (for example, `,_jsx(_components.code,{children:`streak_7day_complete: true`}),`). Your app can read this tag to unlock rewards, badges, or other incentives. You can also use a `,_jsx(_components.a,{href:`/docs/en/journeys-webhook`,children:`Journey webhook`}),` to notify your backend when a user completes the streak.`]}),`\n`,_jsx(Heading,{level:`3`,id:`how-do-i-prevent-users-from-getting-multiple-streak-reminders-in-one-day`,children:`How do I prevent users from getting multiple streak reminders in one day?`}),`\n`,_jsxs(_components.p,{children:[`The combination of `,_jsx(_components.strong,{children:`re-entry rules`}),` and `,_jsx(_components.strong,{children:`Time Window`}),` nodes handles this. Set re-entry to at least 12 hours and use a single daily time window. This ensures each user receives at most one reminder per day.`]})]})}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":"Daily streak journey","description":"Use Journeys to build daily streak reminders that keep users coming back, using last session time or tags and custom events.","keywords":["daily streak","streak","journey","retention","reminders","habit","repeat","daily"],"href":"/docs/en/daily-streak"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Overview","slug":"overview","depth":2,"children":[{"title":"Prerequisites","slug":"prerequisites","depth":3,"children":[]}]},{"title":"1-day recurring streak reminder","slug":"1-day-recurring-streak-reminder","depth":2,"children":[{"title":"Segments used","slug":"segments-used","depth":4,"children":[]},{"title":"Journey settings","slug":"journey-settings","depth":4,"children":[]},{"title":"Journey steps","slug":"journey-steps","depth":4,"children":[]}]},{"title":"7-day streak Journey","slug":"7-day-streak-journey","depth":2,"children":[{"title":"Segments used","slug":"segments-used-2","depth":4,"children":[]},{"title":"Journey settings","slug":"journey-settings-2","depth":4,"children":[]},{"title":"Journey steps","slug":"journey-steps-2","depth":4,"children":[]}]},{"title":"1-day recurring streak with tags and custom events","slug":"1-day-recurring-streak-with-tags-and-custom-events","depth":2,"children":[{"title":"Send the custom event and update streak tags from your app","slug":"send-the-custom-event-and-update-streak-tags-from-your-app","depth":3,"children":[]},{"title":"Create personalized message templates","slug":"create-personalized-message-templates","depth":3,"children":[]},{"title":"Segments used","slug":"segments-used-3","depth":3,"children":[]},{"title":"Journey settings","slug":"journey-settings-3","depth":3,"children":[]},{"title":"Journey steps","slug":"journey-steps-3","depth":3,"children":[]},{"title":"How the flow works","slug":"how-the-flow-works","depth":3,"children":[]}]},{"title":"Comparison of approaches","slug":"comparison-of-approaches","depth":2,"children":[]},{"title":"Tips and best practices","slug":"tips-and-best-practices","depth":2,"children":[]},{"title":"FAQ","slug":"faq","depth":2,"children":[{"title":"Can I track the actual streak count without tags or custom events?","slug":"can-i-track-the-actual-streak-count-without-tags-or-custom-events","depth":3,"children":[]},{"title":"What happens if a user has multiple subscriptions?","slug":"what-happens-if-a-user-has-multiple-subscriptions","depth":3,"children":[]},{"title":"Can I reward users for completing a streak?","slug":"can-i-reward-users-for-completing-a-streak","depth":3,"children":[]},{"title":"How do I prevent users from getting multiple streak reminders in one day?","slug":"how-do-i-prevent-users-from-getting-multiple-streak-reminders-in-one-day","depth":3,"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":"Daily streak journey - OneSignal","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/docs/en/daily-streak","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-05-18T21:51:21.617Z","originalFileLocation":"docs/en/daily-streak.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=\"Use Journeys to build daily streak reminders that keep users coming back, using last session time or tags and custom events.\">\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=\"Daily streak journey - OneSignal\">\u003cmeta data-mint-head property=\"og:description\" content=\"Use Journeys to build daily streak reminders that keep users coming back, using last session time or tags and custom events.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"OneSignal\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://documentation.onesignal.com/docs/en/daily-streak\">\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=Retain+and+re-engage\u0026amp;title=Daily+streak+journey\u0026amp;description=Use+Journeys+to+build+daily+streak+reminders+that+keep+users+coming+back%2C+using+last+session+time+or+tags+and+custom+events.\u0026amp;theme=8d648f04f85028b307bd669b\u0026amp;signature=d412ef9184831ace8434300a8929b7482a866b292002cf2373bf51b071328d7a\">\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=\"Daily streak journey - OneSignal\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Use Journeys to build daily streak reminders that keep users coming back, using last session time or tags and custom events.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://onesignal.mintlify.app/_mintlify/api/og/v2?division=Retain+and+re-engage\u0026amp;title=Daily+streak+journey\u0026amp;description=Use+Journeys+to+build+daily+streak+reminders+that+keep+users+coming+back%2C+using+last+session+time+or+tags+and+custom+events.\u0026amp;theme=8d648f04f85028b307bd669b\u0026amp;signature=d412ef9184831ace8434300a8929b7482a866b292002cf2373bf51b071328d7a\">\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/daily-streak\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/en/daily-streak.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/daily-streak#webpage\",\"url\":\"https://documentation.onesignal.com/docs/en/daily-streak\",\"name\":\"Daily streak journey\",\"description\":\"Use Journeys to build daily streak reminders that keep users coming back, using last session time or tags and custom events.\",\"dateModified\":\"2026-05-18T21:51:21.617Z\",\"isPartOf\":{\"@id\":\"https://documentation.onesignal.com#website\"},\"breadcrumb\":{\"@id\":\"https://documentation.onesignal.com/docs/en/daily-streak#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://documentation.onesignal.com/docs/en/daily-streak#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Retain and re-engage\",\"item\":\"https://documentation.onesignal.com/docs/en/paid-plan-renewal-expiry\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Daily streak journey\",\"item\":\"https://documentation.onesignal.com/docs/en/daily-streak\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://documentation.onesignal.com/docs/en/daily-streak#article\",\"headline\":\"Daily streak journey\",\"name\":\"Daily streak journey\",\"description\":\"Use Journeys to build daily streak reminders that keep users coming back, using last session time or tags and custom events.\",\"url\":\"https://documentation.onesignal.com/docs/en/daily-streak\",\"mainEntityOfPage\":{\"@id\":\"https://documentation.onesignal.com/docs/en/daily-streak#webpage\"},\"dateModified\":\"2026-05-18T21:51:21.617Z\",\"keywords\":\"daily streak, streak, journey, retention, reminders, habit, repeat, daily\",\"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","href":"/docs/en/loyalty-journey"},{"title":"Flash sale Journey","href":"/docs/en/flash-sale"},{"title":"Back-in-stock alerts","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","description":"Win back users who turn off auto-renew and remind them before their paid plan expires, using a Custom Event entry trigger plus date-relative Wait Until steps.","href":"/docs/en/paid-plan-renewal-expiry"},{"title":"Daily streak journey","href":"/docs/en/daily-streak"},{"title":"Get more app store reviews","description":"Prompt users to review your app using OneSignal in-app messages with native iOS and Android review prompts, reducing friction and increasing ratings.","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":"Daily streak journey - OneSignal","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["07c022d89b","a74be98ba7","a9bb46feb3"],"chunks":["Frame-DXXFP6nH.js","DynamicMarkdown-B54_zNBF.js","zoom-image-lightbox-BG6oD64b.js","lightbox-handle-r17bVUz3.js","Markdown-DfhCTwyA.js","clsx-xpJZXxdP.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BTZUMDnx.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-DqdKa2R4.js"]}