Skip to main content

Quiet Hours, Frequency Caps & Consent

Reaching your audience is only half the job — reaching them respectfully is the other half. Hober enforces three delivery controls on your behalf: consent (only message people who opted in), frequency caps (don't message the same person too often), and quiet hours (don't wake anyone up at 3 a.m.).

These controls are evaluated by the platform itself, per recipient, as messages are delivered. They apply to every send path — one-off sends from the Composer, API sends, campaigns, journeys, recurring schedules, and sends initiated by a connected AI agent (see Agent Access (MCP)). There is no client that bypasses them.


1. Message categories: marketing vs. transactional

Every message carries a category, and every category is either marketing or transactional:

  • Transactional messages (receipts, security alerts, delivery updates) always deliver. They are exempt from consent checks, suppression lists, and frequency caps.
  • Marketing messages are opt-in: a recipient with no recorded subscription for the channel and category is not sent the message.

Because the transactional exemption is absolute, reserve transactional categories for messages the recipient genuinely needs — misusing them for promotions is the fastest way to spam complaints.


2. The delivery guardrail

For each marketing message, each recipient passes through a fixed sequence of checks. The first blocking rule wins:

OrderCheckSuppress reason
1Transactional category?— (always delivered, no further checks)
2Recipient on the suppression list (hard bounce, spam complaint, unsubscribe)?bounced, spam, or unsubscribed
3Recipient opted in to this channel + category?unsubscribed
4Frequency cap for the category exceeded?frequency_capped

A recipient who fails any check is skipped before any delivery is attempted — nothing is queued, sent, or retried for them. Your job still completes normally; the delivered totals simply reflect only the recipients who passed the guardrail. A heavily suppressed audience is not an error, it is the controls working.


Opt-in policy per channel

You choose how consent is established per channel under Settings. Each messaging channel — iOS push, Android push, web push, in-app, email, SMS, and WhatsApp — can use one of two opt-in modes:

  • Implicit — registering the device or address counts as consent. Typical for push channels, where the recipient already granted an OS-level permission prompt.
  • Explicit — only an explicitly recorded consent counts. Recipients without one are treated as unsubscribed. Typical for email, SMS, and WhatsApp.

The suppression list

Independently of opt-in state, recipients land on the suppression list when their address hard-bounces, when they file a spam complaint, or when they unsubscribe. Suppressed recipients block before the consent check — re-subscribing them requires a fresh, explicit action from the recipient, not from you.


4. Frequency caps

A frequency cap limits how many marketing messages a single subscriber can receive in a category over a rolling window — for example, at most 3 messages per 24 hours. Caps are defined as a maximum delivery count plus a window length, per category:

  • The count is based on actual deliveries recorded for that subscriber in the category, not on attempts.
  • When a subscriber is at the cap, further sends in that category are suppressed with reason frequency_capped until older deliveries roll out of the window.
  • Transactional categories are never capped.
  • A workspace-level default cap can apply to marketing categories that have no explicit policy of their own.

Frequency cap policies are managed per workspace and are not yet self-serve editable in the dashboard.


5. Quiet hours

Quiet hours define a daily window during which scheduled messages are deferred, not dropped. The default window is 22:00–08:00.

How the window is evaluated

  • The window is evaluated in each recipient's local timezone, not in UTC and not in yours. When a recurring schedule fires, delivery fans out per timezone group, and each group's send time is checked against the window in that timezone. Recipients whose stored timezone is unknown or stale fall back to the schedule's fallback timezone.
  • Both overnight windows (e.g. 22:00–08:00) and intraday windows (e.g. 13:00–14:00) are supported.
  • A send that lands inside the window is moved to the end of the quiet window — for a 22:00–08:00 window, a message that would have fired at 23:30 goes out at 08:00 the next morning instead.

Audit trail

Each deferral is recorded in the job's delivery log with status quiet_hours_deferred, including the original scheduled time and the time it was deferred to, so you can always see why a scheduled send arrived later than configured.

Exemptions

  • Schedules can set a quiet-hours override (quiet_hours_override) for messages that must go out on time, such as transactional alerts.
  • Inbox-only in-app messages are exempt: they wait silently in the user's in-app inbox rather than interrupting anyone, so there is nothing to defer. See In-App Experiences.

The Settings page shows your workspace's delivery timezone, which is used for delivery scheduling and quiet hours and is separate from the display timezone used for dashboard charts.


6. What you see after a send

  • Delivered / failed counts on the notification detail page include only recipients that passed the guardrail; suppressed recipients are excluded from the attempt entirely.
  • Quiet-hours deferrals appear in the delivery log with status quiet_hours_deferred and the deferred-to time.
  • Suppression is per recipient, per message — a subscriber capped today is eligible again once their window rolls over, and a subscriber unsubscribed from one category can still receive others they are opted in to.

If your delivered totals look low, check the audience's opt-in state and category before assuming a delivery problem: with an explicit opt-in policy and no recorded consents, a marketing send legitimately delivers to no one.