Prerequisites
A Captainbook account with at least one business unit configured and at least one product with pricing tiers.
The user creating rules must have the Create policy rule and Update policy rule permissions. To view existing rules, the View any policy rule permission is required.
At least one channel, widget, or product option to target (rules need something to apply to — though an "Apply Globally" rule works without any of these).
If you plan to target resellers specifically, you need the Marketplace channel enabled and at least one connected reseller.
What Policy Rules do
Policy Rules let you say things like:
"Give GetYourGuide bookings 15% off in August."
"Cap Viator at 30% of total capacity on weekends."
"All channels — including our own widget — get €10 off in the next 48 hours."
"Limit the entire business unit to 50 seats per day, across every channel combined."
Rules are non-destructive: your product prices and availability stay exactly as you entered them. The rule produces an overlay that's applied at booking time. If you disable or delete the rule, prices and capacity revert immediately — nothing to undo.
Step 1 — Open the Policy Rules index
In Captainbook, click Channels in the left navigation.
Click Policies in the Channels submenu.
You'll land on the Policy Rules index. If you haven't created any rules yet, you'll see a "No rules yet" empty state with a Create Rule button. Otherwise, every rule appears as a row showing its name, priority, status toggle, and a summary of what it targets.
Click New Rule (top-right) to start a new rule, or click an existing rule's name to edit it.
Step 2 — Fill in the rule
The form is split into six sections. You can fill them in any order — nothing is saved until you click Create Rule / Update Rule at the bottom.
General
Rule Name — operator-facing label that shows up in audit logs and the index. Use something a teammate can recognise three months from now (e.g. "August launch –15% GYG", not "Test 3").
Priority — lower numbers run first. If two rules touch the same booking, the lower-priority rule's adjustments apply before the higher-priority one. Defaults to 50; leave it there unless you have stacked rules you need to order.
Enabled — toggle. Disabled rules are skipped entirely. Useful for prepping a rule in advance of a campaign.
Targets
This section answers "who does this rule apply to?" All targets are combined with AND logic — adding more targets narrows the rule.
Apply Globally — when checked, the rule ignores Channels / Widgets / Resellers and matches every booking, including back-office (operator-created) bookings. Product Option, Weekdays, and Availability date range still apply. Use this for blanket campaigns ("everyone gets €5 off this weekend"). When this is on, the Conditionssection is disabled — global rules don't honour time-to-event conditions.
Channels (OTA) — specific OTA channels this rule targets (e.g. GetYourGuide, Viator). Leave empty to apply to all OTAs your widget rules already target.
Widgets (Direct) — specific booking widgets this rule targets (your own checkout surfaces). Leave empty to apply to all widgets.
Resellers — only visible once you've picked the Marketplace channel. Lets you target individual marketplace resellers (e.g. "Reseller A gets 10% off, others don't").
Product Options (Schedules) — restricts the rule to specific schedules. Leave empty to target all products in this business unit. Click Select all schedules to grab everything, or Clear all to reset.
Weekdays — only apply on these days of the week. The day is evaluated against the experience date (the slot's start), in your tenant timezone — not against the booking date.
Availability date range — only apply to slots whose start time falls between these two datetimes. Different from the campaign window (below): this gates which slots qualify, not when the rule is active.
Conditions
Time-based conditions evaluated at booking time. All conditions must be met (AND logic).
Hours to event — adds a clause like "more than 72 hours before the experience starts" or "fewer than 24 hours before". 72 hours = 3 days; 168 = 1 week; 720 = 30 days. Use this for last-minute discounts ("less than 48 hours = –20%") or early-bird campaigns ("more than 60 days = –15%").
Click + Add condition to stack more, all combined with AND.
If the rule targets an OTA channel (or has Apply Globally on), this whole section is disabled. OTAs and back-office bookings don't pass time-to-event context, so any conditions you set would be silently stripped on save.
Actions
What the rule actually does. You can add multiple actions and they all apply.
Action type:
Price % — percentage adjustment on each pricing tier (e.g. 15% decrease = customer pays 85%).
Price flat — fixed amount in subunits (10000 = €100.00). Subtracted (or added) from each tier.
Capacity % — caps per-channel capacity at a percentage of cumulative capacity. "Cap Viator at 30%" = Viator can never sell more than 30% of the slot, even if seats are still available.
Capacity flat — caps global capacity at a hard number, shared across every channel. "Cap at 50 pax" = once 50 bookings exist across all channels, no one else can book.
Op (decrease / increase) — appears for Price types only. Decrease = discount, Increase = surcharge.
Value — the percentage (0–100) or amount.
Apply to pricing categories — restrict the action to specific tiers (e.g. only "Adults", not "Children"). Leave on All categories to hit every tier.
Click + Add action to stack. Common stacks: a Price % discount + a Capacity % cap, so the discounted channel doesn't eat all your inventory.
Guardrails & Timing
Minimum Price / Maximum Price — clamps the final fare for this rule. If a stacked discount would drop a fare below the minimum (or above the maximum), the guardrail wins. Useful as a safety net when several percentage rules stack.
Campaign Start / Campaign End — when the rule itself is active. Distinct from Availability date range: Campaign Start/End gates when the booking is created (real time), while Availability date range gates which slot it's for (event time). A flash sale tomorrow that applies only to next week's slots uses both.
Preview / Simulate
Before saving — and any time after — you can dry-run the rule.
Pick a Product Option (limited to the schedules you scoped above).
Pick an Availability date — the slot to simulate against.
Optionally set As-of to a future or past datetime. Pretend "now" is this. Useful for testing time-to-event conditions in advance.
Click Simulate.
The result panel shows, per channel the rule touches, the adjusted fare for each tier, the resulting per-channel and global capacity, and which rules applied (including any existing saved rules that already match — so you can see the full cascade, not just this rule in isolation).
If a channel doesn't match the rule's scope, you'll see "does not match" with the reason. Fix the scope, re-simulate.
Step 3 — Save and verify
Click Create Rule (or Update Rule when editing).
You're returned to the index. The new rule appears with its enabled toggle on (or off, if you left the Enabled checkbox unchecked).
Open any availability or booking the rule should affect — the Applied policy rules panel shows which rules matched, in priority order, and what adjustments they made.
Customers booking via the targeted channel/widget will see the adjusted price the next time prices are computed (usually within seconds for direct widgets; OTA updates are pushed to the channel within the channel's own refresh window).
Managing your rules
List rules — the index at Channels → Policies shows every rule in this business unit, with its name, priority, scope summary, and status toggle.
Enable / disable instantly — flip the toggle on any row. Takes effect on the next booking; no re-save needed.
Duplicate a campaign — open the rule, change the Name, adjust the Campaign Start/End, and Create Rule. (There's no one-click duplicate yet — copy by editing then changing the name.)
Delete — click the trash icon on any row, confirm. Deletion is permanent, but because rules are non-destructive, your underlying prices and availability are unaffected.
See where a rule was applied — open the booking or availability detail page. The Applied policy rules / Policy rule cascade panel lists every rule that matched, what it changed, and (for marketplace bookings) which reseller context it ran under.
Troubleshooting
"My discount didn't show up on the customer's checkout" — Check that the rule's Channels or Widgets target includes the surface the customer is on. If empty, the rule applies to every channel/widget; if filled, only the listed ones. Also check Campaign Start/End — a rule starting at 09:00 won't apply to a booking at 08:55.
"The Conditions section is greyed out" — The rule targets an OTA channel, or Apply Globally is on. OTAs and global rules don't get time-to-event context. Either remove the OTA from Channels (and use Widgets only), or accept that time-to-event won't apply here.
"Reseller dropdown is missing" — Pick the Marketplace channel under Channels (OTA) first. The reseller selector only appears once Marketplace is in scope.
"My capacity cap isn't holding" — Capacity % is per-channel (this channel only). Capacity flat is global (across all channels). If you wanted "no more than 50 total bookings across all channels", use Capacity flat, not Capacity %.
"Two rules contradict each other" — Rules apply in priority order (lower number first). The later rule sees the fare/capacity after earlier rules. Use Minimum Price / Maximum Price as a hard guardrail when stacking percentage discounts.
"Simulate says 'does not match'" — The result panel will tell you which scope check failed (channel, product, weekday, date range, condition). Fix that field and re-simulate.
"I disabled a rule but old bookings still show the discount" — Existing bookings keep the price they were created with. Disabling a rule only affects new bookings from that point on.Prerequisites
A Captainbook account with at least one business unit configured and at least one product with pricing tiers.
The user creating rules must have the Create policy rule and Update policy rule permissions. To view existing rules, the View any policy rule permission is required.
At least one channel, widget, or product option to target (rules need something to apply to — though an "Apply Globally" rule works without any of these).
If you plan to target resellers specifically, you need the Marketplace channel enabled and at least one connected reseller.
What Policy Rules do
Policy Rules let you say things like:
"Give GetYourGuide bookings 15% off in August."
"Cap Viator at 30% of total capacity on weekends."
"All channels — including our own widget — get €10 off in the next 48 hours."
"Limit the entire business unit to 50 seats per day, across every channel combined."
Rules are non-destructive: your product prices and availability stay exactly as you entered them. The rule produces an overlay that's applied at booking time. If you disable or delete the rule, prices and capacity revert immediately — nothing to undo.
Step 1 — Open Channel Policies
In Captainbook, open Products from the left navigation.
In the Quick Actions section of the Products index, click Channel Policies.
You'll land on the Channel Policies page (titled "Channel Policies — Manage pricing and capacity rules per channel"). If you haven't created any rules yet, you'll see a "No rules yet" empty state with a Create Rule button. Otherwise, every rule appears as a row showing its name, scope summary, action summary, and an enable/disable toggle.
Click New Rule (top-right) to start a new rule, or click an existing rule's name to edit it.
You can also drag rules up or down by the handle on the left edge of each row to reorder them — this rewrites the Priority field directly, no save button needed. Lower rows = higher priority = run first.
Step 2 — Fill in the rule
The form is split into six sections. You can fill them in any order — nothing is saved until you click Create Rule / Update Rule at the bottom.
General
Rule Name — operator-facing label that shows up in the index and the cascade panel. Use something a teammate can recognise three months from now (e.g. "August launch –15% GYG", not "Test 3").
Priority — lower numbers run first. If two rules touch the same booking, the lower-priority rule's adjustments apply before the higher-priority one. Defaults to 50. You can edit the number here, or drag-reorder rows on the index — both write the same field.
Enabled — toggle. Disabled rules are skipped entirely. Useful for prepping a rule in advance of a campaign.
Targets
This section answers "who does this rule apply to?" All targets are combined with AND logic — adding more targets narrows the rule.
Apply Globally — when checked, the rule ignores Channels / Widgets / Resellers and matches every booking, including back-office (operator-created) bookings. Product Option, Weekdays, and Availability date range still apply. Use this for blanket campaigns ("everyone gets €5 off this weekend"). When this is on, the Conditionssection is disabled — global rules don't honour time-to-event conditions.
Channels (OTA) — specific OTA channels this rule targets (e.g. GetYourGuide, Viator, Project Expedition). Leaving this empty means the rule does not apply to any OTA — to hit an OTA, you must explicitly pick it (or use Apply Globally).
Widgets (Direct) — specific booking widgets this rule targets (your own checkout surfaces). Leaving this empty means the rule does not apply to any widget — to hit a widget, you must explicitly pick it (or use Apply Globally).
Resellers — only visible once you've picked the Marketplace channel. Lets you target individual marketplace resellers (e.g. "Reseller A gets 10% off, others don't").
Product Options (Schedules) — restricts the rule to specific schedules. Leave empty to target all products in this business unit. Click Select all schedules to grab everything, or Clear all to reset.
Weekdays — only apply on these days of the week. The day is evaluated against the experience date (the slot's start), in your tenant timezone — not against the booking date.
Availability date range — only apply to slots whose start time falls between these two datetimes. Different from the campaign window (below): this gates which slots qualify, not when the rule is active.
Conditions
Time-based conditions evaluated at booking time. All conditions must be met (AND logic).
Hours to event — adds a clause like "more than 72 hours before the experience starts" or "fewer than 24 hours before". 72 hours = 3 days; 168 = 1 week; 720 = 30 days. Use this for last-minute discounts ("less than 48 hours = –20%") or early-bird campaigns ("more than 60 days = –15%").
Click + Add condition to stack more, all combined with AND.
If the rule targets a non-marketplace OTA channel (GetYourGuide, Viator, Project Expedition, etc.) or has Apply Globally on, this whole section is disabled. Those contexts don't pass time-to-event data, so any conditions you set would be silently stripped on save. Marketplace bookings and direct widgets do honour conditions.
Actions
What the rule actually does. You can add multiple actions and they all apply.
Action type:
Price % — percentage adjustment on each pricing tier (e.g. 15% decrease = customer pays 85%).
Price flat — fixed amount in subunits (10000 = €100.00). Subtracted (or added) from each tier.
Capacity % — caps per-channel capacity at a percentage of cumulative capacity. "Cap Viator at 30%" = Viator can never sell more than 30% of the slot, even if seats are still available.
Capacity flat — caps global capacity at a hard number, shared across every channel. "Cap at 50 pax" = once 50 bookings exist across all channels, no one else can book.
Op (decrease / increase) — appears for Price types only. Decrease = discount, Increase = surcharge.
Value — the percentage (0–100) or amount.
Apply to pricing categories — restrict the action to specific tiers (e.g. only "Adults", not "Children"). Leave on All categories to hit every tier.
Click + Add action to stack. Common stacks: a Price % discount + a Capacity % cap, so the discounted channel doesn't eat all your inventory.
Guardrails & Timing
Minimum Price / Maximum Price — clamps the final fare for this rule. If a stacked discount would drop a fare below the minimum (or above the maximum), the guardrail wins. Useful as a safety net when several percentage rules stack.
Campaign Start / Campaign End — when the rule itself is active. Distinct from Availability date range: Campaign Start/End gates when the booking is created (real time), while Availability date range gates which slot it's for (event time). A flash sale tomorrow that applies only to next week's slots uses both.
Preview / Simulate
Before saving — and any time after — you can dry-run the rule.
Pick a Product Option (limited to the schedules you scoped above).
Pick an Availability date — the slot to simulate against.
Optionally set As-of to a future or past datetime. Pretend "now" is this. Useful for testing time-to-event conditions in advance.
Click Simulate.
The result panel shows, per channel the rule touches, the adjusted fare for each tier, the resulting per-channel and global capacity, and the list of rules that applied — including any existing saved rules that already match. That way you see the full cascade for that channel + slot, not just this rule in isolation.
If a channel doesn't match the rule's scope, you'll see "does not match" against that channel. Adjust the rule's targets / weekdays / date range and re-simulate until the channels you expect appear in the result list.
Step 3 — Save and verify
Click Create Rule (or Update Rule when editing).
You're returned to the index. The new rule appears with its enabled toggle on (or off, if you left the Enabled checkbox unchecked).
Open any availability the rule should affect — the Policy rule cascade panel walks through, step by step, how each rule transforms capacity and prices for every channel touching that slot. The Applied policy rules panel on the same page (and on the product edit page) lists every rule whose scope matches that entity.
Customers booking via the targeted channel/widget will see the adjusted price the next time prices are computed (usually within seconds for direct widgets; OTA updates are pushed to the channel within the channel's own refresh window).
Managing your rules
List rules — the Channel Policies page (Products → Quick Actions → Channel Policies) shows every rule in this business unit, with its name, scope summary, action summary, and enable/disable toggle.
Reorder priority — drag the handle on the left edge of a row up or down. Lower row = higher priority = runs first. The Priority field is updated automatically.
Enable / disable instantly — flip the toggle on any row. Takes effect on the next booking; no re-save needed.
Edit — click the rule name (or the pencil icon) to open the form.
Delete — click the trash icon on any row, then confirm in the modal. Deletion is permanent, but because rules are non-destructive, your underlying prices and availability are unaffected.
See where a rule was applied — open the availability detail page. The Policy rule cascade panel walks through every rule's effect step by step; the Applied policy rules panel lists every rule matching that slot.
Troubleshooting
"My discount didn't show up on the customer's checkout" — Check that the rule's Channels or Widgets target includes the surface the customer is on. Empty Channels means no OTA is hit; empty Widgets means no direct widget is hit. To touch a surface, you must either pick it explicitly or enable Apply Globally. Also check Campaign Start/End — a rule starting at 09:00 won't apply to a booking at 08:55.
"The Conditions section is greyed out" — The rule targets a non-marketplace OTA channel (e.g. GetYourGuide, Viator), or Apply Globally is on. Those contexts don't pass time-to-event data, so conditions would be stripped on save. Marketplace + conditions works; widgets + conditions work. Either remove the non-marketplace OTAs from Channels, or accept that time-to-event won't apply here.
"Reseller dropdown is missing" — Pick the Marketplace channel under Channels (OTA) first. The reseller selector only appears once Marketplace is in scope.
"My capacity cap isn't holding" — Capacity % is per-channel (this channel only). Capacity flat is global (across all channels). If you wanted "no more than 50 total bookings across all channels", use Capacity flat, not Capacity %.
"Two rules contradict each other" — Rules apply in priority order (lower number first). The later rule sees the fare/capacity after earlier rules. Use Minimum Price / Maximum Price as a hard guardrail when stacking percentage discounts.
"Simulate says 'does not match'" — That channel didn't pass the rule's scope. Loosen the rule's targets (or weekday / date range / conditions) until the result panel shows the channels you expect, along with the full list of rules applied to them.
"I disabled a rule but old bookings still show the discount" — Existing bookings keep the price they were created with. Disabling a rule only affects new bookings from that point on.
What Policy Rules can do
Adjust pricing per channel, per widget, per reseller, per product, per weekday, per date range — or any combination.
Apply percentage or flat discounts/surcharges to specific pricing categories (e.g. only adults, not children).
Cap capacity per-channel (a slice of total) or globally (a shared total).
Run time-limited campaigns with Campaign Start/End independent of the slot's date.
Stack with other rules in priority order, with Minimum / Maximum Price guardrails.
Apply globally — including back-office bookings — when Apply Globally is on.
Preview the effect on real availabilities before saving via Preview / Simulate.
Be traced step-by-step per availability via the Policy rule cascade panel on the availability page — so you can answer "why does this slot show €X on Channel Y?".
What Policy Rules cannot do
Modify underlying product prices or availability rows. (That's the point — rules are non-destructive overlays.)
Apply to past bookings. Disabling or editing a rule only affects bookings created from that point on.
Honour time-to-event conditions on non-marketplace OTAs (GYG, Viator, etc.) or under Apply Globally. The Conditions section is disabled in those cases.
Show their effect on a specific past booking. The audit trail today is per-availability, not per-booking — use the Policy rule cascade panel on the availability page to see how rules transform that slot's prices and capacity.
For a deep-dive on reading the cascade panel, see the Policy rule cascade guide.
"I can't see the Policies menu" — Either your role doesn't have View any policy rule permission, or the feature isn't enabled for your account. Contact your administrator.
What Policy Rules can do
Adjust pricing per channel, per widget, per reseller, per product, per weekday, per date range — or any combination.
Apply percentage or flat discounts/surcharges to specific pricing categories (e.g. only adults, not children).
Cap capacity per-channel (a slice of total) or globally (a shared total).
Run time-limited campaigns with Campaign Start/End independent of the slot's date.
Stack with other rules in priority order, with Minimum / Maximum Price guardrails.
Apply globally — including back-office bookings — when Apply Globally is on.
Preview the effect on real availabilities before saving via Preview / Simulate.
Be audited per booking — every applied rule is recorded so you can answer "why did this fare land at €X?".
What Policy Rules cannot do
Modify underlying product prices or availability rows. (That's the point — rules are non-destructive overlays.)
Apply to past bookings. Disabling or editing a rule only affects bookings created from that point on.
Honour time-to-event conditions on OTA channels or under Apply Globally. The Conditions section is disabled in those cases.
Target both a Widget and a specific OTA channel in the same rule. Pick one channel-type per rule — or use Apply Globally to hit everything at once.
Override channel-level pricing pushed manually by an operator. Operator overrides on a specific availability still win.
