How tax works at checkout
How it works
A B2B price is either net or gross:
| Price type | What it means |
|---|---|
| Net | The price excludes tax. A $20.00 price is $20.00 before tax. |
| Gross | The price includes tax. A $20.00 price already contains the tax. |
By default, SparkLayer shows net prices, whatever tax setting your website uses. Customers see exactly the price in their price list: if it has SKU EEEAR at 7.99, the product page shows $7.99.
On the Review & Pay step, SparkLayer asks your platform for the tax and shows it as its own line: Sub-total, Shipping, Tax and Total. Here's how that works with Shopify:
How tax works
How your B2B customers see tax in SparkLayer, and how it flows through to your Shopify orders.
Your B2B customer browses your store
All prices shown by SparkLayer are excluding tax — your customers always see the net price, no matter how your Shopify tax settings are configured.
The B2B price comes from your price list
The price your customer sees is the one you've set up in your SparkLayer price list. This is your wholesale price and it's what appears on the product page.
Customer goes to checkout
Your customer adds products to their cart and starts the checkout. At this point, SparkLayer works with Shopify to figure out how much tax to add.
Do you sell products with different tax rates?
Some stores sell products taxed at different rates (e.g. food vs non-food). We have a special setting for this — contact our team to enable it.
We create the order early for accurate tax
When your customer selects their shipping address, SparkLayer creates a preliminary order in Shopify behind the scenes. This gets the exact tax rate per product before showing the final total. You may see draft orders tagged b2b-pending.
Tax is calculated at the end
Tax is worked out as a single rate across the whole order. The order is only created in Shopify when the customer completes checkout.
Is this customer tax-exempt?
Mark customers as tax-exempt in Customers›[Customer]›Manage tax exemptions
Exempt
No tax charged. The order total won't include any tax.
Tax applies
Shopify checks if Charge tax on this product is on per product.
Tax rate based on shipping country
Shopify applies the correct tax rate based on where the order ships to. Manage this in Settings›Taxes and duties.
Your wholesale price is sent to Shopify
SparkLayer replaces the standard retail price with your B2B wholesale price. The customer always pays the price from your SparkLayer price list.
Do your Shopify prices include tax?
Check if Include sales tax in product price is on in Settings›Taxes and duties. Common for UK/EU stores.
Price list may need adjustment
Manual price lists: no action needed — enter net wholesale prices as normal. Automatic price lists: tick adjust percentage to account for tax when setting up the price list.
No special setup needed
Your Shopify prices already exclude tax. Just set your wholesale prices in SparkLayer and you're good to go.
Prices shown as net + tax
Your customer always sees the net price with tax shown separately as a line item. This is the case regardless of your Shopify tax settings.
Customer completes their order
The customer confirms their order. If different tax rates were enabled, the preliminary draft order is updated. Otherwise, a new order is created.
Order appears in your Shopify admin
Your order is now in Shopify. If "include tax in price" is on, Shopify shows prices as tax-inclusive with a tax summary — this looks different from checkout but the totals match. If it's off, prices show the same way as SparkLayer.
For a step-by-step setup, from checking your store's prices to testing an order, follow the guide Get B2B tax and VAT right. This page is the reference for each setting.
Show prices including tax
To show prices including tax, labelled "inc. tax", turn on Tax-inclusive prices at Settings,Configurations,Pricing and cart (opens in your SparkLayer Dashboard in a new tab) and on the price lists that need it, and give each product a display_tax_rate in your price CSV, such as 10 for 10% GST. It changes what buyers see, not what they pay. Because the rate comes from a price CSV, it has no effect on automatic price lists. For the steps and limitations, see Show tax-inclusive prices.
Set up tax on Shopify
Shopify only
In Shopify, you set tax rules for the whole store, then make exceptions for customers and products.
Before you start:
- Check your current tax setup in Settings,Taxes and duties (opens in your Shopify admin in a new tab).
- Read Shopify's guide to setting up tax (opens in a new tab).
- Check the effect on retail customers if your store serves both retail (B2C) and B2B. Many of these settings apply to both.
Make a customer tax-exempt
Shopify only
A tax-exempt customer still sees net prices, and pays zero tax at checkout.
- In the Shopify admin, go to Customers (opens in your Shopify admin in a new tab) and open the customer.
- In the customer's details, click Manage tax exemptions.
- Untick Collect tax, then click Save.
With a third-party tax app such as Avalara or TaxJar, also mark the customer as exempt in that app. See Tax is charged but I use a third-party tax app.
Turn tax on or off for a product or variant
Shopify only
- In the Shopify admin, go to Products (opens in your Shopify admin in a new tab) and open the product.
- In Pricing, tick or untick Charge tax on this product. When ticked, the product uses your Shopify tax rules.
- For a single variant, open the variant and tick or untick Charge tax on this variant (Taxable in newer versions of the Shopify admin).
- Click Save.
Products that don't charge tax are left out of the tax total at checkout.
Set tax by country
Shopify only
Shopify applies tax rules by the customer's shipping country, at the last step of the checkout.
- In the Shopify admin, go to Settings,Taxes and duties (opens in your Shopify admin in a new tab).
- Under Regional settings, check the Collecting tax column for each country or region. A region needs a shipping zone (opens in a new tab) before you can collect tax there.
- Select a country or region to manage its tax settings.
You can also manage these from Settings,Markets (opens in your Shopify admin in a new tab).
Remove tax from a draft order
Shopify only
If orders arrive in Shopify as draft orders, you can change the tax before you complete them.
- In the Shopify admin, open the draft order.
- Click Estimated tax.
- Untick Charge taxes, then click Apply.
Estimated tax then shows Not collected and 0.00. Only the tax total changes, not the product prices.
Charge different tax rates on different products
Shopify only
By default, tax is charged on the cart subtotal. If your products have different tax rates in one tax jurisdiction, SparkLayer can work out tax per line instead ("line item tax"). Our team turns it on for you.
Line item tax applies when Include sales tax in product price and shipping rate is on in Shopify. To check:
- In the Shopify admin, go to Settings,Taxes and duties (opens in your Shopify admin in a new tab).
- Under Global settings, see whether Include sales tax in product price and shipping rate is ticked.
If it's ticked and your products have different tax rates, contact our support team to turn on line item tax. It's the Create a draft order on calculate setting at Integrations,Platform,Shopify order actions (opens in your SparkLayer Dashboard in a new tab), which only our team can change. To stop charging tax on some lines, untick Charge tax on those variants in Shopify.
Draft orders are created before the order is complete
With line item tax on, SparkLayer creates the Shopify draft order when the customer reaches the shipping and payment step, before they complete the order. The draft is tagged b2b-pending, which changes to b2b when the customer completes the order.
Why line item tax is needed
SparkLayer applies a discount to each line item so the customer pays their B2B price.
| Include sales tax in product price and shipping rate | How SparkLayer calculates the discount |
|---|---|
| Off | The difference between the Shopify price and the SparkLayer B2B price. |
| On | The discount also has to account for tax. Without line item tax, SparkLayer uses one tax rate (the rate of the first line item) for every line. Shopify only gives SparkLayer each line item's tax rate when it creates a draft order. |
For example, two products with the same £6.00 B2B price, one at the default tax rate and one at 5%:
| Product | Shopify price | Without line item tax | With line item tax |
|---|---|---|---|
| Default tax product | £12.00 | £6.00 (discount £6.00) | £6.00 (discount £6.00) |
| 5% tax product | £10.50 | £6.00 (discount £4.50), incorrect | £5.25 (discount £5.25), correct |
Adjust automatic price lists for tax-inclusive Shopify prices
Shopify only
If Include sales tax in product price and shipping rate is on in Shopify, an automatic price list based on Shopify Price takes its percentage off a price that already includes tax. Work out a percentage that also takes the tax out, or customers pay tax twice: see Tax-inclusive prices. Manual price lists don't need this if you upload net prices.
Set up tax on other platforms
On BigCommerce, Wix, WooCommerce and Magento, SparkLayer uses your platform's tax rules. Set tax up there, then check these limits:
| Platform | Where tax is set up | Limits |
|---|---|---|
| BigCommerce | BigCommerce tax settings | Multi-zone tax only works if prices are entered exclusive of tax, or if tax outside the default zone is set to update product prices. If you change How are prices displayed on your storefront on its own, contact us so SparkLayer can resync. See BigCommerce limitations. |
| Wix | Settings > Tax in your Wix dashboard (setup guide) | Tax exemptions only apply when the customer pays through the Wix checkout (upfront payment). With manual payment methods, tax is charged. See Wix limitations. |
| WooCommerce | WooCommerce tax settings (setup guide) | None documented. |
| Magento | Magento tax settings (setup guide) | None documented. |
Shopify only
On Shopify, orders that mix taxable and tax-exempt products aren't handled, and duties aren't supported. See Shopify limitations.
Show tax information on your storefront
Change any tax wording in the frontend interfaces without code at Storefront,Options,Translation overrides (opens in your SparkLayer Dashboard in a new tab): add an override for the key, enter your text and click Save and publish. See Change checkout text. A developer can set the same keys in your Core Script instead: see Languages and international.
Change the word "tax"
These keys set the tax wording in the cart and checkout:
| Key | Default text |
|---|---|
global.totals.tax | Tax |
cart.tax-shipping-note | Tax and shipping costs calculated during checkout |
cart.tax-shipping-message | Tax and shipping costs shown on next step |
Core Script code for your developer
translations: {
en: {
"global.totals.tax": "Tax",
"cart.tax-shipping-note": "Tax and shipping costs calculated during checkout",
"cart.tax-shipping-message": "Tax and shipping costs shown on next step"
}
},<!-- SparkLayer Core Script: in your theme, just before </head>.
Already have window.sparkOptions? Add just the setting to it. -->
<script>
window.sparkOptions = {
translations: {
en: {
"global.totals.tax": "Tax",
"cart.tax-shipping-note": "Tax and shipping costs calculated during checkout",
"cart.tax-shipping-message": "Tax and shipping costs shown on next step"
}
},
};
</script>Add a tax note next to prices
Add text such as "Excluding tax: " before the product page price, or "(ex. tax)" after the unit price in the My Cart, as in "US$6.99 per unit (ex. tax)". Set these keys in Translation overrides:
| Key | Example text | Where it shows |
|---|---|---|
pdp.price.from-prefix | Excluding tax: | Before the price on the product page |
global.per-unit | {price} per unit (ex. tax) | The unit price in the cart. Keep {price}, which is replaced with the price. |
Core Script code for your developer
translations: {
en: {
"pdp.price.from-prefix": "Excluding tax: ",
"global.per-unit": "{price} per unit (ex. tax)",
}
},<!-- SparkLayer Core Script: in your theme, just before </head>.
Already have window.sparkOptions? Add just the setting to it. -->
<script>
window.sparkOptions = {
translations: {
en: {
"pdp.price.from-prefix": "Excluding tax: ",
"global.per-unit": "{price} per unit (ex. tax)",
}
},
};
</script>Collect a tax ID for international shipping
Some countries require the customer's tax ID (or equivalent) at checkout, so orders comply with local tax law and aren't held up or fined at customs. Collecting it means the order can be processed and converted from a draft to a completed order in Shopify.
Countries that may need a national tax number (such as CPF/CNPJ, RFC or Resident ID) include Brazil, Chile, Colombia, Costa Rica, Ecuador, Guatemala, Indonesia, Italy, Mexico, Malaysia, Peru, Portugal, Paraguay and Turkey. Formats and rules vary, so check the regulations for each destination.
When it's needed, the Details step shows an Additional Tax ID field above Additional Information.
To change the field's label and placeholder, set these keys in Translation overrides:
| Key | Default text |
|---|---|
checkout.notes.tax-id-label | Additional Tax ID |
checkout.notes.tax-id-placeholder | Tax ID |
Core Script code for your developer
translations: {
en: {
"checkout.notes.tax-id-label": "Additional Tax ID",
"checkout.notes.tax-id-placeholder": "Tax ID",
}
}, <!-- SparkLayer Core Script: in your theme, just before </head>.
Already have window.sparkOptions? Add just the setting to it. -->
<script>
window.sparkOptions = {
translations: {
en: {
"checkout.notes.tax-id-label": "Additional Tax ID",
"checkout.notes.tax-id-placeholder": "Tax ID",
}
},
};
</script>If you already collect a tax ID with a custom checkout field, we recommend turning that field off.
Set up shipping
Use your eCommerce platform's shipping rates, or create B2B shipping methods in SparkLayer at Settings,Shipping (opens in your SparkLayer Dashboard in a new tab). See Shipping rules.
Why is tax charged on shipping?
SparkLayer uses Shopify's tax calculation, so shipping is taxed whenever Shopify taxes it. B2B orders can show tax on shipping even when your retail checkout looks different, for one of these reasons.
| Reason | What happens |
|---|---|
| The customer is in Canada, the EU, the UK or the US | Shopify charges tax on shipping in these regions whatever its Charge tax on shipping rates setting says. Our development team has confirmed this is how Shopify behaves. |
| Include sales tax in product price and shipping rate is on | Your Shopify shipping rates already contain tax. SparkLayer shows net amounts, so it has to charge that tax when it creates the order. |
For example, with 20% VAT in the UK:
| Line | Net | VAT at 20% | Total |
|---|---|---|---|
| Products | £500.00 | £100.00 | £600.00 |
| Shipping | £95.00 | £19.00 | £114.00 |
| Order | £595.00 | £119.00 | £714.00 |
The customer sees £95.00 shipping, and £114.00 once VAT is added.
Shopify only
To change this:
- Use SparkLayer shipping rates, entered as net values, such as 95 for £95.00 before tax. See Shipping rules.
- Make the customer tax-exempt, where that's right for them, so their order has no tax on products or shipping. See Make a customer tax-exempt.
Troubleshooting
These fixes are for Shopify. On other platforms, check your platform's tax settings and its limits, or contact our support team.
Shopify only
If the customer should be tax-exempt, open them in Customers (opens in your Shopify admin in a new tab), click Manage tax exemptions and untick Collect tax. With a third-party tax app, also see the next question.
Shopify only
Tax apps such as Avalara and TaxJar override Shopify's tax settings, so a customer set to "Don't collect tax" in Shopify can still be charged. SparkLayer only passes through the tax that Shopify and your tax app return, so the cause is almost always the tax app's setup. Exempt the customer in both places:
- In your tax app, add the customer to its exemption list. For example, in Avalara, go to the Exemption Customer List and add the customer with their Shopify customer ID as the Customer Code.
- In Shopify, open the customer in Customers (opens in your Shopify admin in a new tab), click Manage tax exemptions and check that Collect tax is unticked.
The two exemptions work independently, so if either is missing, tax may still be charged. For help in your tax app, see its documentation or support team.
Shopify only
Check the customer isn't tax-exempt: open them in Customers (opens in your Shopify admin in a new tab), click Manage tax exemptions and make sure Collect tax is ticked.
Shopify only
- In Settings,Taxes and duties (opens in your Shopify admin in a new tab), check whether Include sales tax in product price and shipping rate is on. If it is, check each automatic price list's percentage allows for tax: see Tax-inclusive prices.
- Check the SparkLayer price is lower than the Shopify price. Go to Pricing,Price editor (opens in your SparkLayer Dashboard in a new tab), search for the variant SKU and note its price in each price list, then compare it with the product's Price in Shopify.
If the Shopify price is lower, the checkout uses it. This includes tax: if the SparkLayer price after tax is higher than your tax-inclusive Shopify price, the checkout also uses the Shopify price.
Shopify only
In Settings,Taxes and duties (opens in your Shopify admin in a new tab), find the customer's country and check whether you're collecting tax there.
- Manual price lists use net prices. Upload manual price list prices excluding tax, so tax is added correctly at checkout.
- Automatic price lists allow for tax. If Include sales tax in product price and shipping rate is on in Shopify, an automatic price list's percentage must also take out tax. See Tax-inclusive prices.
Shopify only
Contact our support team to turn on line item tax, then untick Charge tax on the variants that shouldn't be taxed. See Charge different tax rates on different products.
With SparkLayer shipping rates, the costs at Settings,Shipping (opens in your SparkLayer Dashboard in a new tab) should always match the checkout. If they don't, contact our support team.
Yes. Turn on Tax-inclusive prices at Settings,Configurations,Pricing and cart (opens in your SparkLayer Dashboard in a new tab) and add a display_tax_rate column to your pricing CSV. Buyers see gross prices, labelled "inc. tax", but pay the same. It only works on manual price lists: see Show tax-inclusive prices, including its limitations.
If that doesn't suit your tax setup, try one of these:
| To show | Workaround |
|---|---|
| Net and gross prices | Show an extra price to signed-in customers with custom theme code, for example from metafields on Shopify or BigCommerce. Or use the RRP (MSRP) feature to set a price separate from the B2B price. |
| Gross prices only | Make the customer tax-exempt in Shopify so their orders are zero-rated, and upload gross amounts to their price lists (though tax isn't technically included). Report on tax afterwards, for example in your accounting system. |
Last updated