Volume Constraints
Volume constraints 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 volume constraints protect the business from over-delivery.Constraint Scopes
| Scope | What It Controls | Example |
|---|---|---|
| offer | Caps delivery of a specific offer | ”Win-Back: max 20 impressions/day” |
| category | Caps all offers in a category | ”Auto Insurance: max 500/day” |
| channel | Caps all delivery on a channel | ”Direct Mail: max 50/day” |
How It Works
- Volume constraints are checked during the Contact Policy stage of the decision pipeline
- The system queries
volume_constraintsfor the tenant whereenabled=trueandresetAt > now() - Any constraint 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 constraint)
Configuration
Volume constraints are stored in thevolume_constraints table:
| Field | Type | Description |
|---|---|---|
name | string | Human-readable name |
scope | enum | offer, category, or channel |
scopeId | string | ID of the offer, category, or channel |
maxVolume | integer | Maximum delivery count per period |
period | string | Reset period: daily, weekly, monthly |
currentCount | integer | Current delivery count (auto-incremented) |
resetAt | timestamp | When the counter resets |
enabled | boolean | Whether the constraint is active |
Best Practices
- Set channel-level constraints for batch channels (Direct Mail, SMS) to control vendor costs
- Set offer-level constraints for limited-inventory promotions
- Monitor
currentCountvsmaxVolumein the Operations dashboard - Use
allowPartialin the Group node to gracefully handle exhausted placements