See also: Frequency Caps REST API reference for request/response shapes, status codes, and error semantics.
Frequency Caps
Frequency caps are system-wide delivery caps that automatically block offers when their budget is exhausted. They operate independently of contact policies — contact policies protect individual customers, while frequency caps protect the business from over-delivery.Cap Scopes
A
global-scoped cap needs no scopeId. When its budget is exhausted it excludes every candidate at decision time, and each response increments it once — symmetric with offer, category, and channel caps.How It Works
- Frequency caps are checked during the Contact Policy stage of the decision pipeline
- The system queries
frequency_capsfor the tenant whereenabled=trueandresetAt > now() - Any cap where
currentCount >= maxVolumeadds its scope to the exclusion set - Candidates matching excluded scopes (offer, category, or channel) are filtered out
Counter Increment
ThecurrentCount is incremented by the Respond API when an impression outcome is recorded:
- Only impression-type outcomes increment the counter (clicks/conversions don’t)
- The increment is atomic (prevents race conditions in concurrent delivery)
- Counters reset when
resetAtpasses (configured per cap)
Configuration
Frequency caps are stored in thefrequency_caps table:
Best Practices
- Set channel-level caps for batch channels (Direct Mail, SMS) to control vendor costs
- Set offer-level caps for limited-inventory promotions
- Monitor
currentCountvsmaxVolumein the Operations dashboard - To keep a channel’s placements consistent when a cap empties one of them, use the channel’s coupling mode (
Channel.couplingMode, or a per-flowDecisionFlow.couplingOverride). The old Group-nodeallowPartialflag is deprecated and now a no-op.