Recurring Notifications
Recurring schedules are available on the Premium+ plan only. You will receive a 403 PLAN_FEATURE_UNAVAILABLE error if you attempt to use schedules on a Basic or Standard plan. To upgrade your plan, visit your billing settings.
Recurring notifications let you send a push notification on a repeating cadence — every Monday morning, the first of each month, every six hours, or any other pattern you can express as a cron expression.
This guide walks through every step: upgrading your plan, creating a template, setting up a schedule in the dashboard, verifying delivery, handling timezones, and pausing or resuming a schedule.
1. Prerequisites: Upgrade to the Premium+ Plan
Recurring schedules require the Premium+ plan. Before you can create a schedule, make sure your workspace is on the correct plan.
- Log in to the Hober Dashboard and go to Settings > Billing.
- Confirm the Current Plan field shows Premium+.
- If not, click Upgrade Plan and follow the checkout steps.
After upgrading, the Schedules section becomes visible in the left sidebar.
2. Create a Notification Template
Every schedule references a notification template for its title and body content. If you have not already created a template for your recurring notification, do that first.
See the Notification Templates guide for a full walkthrough. At minimum, you need a template with a Title and Body before continuing.
Once you have saved the template, copy its ID from the template detail page — you will need it when creating the schedule.
3. Create a Schedule via the Dashboard
-
Navigate to Schedules in the left sidebar.
-
Click New Schedule (or go directly to
/schedules/new). -
Fill in the form:
Field What to enter Template Select the template you created in step 2. Channels Choose one or more channels (e.g. browser, iOS, Android) the notification will be sent through. Target audience Choose All subscribers or a specific segment. Cron expression Enter a 5-field cron expression (see the cron reference table). Timezone Select an IANA timezone (e.g. America/New_York,Europe/London,UTC).Active Leave toggled on to start the schedule immediately. -
Click Save Schedule.
The dashboard confirms the schedule was created and shows the Next run time computed from your cron expression and timezone.
Creating a schedule via the API
If you prefer the API directly:
curl -X POST https://api.hober.io/api/v1/schedules \
-H "X-SDK-Key: YOUR_SDK_KEY" \
-H "Content-Type: application/json" \
-d '{
"cron_expression": "0 9 * * 1",
"timezone": "America/New_York",
"template_id": "tpl_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"channel_ids": ["ch_11111111-2222-3333-4444-555555555555"],
"target": { "type": "all" },
"active": true
}'
A successful response returns 201 Created with the full schedule object including the next_run_at timestamp.
4. Verify the Schedule Fires
After the first cron window passes, confirm the notification was sent:
- Navigate to History in the left sidebar (or go to
/history). - Use the Source filter and select Schedule to show only schedule-triggered notifications.
- Locate the row matching your schedule's first expected run time.
- Click the row to see delivery details: recipients targeted, successful deliveries, and any failures.
If the expected run does not appear in history, check:
- The schedule's Active toggle is on.
- The Next run time shown on the schedule detail page has already passed (accounting for the timezone you chose).
- Your account is still on the Premium+ plan.
5. Timezone Handling
Always specify a named IANA timezone — never a UTC offset string like +05:30. Named timezones handle Daylight Saving Time (DST) transitions automatically; raw offsets do not.
DST gotchas
When a DST transition shifts the clock, the wall-clock time stays the same but the UTC offset changes. For example, a schedule set to 0 9 * * 1 in America/New_York fires at:
- 9:00 AM EST (UTC-5) during winter — fires at 14:00 UTC
- 9:00 AM EDT (UTC-4) during summer — fires at 13:00 UTC
This is usually the correct behaviour: you want the notification to reach users at 9 AM their local time, regardless of the season.
If you need a notification to fire at an exact UTC time regardless of local clock changes (e.g. a financial cut-off), use timezone: "UTC" and adjust your cron expression accordingly.
Recommended timezones
| Region | IANA identifier |
|---|---|
| US Eastern | America/New_York |
| US Pacific | America/Los_Angeles |
| UK | Europe/London |
| Central Europe | Europe/Berlin |
| India | Asia/Kolkata |
| UTC | UTC |
6. Pause and Resume a Schedule
To stop a schedule from firing without deleting it, set active to false.
Via the dashboard
- Open the schedule in the Schedules list.
- Toggle the Active switch off.
- The toggle turns grey and the Next run field shows Paused.
To resume, toggle the switch back on. The next run is recalculated from the current time.
Via the API
# Pause
curl -X PATCH https://api.hober.io/api/v1/schedules/sch_a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H "X-SDK-Key: YOUR_SDK_KEY" \
-H "Content-Type: application/json" \
-d '{ "active": false }'
# Resume
curl -X PATCH https://api.hober.io/api/v1/schedules/sch_a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H "X-SDK-Key: YOUR_SDK_KEY" \
-H "Content-Type: application/json" \
-d '{ "active": true }'
Both requests return 200 OK with the updated schedule object.
7. Cron Expression Tips
Cron expressions follow the standard 5-field format. Here are the most common patterns — see the full cron reference table for more examples.
| Expression | Fires |
|---|---|
0 9 * * 1 | Every Monday at 9:00 AM |
0 */6 * * * | Every 6 hours |
30 8 1 * * | 1st of every month at 8:30 AM |
0 12 * * 1-5 | Weekdays at noon |
0 0 * * * | Daily at midnight |
Tips:
- Use
*/Nin the hour field to repeat every N hours (e.g.*/6= every 6 hours). - Use a range in the day-of-week field (e.g.
1-5) to target Monday through Friday. - Test your expression with an online cron parser before saving a production schedule.
- Remember that the expression is always evaluated in the
timezoneyou set on the schedule, not UTC.