Build a scheduled daily reminder system in Bubble using backend API workflows that run every 24 hours. This tutorial shows how to create a recurring workflow that finds users due for reminders, sends personalized emails or in-app notifications, and handles timezone differences so each user gets reminded at their preferred local time.
Overview: Setting Up Automatic Daily Reminders in Bubble
Daily reminders keep users engaged with your app — whether it is a task reminder, habit tracker prompt, or subscription renewal notice. This tutorial uses Bubble's backend API workflows with recursive scheduling to create a system that runs every 24 hours, finds users who should receive a reminder, and sends personalized emails.
Prerequisites
- A Bubble app on the Growth plan or higher
- Backend workflows enabled in Settings → API
- A User data type with email addresses
- Basic understanding of backend workflows and scheduling
Step-by-step guide
Add reminder preference fields to the User data type
Add reminder preference fields to the User data type
Go to the Data tab, select the User data type, and add fields: reminder_enabled (yes/no, default yes), reminder_time (text, e.g. '09:00'), reminder_timezone (text, e.g. 'America/New_York'), and last_reminder_sent (date). These let each user control whether they receive reminders and at what time.
Expected result: The User data type has fields for reminder preferences and tracking.
Create the daily reminder backend workflow
Create the daily reminder backend workflow
Navigate to Backend workflows. Create a new workflow called send_daily_reminders. This workflow does not need external parameters. Add a step: Do a search for Users where reminder_enabled is yes and last_reminder_sent is less than Current date/time rounded down to day (ensuring each user gets only one reminder per day). For each user found, schedule a send_single_reminder workflow.
Expected result: A backend workflow that finds all users due for a reminder today.
Create the individual reminder workflow
Create the individual reminder workflow
Create another backend workflow called send_single_reminder with a parameter: user (type User). Add a Send email action with the recipient set to user's email, subject like 'Your Daily Reminder', and a personalized body using dynamic data such as the user's name and relevant app data. After sending, add Make changes to user setting last_reminder_sent to Current date/time.
Pro tip: Include a one-click unsubscribe link in the email that sets reminder_enabled to no via a backend workflow triggered by URL.
Expected result: Each user receives a personalized email and their last_reminder_sent date is updated.
Set up the recurring schedule
Set up the recurring schedule
The daily reminder workflow needs to reschedule itself. At the end of the send_daily_reminders workflow, add a Schedule API Workflow action that schedules send_daily_reminders to run again in 24 hours (Current date/time plus 24 hours). This creates a self-perpetuating daily loop. To start the loop the first time, manually schedule the initial run from a one-time admin workflow or the API Workflow admin page.
Pro tip: Add a termination condition by checking an app-level setting (e.g., an Option Set flag) to stop the loop if needed.
Expected result: The reminder workflow runs every 24 hours automatically, rescheduling itself each time.
Add a user preference page for reminder settings
Add a user preference page for reminder settings
Create a settings section on your user profile page. Add a Checkbox for enabling reminders (bound to Current User's reminder_enabled), a Time Picker or dropdown for preferred time, and a timezone dropdown. Create a Save workflow that updates the Current User's reminder fields. Show a confirmation message after saving.
Expected result: Users can enable/disable reminders and choose their preferred notification time.
Handle timezone-aware scheduling
Handle timezone-aware scheduling
Instead of sending all reminders at one fixed UTC time, the send_daily_reminders workflow should filter users whose reminder_time matches the current hour in their timezone. Add a constraint or post-search filter: users whose reminder_time converted to UTC equals the current UTC hour. This ensures users get reminders at their preferred local time rather than a fixed server time.
Expected result: Users receive reminders at their configured local time regardless of timezone.
Complete working example
1DAILY REMINDERS — WORKFLOW SUMMARY2====================================34DATA MODEL5 User (additional fields):6 - reminder_enabled (yes/no, default: yes)7 - reminder_time (text, e.g. '09:00')8 - reminder_timezone (text, e.g. 'America/New_York')9 - last_reminder_sent (date)1011BACKEND WORKFLOW: send_daily_reminders12 (Runs every hour to check all timezones)13 Step 1: Search for Users14 - reminder_enabled = yes15 - last_reminder_sent < start of today16 - reminder_time matches current UTC hour for user's timezone17 Step 2: Schedule API Workflow on a list18 → send_single_reminder for each matching user19 Step 3: Schedule API Workflow20 → send_daily_reminders in 1 hour (hourly loop)2122BACKEND WORKFLOW: send_single_reminder23 Parameter: user (User)24 Step 1: Send email25 - To: user's email26 - Subject: Your Daily Reminder27 - Body: personalized content with user's name28 Step 2: Make changes to user29 - last_reminder_sent = Current date/time3031FRONTEND: User Settings32 Checkbox: Enable reminders → reminder_enabled33 Dropdown: Reminder time → reminder_time34 Dropdown: Timezone → reminder_timezone35 Button: Save → Make changes to Current UserCommon mistakes when scheduling daily reminder workflows in Bubble
Why it's a problem: Forgetting the termination condition for recursive workflows
How to avoid: Check an app-level flag (like an Option Set value) at the start of the workflow. If disabled, do not reschedule.
Why it's a problem: Sending duplicate reminders on the same day
How to avoid: Always update last_reminder_sent immediately after sending and add a search constraint to exclude users reminded today.
Why it's a problem: Not handling email delivery failures
How to avoid: Consider using SendGrid or another email service via API Connector for delivery tracking and retry logic.
Best practices
- Include an unsubscribe link in every reminder email
- Track last_reminder_sent to prevent duplicate sends
- Run the scheduler hourly to handle different timezone preferences
- Use backend workflows (not frontend) so reminders send even when no one is using the app
- Log reminder sends in a separate data type for debugging
- Test with a small group before enabling for all users
- Monitor your WU consumption — bulk email workflows can consume significant workload units
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I need to build an automatic daily reminder system in Bubble.io that sends personalized emails to users every morning at their preferred time. How do I set up recurring backend workflows, handle timezones, and let users manage their preferences?
Create a daily reminder system. Add reminder preference fields to the User data type. Build a recurring backend workflow that runs daily, finds users due for reminders, and sends personalized emails. Add a settings page where users can enable/disable reminders and set their preferred time.
Frequently asked questions
Do I need a paid plan for daily reminders?
Yes. Backend workflows require the Growth plan or higher. Frontend scheduled workflows do not work when the user is not on the page.
How many reminders can Bubble send per day?
Bubble's built-in email sending has limits based on your plan. For high-volume sending (1000+ emails/day), use SendGrid or Mailgun via the API Connector.
Can I send reminders via SMS instead of email?
Yes. Replace the Send email action with an API Connector call to Twilio or another SMS provider. Store phone numbers on the User data type.
Will recursive workflows run up my WU costs?
Yes. Each email send consumes WUs. Monitor usage in Settings → Metrics and consider batching sends during off-peak hours.
How do I test the reminder workflow without waiting 24 hours?
Schedule the workflow to run in 1 minute instead of 24 hours during testing. Remember to change it back before going live.
Can RapidDev help build a notification system for my app?
Yes. RapidDev can build multi-channel notification systems with email, SMS, push notifications, timezone handling, and preference management.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation