Skip to main content

Fatigue Budgets

Every send decision in Hober optimizes one message. The fatigue budget is the backstop that watches the sum: a hard weekly ceiling on how many marketing messages any one subscriber receives — across push, email, SMS, and WhatsApp combined. Campaigns, journeys, and digests all count against the same line.

Fatigue budgets are available on every plan. Protecting subscribers is not an upgrade feature.


The rule, in full

  1. One number: the most marketing messages a subscriber may receive in a rolling 7-day window, across all channels and all send types. Range 0–100; 0 means off, and off is the default — Hober never starts dropping your messages without you turning the budget on.
  2. Transactional never counts and is never blocked. Order confirmations, receipts, password resets always deliver, budget or no budget.
  3. Enforced at the same gate as consent. The budget check runs inside the per-recipient delivery decision, after suppressions, opt-in consent, and per-category frequency caps — so a message held back by the budget is always a message that would otherwise have delivered, and the suppression reason (budget_exhausted) always means exactly that.
  4. Fail open. If the budget can't be evaluated (an outage, a meter error), the message delivers. A protection feature must never become an availability risk.

Turning it on

Settings → Weekly fatigue budget. Set the number, save. Via the API:

PUT /api/v1/settings/fatigue-budget
{ "weekly_budget": 10 }

GET on the same path returns the setting together with its effect:

{ "weekly_budget": 10, "weekly_suppressed": 47 }

weekly_suppressed is the trailing-7-day count of messages held back by the budget — the knob and its consequence on one endpoint, and side by side on the Settings page ("47 held back this week").

Reading the results

Messages held back by the budget are counted like holdouts — honestly, in aggregate, never as per-recipient logs:

  • Per send: the send's detail page (History) shows "N held back by the weekly fatigue budget" when it happened.
  • Per week: the Settings page total above.

How it composes

ControlScopeQuestion it answers
Quiet hourstime of dayWhen is it okay to interrupt?
Frequency capsper category, per windowHow often for this kind of message?
Digest batchingjourney stepsDoes this need to interrupt at all?
Fatigue budgeteverything, weeklyHow much is too much, in total?

They stack: a message must pass all of them. Digests help you stay under the budget (a bundle is one message); the budget catches whatever still slips through.

What fatigue budgets deliberately do not do

  • No per-channel budgets in v1 — the whole point is the cross-channel total.
  • No ML pacing — one published number, enforced literally.
  • No transactional impact, ever.
  • No retroactive queueing — a held-back message is suppressed and reported, not delayed. If it mattered enough to guarantee delivery, it should be transactional or inside the budget.