Reminders that arrive at a sensible hour

Last updated: · By Radim Sekera

The point of a reminder is that materials show up without you having to remember to ask again. Get the cadence wrong and you get the opposite: a client who mutes your sender, or one who genuinely forgot and never hears from you until the deadline is gone. BriefGate's chase engine is built around getting that balance right by default, and adjustable when your project needs something else.

Why "every 3 days" is the wrong default

A fixed interval treats a client on day one the same as a client on day thirty, and a gentle branding project the same as an aggressive one with a hard deadline. Neither is true in practice. Early on, a short gap is reasonable — the client is still orienting, and a nudge two days in is barely a nudge. Weeks in, the same two-day gap reads as nagging, because whatever stopped them the first time hasn't changed just because you emailed again sooner.

BriefGate's built-in schedules decelerate: reminders start close together, while the ask is still fresh, and space out the longer it goes unanswered — the way a person would actually follow up by hand, without you hand-tuning an interval per client. Pick a schedule once, when you call define_intake, and the engine runs it: timing, deduplication, and quiet hours handled from that point on.

The five schedules

Schedule Reminders Cadence
gentle T+3d, T+8d, then every 14 days For sensitive client relationships
default T+2d, T+5d, T+9d, then weekly Recommended for most projects
aggressive T+1d, T+3d, T+5d, then every other day For hard deadlines
custom Every chase_interval chase_interval_unit (default every 3 days) When no preset fits
off None Manual only

Set it once, on the intake:

json
{
  "project_name": "Bella Cucina Website",
  "client": {"email": "owner@bellacucina.cz"},
  "items": [...],
  "chase_schedule": "default"
}

You are not locked into the choice — PATCH /v1/intakes/:id can change the schedule after the invite has already gone out, and BriefGate re-plans the remaining reminders from the new settings rather than making you delete the intake and start over (which would hand the client a second link).

One thing worth knowing before you reach for custom: the Free plan only has access to default and off. Solo, Studio, and Agency get all five.

Quiet hours, in the client's own time zone

A reminder that lands at 2am doesn't get read any faster — it just sits at the top of an inbox looking like it was sent by a machine, because it was. BriefGate holds reminders outside 8:00–19:00 in the client's own local time, set via client.timezone on the intake (defaults to UTC if you don't set it). If a scheduled send falls in that window, it isn't skipped — it's held until the next allowed time, so nobody misses a reminder, it just arrives at a decent hour.

That protection is on by default and can be turned off with respect_quiet_hours: false, which is worth doing for a deliberately rapid custom cadence — a 30-minute interval that respects quiet hours would otherwise sit idle for the entire night rather than checking in.

Weekends

Only the gentle schedule skips weekends outright. Every other schedule — default, aggressive, custom cadences included — sends on Saturday and Sunday too. If your project genuinely runs on a five-day week and a Saturday email would feel off, gentle is the schedule built for that; the others assume a reminder landing on a weekend is still useful to the client, even if you personally aren't working that day.

Stopping: completion, the cap, and a webhook instead of forever

The moment a client submits everything required, chasing stops automatically — there's no cleanup step on your side.

If they don't, BriefGate doesn't chase indefinitely either. Every intake has a reminder cap, max_reminders, defaulting to 3. Once that many reminders have been sent, the intake stalls: BriefGate cancels any reminders still scheduled and fires the intake.stalled webhook instead of continuing to email the client on its own. The webhook payload carries missing_items — the required items still outstanding, by key — so you know exactly what to raise when you follow up yourself.

That hard stop is deliberate, not a missing feature. An intake nobody has answered after three reminders won't be rescued by a fourth or a tenth on autopilot — it needs a human decision (different channel, different contact, or accept it's stalled), and every automated email until then spends your sending domain's reputation for no return. If a fast cadence genuinely needs more attempts before it's worth escalating — a 30-minute interval burns through 3 reminders in ninety minutes — raise max_reminders when you set the schedule. A stalled intake doesn't quietly resume just because you change the cadence: it stays stalled until max_reminders is raised past the number already sent, or set to "unlimited" — the same action that gets it moving again. Raising the cap doesn't dump every reminder the schedule missed while stalled onto the client at once; it picks the cadence back up at its next regular slot, the same as if it had never stopped.

A manual send_chase counts toward the cap the same as a scheduled reminder — it's one of the attempts, not a freebie outside the count.

What a bounce means — and why it goes to a person

Not every bounce means the address is dead, so BriefGate doesn't treat them all the same. A permanent bounce or a spam complaint retires the address immediately. A bounce that arrives after a confirmed delivery of the same message is left alone — usually a forwarding rule or quarantine gateway behind the client's real inbox, not a dead address, and treating it as dead would silently cancel every future reminder. A temporary bounce (full mailbox, greylisting) with no delivery is tolerated twice; the third undelivered one in a row retires the address.

Whenever an address is retired, BriefGate fires chase.bounced, marks that address as bounced on the intake, and stops sending to it — any other recipient on the same intake keeps being chased normally. That's why a bounce deserves a person, not another automated retry: the failures that survive BriefGate's own filtering (dead mailbox, spam complaint) are exactly the ones an email can't fix. chase.bounced is the signal to reach the client another way, not to wait for the schedule to try again.

Every reminder — scheduled or manual — carries the same magic link the client got in the very first invitation; BriefGate never issues a second one for the same intake. What each send does is extend how long that link stays valid: the TTL (portal_link_ttl_days, an account setting) counts down from the most recent email, so an active cadence keeps pushing the expiry out on its own. That's a practical upside for cadence design: a client who lost or deleted an earlier email doesn't need a recovery flow, since the next scheduled reminder hands them the exact same link, still working, and resets its clock in the process. If they're mid-fill with an active portal session, that session is a separate cookie and is unaffected either way.

Picking a schedule for the project

Whichever you pick, quiet hours and the reminder cap keep the client from ever seeing a flood — the engine is built to stop asking, not just to keep asking politely.