Health and fitness/Reminder timing

Send the reminder to the one who has not trained yet.

Signals tells your messaging tool the hour each user usually trains, whether they have finished a workout today and how long their streak is, so the reminder reaches the user who has not trained by their usual hour and stays quiet for the one who trained at lunch.

More streaks kept going

Keep more streaks going by timing the reminder to each user's own day.

A streak survives when the reminder reaches the right person before the day ends, and stays away from the one who has already trained. Signals gives your messaging tool each user's usual training hour, how many workouts they have finished today, the days they trained this month and how long since the last one. Your messaging tool decides who gets a reminder, which one, and when.

Send the reminder when their usual hour has passed, to them only

A user finishes a workout around seven most evenings. Tonight it is eight and the app has recorded nothing. The daily reminder went out at six to everyone, so it reached this user an hour before they would have trained anyway, and reached the lunchtime crowd hours after they had finished. The reminder that keeps this streak is the one that goes to this user once their usual hour has passed with no workout, and to nobody else.

What Signals knows
usual_workout_hour_30d
The hour of day they most often finish a workout, over the last 30 days
workouts_1d
Workouts finished in the last day
What your messaging tool does

Sends the reminder to a user whose usual hour has passed with no workout finished today, and skips the user whose usual hour is still ahead of them. The message and the channel stay with your messaging tool.

reminders.ts · 14 lines
// In the job that decides tonight's reminder sends, for each user
const user = await signals.getServiceAttributes({
  name: "fit_reminders_evening",
  attribute_key: "user_id",
  identifier: userId,
});
// { usual_workout_hour_30d: 19, workouts_1d: 0 }

// The hour comes from the event timestamp, which is UTC, so compare in UTC.
const hourNow = new Date().getUTCHours();

if (hourNow > user.usual_workout_hour_30d && user.workouts_1d === 0) {
  push.send({ userId, template: "usual_time_nudge" });
}

Try it on your own site.

Add the SDK, define one thing you want to know about a visitor, and watch it update while you click around. The free tier runs on the real engine: no card, no sales call.