Skip to main content

Frequency Capping (Touching Rules)

Touching Rules are Joryio's frequency capping: workspace-level limits on how many times you may "touch" each individual user - per channel, per time window. Once a user is at a cap, further sends to them are skipped until the window rolls over, no matter which campaign or journey tries to reach them.

Open Settings → Touching Rules in the dashboard to configure them. (Viewing requires the touching_rules:read permission.)

Anatomy of a rule

Each channel card holds an on/off toggle and 1 to 4 rules. Every rule says:

Max N messages per Day / Week / Month, applying to all messages or only to messages carrying certain tags.

Rules on a channel are AND-ed: a send must be under every applicable rule's cap, and the first rule that is at or over its cap blocks the send.

Tag scoping

  • A rule with no tags applies to every message on that channel.
  • A rule with tags only counts and caps messages that carry at least one of those tags (OR within the rule). Tags come from the same workspace-wide pool you use on campaigns, journeys, and templates - see Tags.

This makes layered policies possible, as the settings page itself points out: "3 push/day for #promo AND 10 push/day overall" is two meaningful caps, not a redundant pair. If two rules on the same card share both the window and the tag scope, the page flags them as Redundant - the stricter one wins, so add a tag to differentiate or remove one.

Channels

ChannelIn-product guidance
Push NotificationsRecommended: 5–10 / day for optimal engagement.
Email MessagesRecommended: 3–7 / week to avoid spam complaints.
SMS MessagesRecommended: 1–3 / week - SMS is the most expensive channel.
In-App MessagesRecommended: 10–20 / day - least intrusive channel.
WhatsApp MessagesRecommended: 3–5 / day to comply with WhatsApp policies.
Viber MessagesRecommended: 3–5 / day to comply with Viber policies.
Webhook CallsRecommended: 30–50 / day, depending on integration.

All channels ship disabled by default - no capping happens until you switch a channel (or the cross-channel limit) on and save.

The cross-channel limit (master rule)

Above the per-channel cards sits the Cross-channel limit. When enabled, it is a ceiling on the user's total touches across all channels combined - a user could be under every per-channel cap and still be blocked because the combined ceiling is reached. It supports the same 1–4 tag-scoped rules as any channel. In-app impressions count toward this ceiling too.

The page's overview bar visualizes this: each enabled channel's untagged budget stacks into a bar, with a dashed line marking the cross-channel ceiling. If the per-channel budgets add up to more than the ceiling, the overage is shown as "capped" - the ceiling wins. (Tagged rules cap subsets and are not included in that overview.)

What counts as a "touch"

Caps are counted against the user's real, recorded message history - not per campaign:

  • Email, SMS, push, WhatsApp, Viber, webhook - each successfully dispatched message (the message.sent event).
  • In-app - in-app messages are pulled by your app rather than pushed, so the impression (the in_app.displayed event) is what counts.
  • Count failed deliveries (under Additional settings, off by default) - when on, failed delivery attempts (message.failed) also consume budget on the push-style channels. In-app has no failure event, so this doesn't apply there.

Because counting reads the shared event stream, touches from campaigns and journeys accumulate together against the same caps.

Time windows

"Per day / week / month" is measured against your workspace's timezone (set in workspace settings), not the server clock:

  • Day - since midnight, workspace time.
  • Week - since Monday 00:00, workspace time (ISO week).
  • Month - since the 1st of the month, workspace time.

Windows are calendar-anchored, not rolling: at the boundary everyone's count starts from zero again.

What happens to a blocked send

A send that hits a cap is skipped, not delayed. (Contrast with quiet hours, which defer a message to the end of the quiet window.)

  • Campaigns - the over-cap user is skipped during the send and a message.skipped platform event is recorded with reason frequency_cap, so you can see exactly who was capped and why. See Platform events.
  • Journeys - the message node is skipped for that user and the journey continues down its path; the skip is recorded the same way. A skipped message never blocks the rest of the journey.
  • Webhook nodes - gated by default like any message (a webhook often triggers a user-facing touch in another system). A node's System call - skip quiet hours & frequency caps option opts a pure system-to-system call out; see Canvas nodes.
  • In-app - a user at their in-app cap simply isn't shown eligible in-app messages until the window rolls over.

Order of evaluation

Frequency caps are one gate in the send pipeline. A message must first pass suppression lists, consent/subscription checks, and quiet-time; then the frequency caps run; send-volume rate limits apply after that. So a cap only ever "spends" budget on messages that were otherwise going to be delivered.

Within the caps themselves:

  1. Only rules whose tag scope matches the message's tags participate.
  2. Every applicable per-channel rule is checked, then every applicable cross-channel rule.
  3. The first rule at or over its cap blocks the send; otherwise it proceeds.

Related controls that are not frequency capping:

Bypassing caps for a specific message

Individual campaigns and journey message nodes have an Ignore Touching Rules (Frequency Limits) option that bypasses workspace-level capping for that send only. The settings page's own guidance: use it for security alerts, transactional receipts, legal notices, and account status changes - not for promotions. In campaigns it lives in the delivery step alongside the quiet-time override; in the journey builder it's in each message node's advanced delivery options.

Two things to know about the override:

  • It skips the check and the count for that message - but the message still lands in the event stream as a real send, so it does consume other messages' budget going forward.
  • Suppression lists still apply; the override never resurrects a suppressed or unsubscribed user.

Editing and saving

Changes take effect when you press Save Settings - new rules apply to sends within about a minute (settings are briefly cached on the sending fleet). Reset reloads the last saved state, discarding unsaved edits.

Reliability notes

  • Caps are enforced atomically: two journey executions racing to send the last allowed message to the same user cannot both slip through.
  • The system is deliberately fail-open: if the counting infrastructure is briefly unavailable, messages are delivered rather than blocked. A frequency cap will never hard-stop your sending on an infrastructure blip.