The Complete Guide to Adding Surcharges & Cart Fees on Shopify
A surcharge (or cart fee) is an optional extra charge you add on top of a customer's order — think shipping protection, gift wrapping, a rush-processing fee, or a small carbon-offset contribution. Done right, a surcharge is opt-in, clearly labeled, and gives the customer a choice. Done wrong, it feels like a hidden charge sprung on them at checkout.
Shopify merchants add surcharges for a simple reason: some costs are real but not universal. Not every customer wants gift wrapping, and not every order needs shipping insurance. Rather than baking these costs into every product price, you let the customer decide whether to add them, and you only collect the fee when they say yes.
This guide walks through the types of surcharges merchants commonly use, how to set one up step by step, how to pick the right fee structure, and how to keep everything compliant and transparent. The examples use TackOn, a Shopify app from Normalize built specifically for optional cart fees, but the underlying concepts apply no matter how you implement them.
Common types of Shopify surcharges
Merchants use optional fees for a wide range of purposes. The most common include:
- Handling fees — a flat charge for orders that require extra packing or processing time
- Shipping protection — an optional fee that reassures customers their package is covered against loss or damage in transit
- Rush or priority processing — an add-on for customers who want their order prioritized
- Gift wrapping — a small fee for wrapped, gift-ready packaging
- Environmental or carbon-neutral fees — a contribution toward offsetting the shipment's footprint
- Plant-a-tree contributions — a small donation-style add-on tied to the order
- Tariffs and duties — passing through import costs on international orders
- Deposits — partial upfront payment on made-to-order or reserved items
- Packaging fees — covering the cost of specialty or sustainable packaging
- Cash-on-delivery (COD) fees — an extra charge for orders paid on delivery
- Credit-card or payment-processing surcharges — offsetting card processing costs
- Custom fees — anything specific to your business model
The common thread: every one of these is optional. The customer sees it, understands what it's for, and chooses whether to include it.
How to add a surcharge in TackOn
Setting up your first fee takes a few minutes and requires no coding. Here's the process:
- Install the app from the Shopify App Store and open TackOn from your Shopify admin.
- Create a fee rule. Go to Settings → Rules and choose a fee type — fixed amount, percentage, combined, or price-based tiers. Give it a name (e.g., "Shipping Protection") and set the amount.
- Decide where the rule applies. A rule can be the store's "default" (applies across your whole catalog, with any products you want to exclude) or bound to specific products only.
- Set a schedule (optional). If the fee should only run during a promotion, a holiday season, certain months, or specific days of the week, configure that under date scheduling.
- Configure the cart widget. In Settings → Cart Widget, pick a widget type and template, then customize colors, copy, and whether the checkbox is checked or unchecked by default.
- Enable the app embed. In your theme editor, turn on the TackOn app embed block so the widget appears on your cart page and in the cart drawer.
- Test it. Add a product to your cart, confirm the widget appears, toggle the fee, and check that it carries through to checkout as a visible line item.
That's the whole flow: install, create a rule, configure the widget, enable the embed. For a walkthrough with screenshots, see the Quick Start guide.
Choosing the right fee type
TackOn supports four ways to calculate a fee, and picking the right one depends on what the charge represents.
- Fixed amount — the same charge regardless of cart size. Best for gift wrapping, handling fees, or rush processing, where the cost to you doesn't scale with order value.
- Percentage — a percentage of the cart or item total (up to 100%). Best for costs that scale with order value, like insurance or a payment surcharge tied to transaction size.
- Combined — a fixed amount plus a percentage, such as "2.9% + $0.30." This mirrors how real payment-processing fees are structured, so it's the natural choice for credit-card surcharges.
- Tiers (Multiple mode) — you define price-based bands (minimum and maximum cart value), each with its own fee. This is useful when you want shipping protection or handling to step up in cost as order value increases, without charging a flat percentage on very large orders.
You can also decide whether a fee applies once per cart or per item × quantity — the former suits things like a single shipping-protection charge, while the latter suits per-item costs like gift wrapping each product separately.
For worked examples of each type, see Fee Types and Price-Based Tiers.
Targeting products & scheduling fees
Not every fee belongs on every product, and not every fee should run year-round.
Product targeting. A "default" rule applies storewide, with the option to exclude specific products (useful if, say, digital gift cards shouldn't carry a shipping-protection fee). Alternatively, you can create a rule bound only to specific products — for example, a fragile-item handling fee that only appears on breakable goods.
Scheduling. Each rule can run on its own calendar:
- A one-time date range (a single promotion or event)
- A recurring yearly range (e.g., December 1–January 5, every year, for a holiday gift-wrap fee)
- Specific months
- Specific days of the week
When a rule's schedule is inactive, the widget disappears completely — no fee is added and nothing shows in the cart. This makes seasonal fees, like a holiday rush-processing charge, effectively set-and-forget. Full details are in the Date Scheduling guide.
Designing the cart widget
The widget is what your customer actually sees and interacts with, so it's worth getting right. TackOn offers five widget types built around the most common use cases: Shipping Protection, Gift Wrap, Plant a Tree, Carbon Neutral, and Custom.
Each type comes in two template styles:
- Simple — a clean, icon-based layout
- With Image — upload your own product or lifestyle image
From there you can customize:
- Primary, secondary, and text colors to match your brand
- Border radius, from sharp corners to fully rounded (0–20px)
- Title, description, and feature bullet points
- Separate copy for the opt-in state and the opt-out state
- Whether the checkbox is enabled (the customer actively chooses) or disabled (the fee is always applied)
- Whether the checkbox starts checked or unchecked
If you need something beyond the built-in options, a raw HTML/CSS editor gives you full control over markup and styling. See Widget Templates and Custom HTML & CSS for details.
Staying compliant & transparent
Shopify's guidance is that optional charges should be off by default — the customer should have to actively choose to add them, not have to notice and remove them. This isn't just good practice; it's the difference between a fee that builds trust and one that generates chargebacks and complaints.
TackOn is built around this principle in a few concrete ways:
- The fee is applied through a Shopify cart-transform function, so it shows up as a real, visible line item in the cart and stays visible all the way through checkout. Nothing is hidden or bundled invisibly into the total.
- If you set a widget's checkbox to default to checked (opt-in by default), TackOn automatically enables a checkout confirmation popup and reminds you of Shopify's guideline that optional charges should be off by default. This gives customers an extra, explicit confirmation moment before the fee is finalized.
- You control the exact wording customers see for both the opt-in and opt-out states, so the fee's purpose is always stated in plain language.
The practical takeaway: default your checkbox to unchecked, write clear copy explaining the fee, and let the line item speak for itself at checkout.
Targeting the right customers with visibility rules
Not every fee needs to appear for every customer or every cart. TackOn supports up to five conditional show/hide rules based on cart, customer, or product conditions, combined with either ALL (every condition must match) or ANY (at least one condition must match) logic. This lets you, for example, show a shipping-protection widget only for carts above a certain value, or hide a fee for a specific customer segment.
Automate with Shopify Flow
Once a fee is part of your checkout flow, you can plug it into broader automation using Shopify Flow. TackOn exposes two triggers:
- Fee Applied to Order — fires whenever an order includes a TackOn fee
- Fee Accepted by Customer — fires when a customer actively opts in to a fee
You can use these triggers to tag customers, send follow-up notifications, award loyalty points, or build any custom workflow your store needs — all without additional development work.
Measuring results with analytics
TackOn's dashboard gives you visibility into how your fees are actually performing, over 7, 30, 90, or 365-day ranges:
- Fee orders — how many orders included a fee
- Fee revenue — total revenue collected from fees
- Average order value — how order size trends alongside fee adoption
- Widget funnel — the widget show rate (how often it appeared) and the fee accept rate (how often customers opted in)
This funnel view is useful for testing changes: adjust your widget's copy, template, or default checkbox state, then watch the accept rate to see whether the change helped or hurt.
Multi-currency support
If you sell internationally through Shopify Markets, TackOn's fees display in the customer's local currency, so shoppers see a fee amount in the currency they're already checking out in.
Pricing
TackOn's pricing is usage-based, so you only pay when a fee is actually collected. An order only counts as billable when a TackOn fee is applied to it — orders with no fee, abandoned carts, and test orders never count.
| Plan | Cost | Included | Notes |
|---|---|---|---|
| Free | $0/month | 20 fee-bearing orders/month | Free forever, no credit card |
| Starter | $5/month base | 50 fee-bearing orders/month | Then $0.10 per additional order, capped at $99.99/month total. 30-day free trial, no credit card, cancel anytime |
Whichever plan you're on, you keep 100% of the fees you collect — TackOn takes no commission or revenue share. Full details are on the Pricing page.
FAQ
Does the fee stay visible through checkout, or is it hidden in the total? It stays visible. The fee is applied as a real cart line item through a Shopify cart-transform function, so customers see it as a distinct line all the way through checkout.
Do I need any coding experience to set this up? No. TackOn works with Online Store 2.0 themes, installs as an app embed block, and automatically detects your theme's cart selectors (with a manual override available if needed). Typical setup — install, create a rule, configure the widget, enable the embed — takes a few minutes.
What happens if I set the checkbox to default to checked? TackOn automatically enables a checkout confirmation popup and reminds you of Shopify's guideline that optional charges should be off by default. This adds an extra confirmation step so customers aren't surprised by a pre-selected fee.
Can I run a fee only during a certain season or on certain days? Yes. Each rule supports one-time date ranges, recurring yearly ranges (like December 1–January 5 every year), specific months, or specific days of the week. When the schedule is inactive, the widget hides completely and no fee is added.
Can I charge different fees based on cart value? Yes, using the tiered ("Multiple" mode) fee type. You set minimum and maximum cart-value bands, each with its own fee amount, so the charge can step up (or down) as order value changes. See Price-Based Tiers.
Which orders count toward my plan's limit? Only orders where a TackOn fee is actually applied count toward your plan's order limit. Orders with no fee, abandoned carts, and test orders are never counted, on either the Free or Starter plan.
What's the difference between the Free and Starter plans? The Free plan includes 20 fee-bearing orders per month at $0/month, forever, with no credit card required. The Starter plan is $5/month and includes 50 fee-bearing orders, then $0.10 for each additional order, capped so you never pay more than $99.99/month total — with a 30-day free trial and no credit card required to start.
Get started
Optional cart fees, done transparently, let you recover real costs without pressuring every customer into paying for something they don't want. Install TackOn from the Shopify App Store and have your first fee live in a few minutes.