Troubleshooting
Common issues and their solutions when configuring Shopify Delivery Checkout rules.
Issue 1: Wrong Price Applied
Symptom
A 35kg cart is charged €50 instead of €200, even though you have rules for both weights.
Cause
Incorrect priority ordering. The system matches the first rule and stops.
Solution
Ensure higher thresholds have lower priority numbers (Priority 0, 1, 2...).
❌ Wrong:
[
{"name": "Over 10kg €50", "priority": 0, "conditions": [{"value": ["10"], "operator": ">"}]},
{"name": "Over 30kg €200", "priority": 2, "conditions": [{"value": ["30"], "operator": ">"}]}
]
✅ Correct:
[
{"name": "Over 30kg €200", "priority": 0, "conditions": [{"value": ["30"], "operator": ">"}]},
{"name": "Over 10kg €50", "priority": 2, "conditions": [{"value": ["10"], "operator": ">"}]}
]
QUICK FIX
List your rules by priority (0, 1, 2...). Read from top to bottom. Does the order go from most specific to most general? If not, reorder the priorities.
Issue 2: No Rules Matching
Symptom
Your rules exist but the base shipping price is always applied.
Possible Causes & Solutions
Cause A: Operator Direction
Using < when you need > or vice versa.
❌ Wrong:
{"type": "cart_weight", "value": ["10"], "operator": "<"}
// This matches weights LESS THAN 10kg
✅ Correct:
{"type": "cart_weight", "value": ["10"], "operator": ">"}
// This matches weights GREATER THAN 10kg
Cause B: Incorrect conditions_match
Using "all" when you need "any", or vice versa.
❌ Wrong:
{
"conditions_match": "all",
"conditions": [
{"type": "shipment_country", "value": ["GB"], "operator": "="},
{"type": "shipment_country", "value": ["FR"], "operator": "="}
]
}
// Impossible: Country can't be BOTH GB AND FR
✅ Correct:
{
"conditions_match": "any",
"conditions": [
{"type": "shipment_country", "value": ["GB"], "operator": "="},
{"type": "shipment_country", "value": ["FR"], "operator": "="}
]
}
// Matches if country is GB OR FR
Cause C: Type Mismatch
Using string comparison on numeric values or vice versa.
Check your data types:
// For numeric comparisons
{"type": "cart_weight", "value": ["10"], "operator": ">"}
// For string comparisons
{"type": "shipment_country", "value": ["GB"], "operator": "="}
Issue 3: Free Shipping Not Working for Heavy Orders
Symptom
You offer free shipping over €100, but it doesn't apply to orders over 20kg.
Cause
A heavy order rule with higher priority (lower number) is matching first.
Solution
Reorder priorities or combine conditions.
Option 1: Adjust Priorities
[
{
"name": "Free Shipping Over €100",
"priority": 0, // Check free shipping FIRST
"conditions": [
{"type": "cart_value", "value": ["100"], "operator": ">="},
{"type": "cart_weight", "value": ["20"], "operator": "<="}
]
},
{
"name": "Heavy Order Surcharge",
"priority": 1, // Then check for heavy orders
"conditions": [
{"type": "cart_weight", "value": ["20"], "operator": ">"}
]
}
]
Option 2: Separate Light and Heavy Rules
[
{
"name": "Heavy Order Rate",
"priority": 0,
"price": 50.00,
"conditions": [
{"type": "cart_weight", "value": ["20"], "operator": ">"}
]
},
{
"name": "Free Shipping (Light Orders)",
"priority": 1,
"price": 0.00,
"conditions": [
{"type": "cart_value", "value": ["100"], "operator": ">="},
{"type": "cart_weight", "value": ["20"], "operator": "<="}
]
}
]
Issue 4: Rule Applies When It Shouldn't
Symptom
A rule matches carts that don't meet all your intended conditions.
Cause
Using conditions_match: "any" when you need "all".
Solution
Change to conditions_match: "all" to require all conditions to be true.
❌ Wrong:
{
"name": "Premium Heavy Order",
"conditions_match": "any", // Matches if EITHER condition is true
"conditions": [
{"type": "cart_weight", "value": ["20"], "operator": ">"},
{"type": "cart_value", "value": ["500"], "operator": ">="}
]
}
This matches:
- ✅ 25kg cart with €600 subtotal (both true)
- ✅ 25kg cart with €100 subtotal (weight true)
- ✅ 10kg cart with €600 subtotal (subtotal true)
✅ Correct:
{
"name": "Premium Heavy Order",
"conditions_match": "all", // Requires BOTH conditions
"conditions": [
{"type": "cart_weight", "value": ["20"], "operator": ">"},
{"type": "cart_value", "value": ["500"], "operator": ">="}
]
}
This matches:
- ✅ 25kg cart with €600 subtotal (both true)
- ❌ 25kg cart with €100 subtotal (subtotal false)
- ❌ 10kg cart with €600 subtotal (weight false)
Issue 5: Shipping Method Not Disabled
Symptom
You have a type: "disable_method" rule but the shipping method still appears.
Cause
Conditions aren't matching, or the rule has low priority and another rule matches first.
Solution
Step 1: Verify Conditions
{
"name": "Hide Express for Hazmat",
"type": "disable_method",
"priority": 0, // Should be highest priority
"conditions_match": "any",
"conditions": [
{"type": "product_tag", "value": ["hazmat"], "operator": "contains"}
]
}
Step 2: Check Priority Disable rules should typically have Priority 0 to execute before price modification rules.
Step 3: Verify Product Tags Make sure your products actually have the tag you're checking for.
Issue 6: Different Results in Test vs Production
Symptom
Rules work in testing but behave differently in production checkout.
Possible Causes
Cart Context Differences
- Test cart may have different products/quantities
- Shipping address may differ
- Currency conversion issues
Caching Issues
- Old rule configuration cached
- Solution: Clear cache or wait for TTL expiry
Time-Based Conditions
- Delivery date conditions may evaluate differently based on current date
Solution
Test with production-like data:
✅ Use real product SKUs
✅ Use actual shipping addresses
✅ Test at different times of day
✅ Clear cache between tests
Issue 7: Rules Work Individually But Not Together
Symptom
Each rule works when it's the only rule, but they conflict when combined.
Cause
Priority conflicts or logical overlaps.
Solution
Map out your rule execution flow:
Priority 0: Most specific condition
↓ (if no match)
Priority 1: Less specific condition
↓ (if no match)
Priority 2: Least specific condition
↓ (if no match)
Base shipping price
Example Conflict:
[
{"priority": 0, "conditions": [{"type": "cart_weight", "value": ["10"], "operator": ">"}]},
{"priority": 1, "conditions": [{"type": "cart_weight", "value": ["20"], "operator": ">"}]}
]
Problem: 30kg cart matches Priority 0 (>10kg) and stops. Never evaluates Priority 1 (>20kg).
Fixed:
[
{"priority": 0, "conditions": [{"type": "cart_weight", "value": ["20"], "operator": ">"}]},
{"priority": 1, "conditions": [{"type": "cart_weight", "value": ["10"], "operator": ">"}]}
]
Debugging Checklist
When rules aren't working as expected, check:
- [ ] Priority Order: Are rules ordered from most specific (0) to least specific?
- [ ] Operators: Are you using
>,<,>=,<=,=correctly? - [ ] Conditions Match: Do you need "all" or "any"?
- [ ] Value Format: Are values in the correct format (strings in array)?
- [ ] Rule Type: Is it
modify_method_priceorhide? - [ ] Test Data: Are you testing with realistic cart data?
- [ ] Overlapping Conditions: Do multiple rules match the same scenarios?
Getting Help
If you're still stuck:
- Export your rules and review the priority order
- Create a test case with specific cart data
- Document expected vs actual behavior
- Check logs for rule evaluation details
Common Patterns That Work
Pattern: Tiered Pricing
[
{"priority": 0, "conditions": [{"value": ["highest"], "operator": ">"}]},
{"priority": 1, "conditions": [{"value": ["medium"], "operator": ">"}]},
{"priority": 2, "conditions": [{"value": ["lowest"], "operator": ">"}]}
]
Pattern: Exception Override
[
{"priority": 0, "name": "Special Case Exception"},
{"priority": 1, "name": "General Rule"}
]
Pattern: Exclusion
[
{"priority": 0, "type": "disable_method", "name": "Hide for Condition X"},
{"priority": 1, "type": "modify_method_price", "name": "Apply Price"}
]
Next Steps
- Priority System - Master the priority system
- Common Scenarios - See working examples
- Rules - Review rule fundamentals
