TL;DR
A rule is a condition-and-action pair attached to a shipping option. When a customer reaches checkout, Shipit checks each rule's conditions against the order — if the conditions match, the action runs. Rules run in priority order, highest number first, and only the first matching rule applies (except for pickup point rules, which work differently — see below).
What you can do with rules
Rules let you automate decisions that you would otherwise have to apply manually or handle through separate shipping options. Here are some things you can do:
- Show free shipping automatically when the cart total is over €100
- Hide express delivery after 2pm so you never promise same-day shipping you cannot fulfill
- Add a surcharge for B2B customers who need commercial invoicing
- Show different carriers in different countries without duplicating your whole setup
- Remove parcel lockers from the available list when an order is too heavy to fit
- Give loyalty members a discount on standard delivery
- Block shipping to certain countries entirely
- Show a cheaper option only during a weekend sale
- Filter out outdoor parcel lockers in winter months
How a rule works
Think of a rule as a filter at the door of a shipping option. Every time a customer reaches checkout, the rule checks a few things about their order — where they are, how much they have in their cart, what time it is — and then decides what to do with this shipping option.
Each rule has two parts:
- Conditions — the criteria that must be true for the rule to fire. You can require that all conditions be met, or that at least one is met.
- Action — what happens when the conditions match: show the option, hide it, change its price, or filter the pickup points it offers.
If the conditions do not match, the rule does nothing and Shipit moves on to the next rule in priority order. If no rule matches at all, the shipping option falls back to its default behavior — visible at its base price.
Parts of a rule
| Field | What it does |
|---|---|
| Name | An internal label shown only to you, never to customers. Use descriptive names like "Hide express after 2pm" so you can scan your rules list quickly. |
| Type / Action | What happens when the rule triggers. See Rule actions below. |
| Priority | A number that controls the order in which rules are checked. Higher numbers are checked first. |
| Active | When turned off, the rule is saved but never evaluated. Use this to pause seasonal rules without deleting them. |
| Conditions match | Either "all" (every condition row must be true) or "any" (at least one condition row must be true). |
| Conditions | One or more rows, each with a field, an operator, and a value. |
| Outcome | The result of the action — for example, a price adjustment amount or a percentage discount. The fields shown here depend on which action type you chose. |
Condition fields
Conditions are organized into groups. Each condition row picks one field from the list below, an operator that describes how to compare it, and a value to compare against.
Location
| Field | Plain-English label | Operators | Example value |
|---|---|---|---|
destination_country | Delivery country | sameAs, notSameAs, contains, notContains, startsWith, endsWith, in, notIn | FI |
destination_postcode | Delivery postcode | sameAs, notSameAs, contains, notContains, startsWith, endsWith, in, notIn | 00100 |
destination_city | Delivery city | sameAs, notSameAs, contains, notContains, startsWith, endsWith, in, notIn | Helsinki |
is_domestic | Order is within the same country | yes / no | yes |
is_international | Order crosses a country border | yes / no | yes |
origin_country | Shipping from country | sameAs, notSameAs, contains, notContains, startsWith, endsWith, in, notIn | FI |
origin_postcode | Shipping from postcode | sameAs, notSameAs, contains, notContains, startsWith, endsWith, in, notIn | 00520 |
origin_city | Shipping from city | sameAs, notSameAs, contains, notContains, startsWith, endsWith, in, notIn | Helsinki |
Cart
| Field | Plain-English label | Operators | Example value |
|---|---|---|---|
cart_weight | Total cart weight (in grams) | sameAs, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual | 10000 (= 10 kg) |
cart_value | Cart value (decimal) | sameAs, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual | 100.00 |
cart_subtotal_price | Cart subtotal before discounts | sameAs, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual | 80.00 |
cart_total_price | Cart total after discounts | sameAs, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual | 75.00 |
cart_item_count | Number of items in cart | sameAs, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual | 5 |
The unit for
cart_weightdepends on your store's weight unit setting. Confirm which unit your checkout provider sends before writing weight-based rules to avoid setting thresholds in the wrong unit.
Customer
| Field | Plain-English label | Operators | Example value |
|---|---|---|---|
customer_type | Customer type | sameAs, notSameAs | b2c or b2b |
customer_origin | How the customer arrived | sameAs, notSameAs | organic |
customer_tag | Tag on the customer record | sameAs, notSameAs, contains, notContains, in, notIn | wholesale |
loyalty_is_member | Loyalty program status | sameAs, notSameAs | new_member, member, or vip |
Time
| Field | Plain-English label | Operators | Example value |
|---|---|---|---|
day_of_week | Day of the week | sameAs, notSameAs, in, notIn | friday |
time_of_day | Current time (HH:MM) | sameAs, notSameAs, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual | 14:00 |
timezone | Timezone for evaluating the time | sameAs, notSameAs | Europe/Helsinki |
Always pair
time_of_daywith atimezonecondition when your store serves multiple regions. Without a timezone, time comparisons use the server's default clock, which may not match your customers' expectations.
Checkout and experiments
| Field | Plain-English label | Operators | Example value |
|---|---|---|---|
checkout_locale | Language/locale of the checkout | sameAs, notSameAs, in, notIn | fi-FI |
checkout_market_country | Market the checkout is configured for | sameAs, notSameAs, in, notIn | FI |
experiment_name | Name of an active A/B experiment | sameAs, notSameAs | checkout-v2 |
experiment_bucket | Which bucket the customer is in | sameAs, notSameAs | a or b |
shipping_zone | Named shipping zone | sameAs, notSameAs, in, notIn | nordic |
product_collection | Product collection in the cart | sameAs, notSameAs, contains, notContains, in, notIn | fragile-items |
store_type | Whether the store is B2C or B2B | sameAs, notSameAs | b2c or b2b |
Warehouse and fulfillment
| Field | Plain-English label | Operators | Example value |
|---|---|---|---|
warehouse_count | Number of warehouses fulfilling this order | sameAs, greaterThan, greaterThanOrEqual, lessThan, lessThanOrEqual | 2 |
has_multiple_warehouses | Order ships from more than one warehouse | yes / no | yes |
multi_shipment_enabled | Multi-shipment fulfillment is active | yes / no | yes |
multi_shipment_mode | Which multi-shipment mode is in use | sameAs, notSameAs | depends on your setup |
Pickup point
These conditions only apply when your rule action is one of the pickup point filter types (show/hide service point, parcel locker, etc.).
| Field | Plain-English label | Operators | Example value |
|---|---|---|---|
pickup_point_type | Category of the pickup point | sameAs, notSameAs, in, notIn | parcel_locker |
pickup_point_service_type | Service type string from the carrier | sameAs, notSameAs, contains, notContains | PUDO |
pickup_point_service_code | Specific service code from the carrier | sameAs, notSameAs, contains, notContains | FI_LOCKER_1 |
Operators
| Operator | What it means | Example |
|---|---|---|
sameAs | Exactly equals the value | Country sameAs FI — matches Finland only |
notSameAs | Does not equal the value | Country notSameAs FI — matches everywhere except Finland |
contains | Text includes the value as a substring | City contains borg — matches "Gothenburg", "Helsingborg" |
notContains | Text does not include the substring | Postcode notContains 00 — excludes postcodes with "00" |
startsWith | Text begins with the value | Postcode startsWith 00 — matches "00100", "00200" |
endsWith | Text ends with the value | Postcode endsWith 00 — matches "10000", "20100" |
greaterThan | Number is strictly more than the value | Weight greaterThan 5000 — over 5 kg |
greaterThanOrEqual | Number is equal to or more than the value | Cart value greaterThanOrEqual 100.00 — €100 or more |
lessThan | Number is strictly less than the value | Time lessThan 14:00 — before 2pm |
lessThanOrEqual | Number is equal to or less than the value | Item count lessThanOrEqual 3 — three items or fewer |
in | Value matches one item in a comma-separated list | Country in FI,SE,NO — Finland, Sweden, or Norway |
notIn | Value does not appear in the list | Country notIn RU,BY — excludes Russia and Belarus |
The
inandnotInoperators accept a comma-separated list with no spaces. For example, to match three countries writeFI,SE,NO— notFI, SE, NO.
Rule actions
Visibility actions
Visibility rules show or hide a shipping option for the entire checkout. Only the first matching visibility rule applies.
enable_method — Show this shipping option
Use this when a shipping option should be hidden by default and only shown for certain orders. For example, show a same-day delivery option only for local postcodes.
disable_method — Hide this shipping option
Use this to hide an option when specific conditions are met. For example, hide express delivery after 2pm, or hide a carrier entirely for international orders.
Visibility rules and pricing rules stop at the first match. Once a rule matches, no further rules of the same type are checked for that option. Plan your priority order carefully.
Pricing actions
modify_method_price — Adjust the price up or down
This action changes the displayed price for the shipping option. You can apply a fixed amount adjustment, a percentage adjustment, or both.
Outcome fields:
| Field | What it does | Example |
|---|---|---|
| Amount | A fixed value added to (or subtracted from) the price. Use a negative number for a discount. | -3.00 removes €3 |
| Currency | The currency for the fixed amount. | EUR |
| Percentage | A percentage to add or subtract. Use a negative number for a discount. | -100 makes shipping free |
To make shipping free, set the percentage to
-100. This is cleaner than setting a fixed amount because it works regardless of the base price.
Pickup point filter actions
Pickup point rules filter the list of pickup locations offered to the customer. Unlike visibility and pricing rules, all matching pickup point rules apply — not just the first one. This lets you combine multiple filters (for example, hide parcel lockers AND hide outdoor lockers for heavy orders).
| Action | What it does |
|---|---|
show_service_point | Include service point locations (post offices, shops) in the list |
hide_service_point | Remove service point locations from the list |
show_parcel_locker | Include indoor parcel lockers in the list |
hide_parcel_locker | Remove indoor parcel lockers from the list |
show_outdoor_parcel_locker | Include outdoor parcel lockers in the list |
hide_outdoor_parcel_locker | Remove outdoor parcel lockers from the list |
show_letter_box | Include letter box delivery points in the list |
hide_letter_box | Remove letter box delivery points from the list |
When to use these: Use pickup point filter rules when you need to limit which types of locations a customer can choose. For example, hide outdoor parcel lockers for large or fragile parcels that should not be left outside, or hide letter box delivery for orders too bulky to fit.
Shipment flag actions
Shipment flag actions do not change what the customer sees at checkout. They attach information to the shipment that is used when the shipment is created and handed off to the carrier.
| Action | What it does |
|---|---|
enable_limited_quantities | Marks the shipment as containing goods with limited quantity restrictions (relevant for some dangerous goods regulations) |
enable_dangerous_goods | Marks the shipment as containing dangerous goods, triggering carrier-specific handling requirements |
Legacy action types
The following action types are still functional but have been superseded by the actions above. You may see them in older setups.
| Action | Replaced by |
|---|---|
visibility | enable_method / disable_method |
pricing | modify_method_price |
text | Not directly replaced |
Tip: If you have existing rules using legacy action types, they will continue to work without changes. When you next edit one of those rules, recreate the action using the current type:
visibility→enable_methodordisable_method;pricing→modify_method_price. New rules should always use current action types.
How priority works
Every rule has a priority number. Shipit evaluates rules in descending order — the rule with the highest number runs first.
Higher priority number = checked first. This is the opposite of what many people expect. A rule with priority
100runs before a rule with priority10.
Best practice: space your priorities in steps of 10 (10, 20, 30, 40...). This leaves room to insert new rules between existing ones without having to renumber everything.
Example priority order for a shipping option with four rules:
| Priority | Rule name | What it does |
|---|---|---|
| 40 | VIP loyalty free shipping | Removes price for VIP members — checked first |
| 30 | B2B surcharge | Adds €5 for B2B customers |
| 20 | Hide after 2pm | Disables the option after the cutoff |
| 10 | Default free shipping over €100 | Removes price for large orders — checked last |
In this example, a VIP member placing a B2B order would get free shipping because priority 40 fires first and no further pricing rules apply.
Conditions: all vs any
When you add more than one condition row to a rule, you must choose whether all conditions must be true or any one of them must be true.
"All" means every condition must match — think of it as AND logic.
Example: Hide express delivery if the destination is outside Finland AND the cart weight is over 5 kg. Both must be true to trigger the rule.
Conditions match: all
- destination_country notSameAs FI
- cart_weight greaterThan 5000
"Any" means at least one condition must match — think of it as OR logic.
Example: Hide the option if the destination is Russia OR the destination is Belarus. Either country alone is enough to trigger the rule.
Conditions match: any
- destination_country sameAs RU
- destination_country sameAs BY
You cannot mix AND and OR logic within a single rule. If you need complex logic (for example, "B2B customers AND order over €200, OR VIP members"), create two separate rules with the same action and appropriate priorities.
Common patterns
Free shipping over €100
Goal: Automatically remove the shipping charge when the cart total reaches €100 or more.
| Setting | Value |
|---|---|
| Action | modify_method_price |
| Conditions match | all |
| Condition | cart_value greaterThanOrEqual 100.00 |
| Outcome — Percentage | -100 |
This removes 100% of the price, making shipping free regardless of what the base price is set to.
No express delivery after 2pm
Goal: Hide same-day or express shipping options after the order cutoff time.
| Setting | Value |
|---|---|
| Action | disable_method |
| Conditions match | all |
| Condition 1 | time_of_day greaterThanOrEqual 14:00 |
| Condition 2 | timezone sameAs Europe/Helsinki |
Without the timezone condition, the time is evaluated against the server clock, which may differ from your warehouse location.
B2B surcharge
Goal: Add a €5 handling fee for business customers.
| Setting | Value |
|---|---|
| Action | modify_method_price |
| Conditions match | all |
| Condition | customer_type sameAs b2b |
| Outcome — Amount | 5.00 |
| Outcome — Currency | EUR |
Block shipping to a country
Goal: Hide a shipping option entirely for orders going to a specific country.
| Setting | Value |
|---|---|
| Action | disable_method |
| Conditions match | all |
| Condition | destination_country sameAs RU |
To block multiple countries with one rule, use the in operator:
| Condition | destination_country in RU,BY,KP |
|---|
Loyalty member discount
Goal: Give customers with an active loyalty membership a €3 discount on standard delivery.
| Setting | Value |
|---|---|
| Action | modify_method_price |
| Conditions match | any |
| Condition 1 | loyalty_is_member sameAs member |
| Condition 2 | loyalty_is_member sameAs vip |
| Outcome — Amount | -3.00 |
| Outcome — Currency | EUR |
Using "any" here means either member or vip status qualifies for the discount. Set the priority for this rule higher than any other pricing rule on the same option so loyalty discounts are applied first.
What to do next
See these examples for complete walkthroughs:
- Free shipping over a threshold — step-by-step setup with screenshots
- Time-based cutoffs — handling same-day delivery windows across timezones
- B2B vs B2C options — showing different carriers to different customer types
