Sales Tax Calculation — North America vs. Other Regions
In this article
Basket Calculation Logic (Magento Integration)
Overview
This document outlines the difference in sales tax calculation methods between North America (NA) and other regions, and how LS Central tax area configurations are leveraged to determine applicable tax rates during basket calculation. It also details the required configuration to calculate tax based on shipping address parameters and store selection for Click and Collect scenarios.
Tax Calculation Models
North America (Destination-Based Model)
In North America, sales tax is typically destination-based, meaning the tax rate is determined by the location where the goods are delivered. This can involve multiple tax jurisdictions (state, county, city, and special districts).
Key Characteristics:
- Tax rates are based on shipping address (postcode, state, and sometimes city/county).
- Different jurisdictions can layer taxes (e.g., state + county + city).
- Tax rules can vary between:
- Origin-based states (less common): tax based on seller’s location.
- Destination-based states (most common): tax based on buyer’s shipping location.
- Tax calculation often uses postcode and state as the primary identifiers.
Example:
A product shipped from California to Kansas will have Kansas sales tax applied, based on the specific delivery address.
Other Regions
In North America, sales tax is typically destination-based, meaning the tax rate is determined by the location where the goods are delivered. This can involve multiple tax jurisdictions (state, county, city, and special districts).
In many regions outside North America (such as, EU), tax is commonly VAT-based:
- The tax rate is determined by the single national VAT rate.
- Typically, uniform tax rates across the entire country or region.
- Less reliance on postcode/state level configuration.
Example:
A product shipped within Germany typically applies the same VAT rate regardless of the destination address.
LS Central Tax Structure
LS Central uses a Tax Area Code and Tax Jurisdiction Code structure to manage tax rates.
Tax Area Code
- Represents a geographical tax area.
- Each Tax Area Code can have multiple Tax Jurisdiction Codes (such as, state, county, city).
- Each jurisdiction defines its own percentage rate.
Postcode Mapping
- Under Post Codes, LS Central maps following to a Tax Area Code:
- Postcode
- County
- Country Code
- When a shipping address is provided, LS Central determines which Tax Area Code applies based on the postcode and county.
Basket Calculation Logic (Magento Integration)
In Magento, basket calculation occurs whenever an item is added to the cart. During this step:
- If the shipping method is Flat Rate:
- Postcode, state, and country from the selected shipping address are passed in the basket calculation request.
- LS Central:
- Looks up the postcode and maps it to the correct Tax Area Code.
- Applies the defined jurisdiction tax rates.
- Magento:
- Receives the calculated sales tax amount and applies it to the basket.
Magento Configuration
To align with NA tax calculation logic, a new configuration needs to be enabled, in magento admin under Basket Calculation called Calculate Tax Based on Shipping Address.
When enabled, the basket calculation request includes shipping address parameters:
- Postcode
- State
- Country
This allows LS Central to:
- Determine the correct Tax Area Code.
- Return accurate tax amounts for the customer’s delivery location.
Delivery Order Flow
In case of delivery order, by default in LS Central the tax area code which is defined for the corresponding webstore is being used.
Example
- Customer adds item to cart.
- Shipping method = Flat Rate.
- Basket Calculation sends:
- Postcode: 66604
- County: KS
- Country: US
- LS Central finds Tax Area Code KANWY.
- Returns sales tax = 12%.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://lsretail.com/LSOmniService/Base/2017" xmlns:ns2="http://lsretail.com/LSOmniService/Loy/2017" xmlns:ns3="http://lsretail.com/LSOmniService/EComm/2017/Service">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns3:OneListCalculate>
<ns3:oneList>
<ns1:Id xsi:nil="true"/>
<ns2:CardId>10043</ns2:CardId>
<ns2:CardLinks xsi:nil="true"/>
<ns2:Currency>USD</ns2:Currency>
<ns2:CurrencyFactor>1.00</ns2:CurrencyFactor>
<ns2:CustomerId xsi:nil="true"/>
<ns2:Description xsi:nil="true"/>
<ns2:IsHospitality>false</ns2:IsHospitality>
<ns2:Items>
<ns2:OneListItem>
<ns1:Id>189</ns1:Id>
<ns2:Amount>144</ns2:Amount>
<ns2:BarcodeId>785060608006</ns2:BarcodeId>
<ns2:Detail xsi:nil="true"/>
<ns2:Image xsi:nil="true"/>
<ns2:Immutable>true</ns2:Immutable>
<ns2:ItemCategory xsi:nil="true"/>
<ns2:ItemDescription xsi:nil="true"/>
<ns2:ItemId>40000</ns2:ItemId>
<ns2:Location xsi:nil="true"/>
<ns2:OnelistItemDiscounts xsi:nil="true"/>
<ns2:OnelistSubLines xsi:nil="true"/>
<ns2:Price>72</ns2:Price>
<ns2:ProductGroup xsi:nil="true"/>
<ns2:Quantity>2</ns2:Quantity>
<ns2:UnitOfMeasureDescription xsi:nil="true"/>
<ns2:UnitOfMeasureId>PCS</ns2:UnitOfMeasureId>
<ns2:VariantDescription xsi:nil="true"/>
<ns2:VariantId xsi:nil="true"/>
<ns2:VariantRegistration xsi:nil="true"/>
</ns2:OneListItem>
</ns2:Items>
<ns2:ListType>Basket</ns2:ListType>
<ns2:MemberPriceGroupCode xsi:nil="true"/>
<ns2:Name xsi:nil="true"/>
<ns2:PriceGroupCode xsi:nil="true"/>
<ns2:PublishedOffers/>
<ns2:SalesType>POS</ns2:SalesType>
<ns2:ShipToCountryCode>US</ns2:ShipToCountryCode>
<ns2:ShipToCounty>KS</ns2:ShipToCounty>
<ns2:ShipToPostCode>66604</ns2:ShipToPostCode>
<ns2:StoreId>S0013</ns2:StoreId>
</ns3:oneList>
</ns3:OneListCalculate>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<OneListCalculateResponse xmlns="http://lsretail.com/LSOmniService/EComm/2017/Service">
<OneListCalculateResult xmlns:a="http://lsretail.com/LSOmniService/Loy/2017" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Id xmlns="http://lsretail.com/LSOmniService/Base/2017">{AEED3C33-3242-4DC5-A4A9-23F948590AEE}</Id>
<a:CardId>10043</a:CardId>
<a:CollectLocation/>
<a:ContactAddress xmlns:b="http://lsretail.com/LSOmniService/Base/2017">
<b:Address1/>
<b:Address2/>
<b:CellPhoneNumber/>
<b:City/>
<b:Country/>
<b:County/>
<b:HouseNo/>
<b:Id/>
<b:PhoneNumber/>
<b:PostCode/>
<b:StateProvinceRegion/>
<b:Type>Residential</b:Type>
</a:ContactAddress>
<a:ContactId/>
<a:ContactName/>
<a:Currency>USD</a:Currency>
<a:CurrencyFactor>1.00</a:CurrencyFactor>
<a:CustomerId>44090</a:CustomerId>
<a:DayPhoneNumber/>
<a:Email/>
<a:OrderDiscountLines>
<a:OrderDiscountLine>
<Id xmlns="http://lsretail.com/LSOmniService/Base/2017"/>
<a:Description>Denim on denim discount 15%</a:Description>
<a:DiscountAmount>27.00</a:DiscountAmount>
<a:DiscountPercent>18.75</a:DiscountPercent>
<a:DiscountType>PeriodicDisc</a:DiscountType>
<a:LineNumber>10000</a:LineNumber>
<a:No>10000</a:No>
<a:OfferNumber>P1060</a:OfferNumber>
<a:OrderId/>
<a:PeriodicDiscGroup>P1060</a:PeriodicDiscGroup>
<a:PeriodicDiscType>DiscOffer</a:PeriodicDiscType>
</a:OrderDiscountLine>
</a:OrderDiscountLines>
<a:OrderLines>
<a:OrderLine>
<Id xmlns="http://lsretail.com/LSOmniService/Base/2017">189</Id>
<a:Amount>124.02</a:Amount>
<a:ClickAndCollectLine>false</a:ClickAndCollectLine>
<a:DiscountAmount>27.00</a:DiscountAmount>
<a:DiscountPercent>18.75</a:DiscountPercent>
<a:InventoryTransfer>false</a:InventoryTransfer>
<a:ItemDescription>Jeans Linda line</a:ItemDescription>
<a:ItemId>40000</a:ItemId>
<a:ItemImageId>40000</a:ItemImageId>
<a:LineNumber>10000</a:LineNumber>
<a:LineType>Item</a:LineType>
<a:LotNumber i:nil="true"/>
<a:NetAmount>117.00</a:NetAmount>
<a:NetPrice>72.00</a:NetPrice>
<a:OrderId/>
<a:Price>72.00</a:Price>
<a:Quantity>2</a:Quantity>
<a:SerialNumber i:nil="true"/>
<a:SourcingLocation/>
<a:StoreId/>
<a:TaxAmount>7.02</a:TaxAmount>
<a:UomId>PCS</a:UomId>
<a:ValidateTax>false</a:ValidateTax>
<a:VariantDescription/>
<a:VariantId/>
<a:VendorSourcing>false</a:VendorSourcing>
</a:OrderLine>
</a:OrderLines>
<a:OrderPayments/>
<a:OrderType>Sale</a:OrderType>
<a:PointAmount>1240.20</a:PointAmount>
<a:PointBalance>4406.00</a:PointBalance>
<a:PointCashAmountNeeded>0.00</a:PointCashAmountNeeded>
<a:PointsRewarded>124.02</a:PointsRewarded>
<a:PointsUsedInOrder>0.00</a:PointsUsedInOrder>
<a:ReceiptNo/>
<a:ShipOrder>false</a:ShipOrder>
<a:ShipToAddress xmlns:b="http://lsretail.com/LSOmniService/Base/2017">
<b:Address1/>
<b:Address2/>
<b:CellPhoneNumber/>
<b:City/>
<b:Country/>
<b:County/>
<b:HouseNo/>
<b:Id/>
<b:PhoneNumber/>
<b:PostCode/>
<b:StateProvinceRegion/>
<b:Type>Residential</b:Type>
</a:ShipToAddress>
<a:ShipToEmail/>
<a:ShipToName/>
<a:ShippingAgentCode/>
<a:ShippingAgentServiceCode/>
<a:StoreId>S0013</a:StoreId>
<a:TotalAmount>124.02</a:TotalAmount>
<a:TotalDiscount>27.00</a:TotalDiscount>
<a:TotalNetAmount>117.00</a:TotalNetAmount>
</OneListCalculateResult>
</OneListCalculateResponse>
</s:Body>
</s:Envelope>
Click and Collect Order Flow
In case of click and collect, in LS Central required tax area code should be selected for each click and collect store.
Example
- Customer adds item to cart.
- Customer selects Store #S0001.
- Basket Calculation sends:
- Store ID: S0001
- LS Central uses Tax Area Code assigned to Store #S0001.
- Returns sales tax = 12%.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://lsretail.com/LSOmniService/Base/2017" xmlns:ns2="http://lsretail.com/LSOmniService/Loy/2017" xmlns:ns3="http://lsretail.com/LSOmniService/EComm/2017/Service">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns3:OneListCalculate>
<ns3:oneList>
<ns1:Id xsi:nil="true"/>
<ns2:CardId>10043</ns2:CardId>
<ns2:CardLinks xsi:nil="true"/>
<ns2:Currency>USD</ns2:Currency>
<ns2:CurrencyFactor>1.00</ns2:CurrencyFactor>
<ns2:CustomerId xsi:nil="true"/>
<ns2:Description xsi:nil="true"/>
<ns2:IsHospitality>false</ns2:IsHospitality>
<ns2:Items>
<ns2:OneListItem>
<ns1:Id>189</ns1:Id>
<ns2:Amount>144</ns2:Amount>
<ns2:BarcodeId>785060608006</ns2:BarcodeId>
<ns2:Detail xsi:nil="true"/>
<ns2:Image xsi:nil="true"/>
<ns2:Immutable>true</ns2:Immutable>
<ns2:ItemCategory xsi:nil="true"/>
<ns2:ItemDescription xsi:nil="true"/>
<ns2:ItemId>40000</ns2:ItemId>
<ns2:Location xsi:nil="true"/>
<ns2:OnelistItemDiscounts xsi:nil="true"/>
<ns2:OnelistSubLines xsi:nil="true"/>
<ns2:Price>72</ns2:Price>
<ns2:ProductGroup xsi:nil="true"/>
<ns2:Quantity>2</ns2:Quantity>
<ns2:UnitOfMeasureDescription xsi:nil="true"/>
<ns2:UnitOfMeasureId>PCS</ns2:UnitOfMeasureId>
<ns2:VariantDescription xsi:nil="true"/>
<ns2:VariantId xsi:nil="true"/>
<ns2:VariantRegistration xsi:nil="true"/>
</ns2:OneListItem>
</ns2:Items>
<ns2:ListType>Basket</ns2:ListType>
<ns2:MemberPriceGroupCode xsi:nil="true"/>
<ns2:Name xsi:nil="true"/>
<ns2:PriceGroupCode xsi:nil="true"/>
<ns2:PublishedOffers/>
<ns2:SalesType>POS</ns2:SalesType>
<ns2:ShipToCountryCode xsi:nil="true"/>
<ns2:ShipToCounty xsi:nil="true"/>
<ns2:ShipToPostCode xsi:nil="true"/>
<ns2:StoreId>S0001</ns2:StoreId>
</ns3:oneList>
</ns3:OneListCalculate>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<OneListCalculateResponse xmlns="http://lsretail.com/LSOmniService/EComm/2017/Service">
<OneListCalculateResult xmlns:a="http://lsretail.com/LSOmniService/Loy/2017" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Id xmlns="http://lsretail.com/LSOmniService/Base/2017">{166EEC6C-69A7-4F4C-B106-EAC638651771}</Id>
<a:CardId>10043</a:CardId>
<a:CollectLocation/>
<a:ContactAddress xmlns:b="http://lsretail.com/LSOmniService/Base/2017">
<b:Address1/>
<b:Address2/>
<b:CellPhoneNumber/>
<b:City/>
<b:Country/>
<b:County/>
<b:HouseNo/>
<b:Id/>
<b:PhoneNumber/>
<b:PostCode/>
<b:StateProvinceRegion/>
<b:Type>Residential</b:Type>
</a:ContactAddress>
<a:ContactId/>
<a:ContactName/>
<a:Currency>USD</a:Currency>
<a:CurrencyFactor>1.00</a:CurrencyFactor>
<a:CustomerId>44090</a:CustomerId>
<a:DayPhoneNumber/>
<a:Email/>
<a:OrderDiscountLines>
<a:OrderDiscountLine>
<Id xmlns="http://lsretail.com/LSOmniService/Base/2017"/>
<a:Description>Denim on denim discount 15%</a:Description>
<a:DiscountAmount>27.00</a:DiscountAmount>
<a:DiscountPercent>18.75</a:DiscountPercent>
<a:DiscountType>PeriodicDisc</a:DiscountType>
<a:LineNumber>10000</a:LineNumber>
<a:No>10000</a:No>
<a:OfferNumber>P1060</a:OfferNumber>
<a:OrderId/>
<a:PeriodicDiscGroup>P1060</a:PeriodicDiscGroup>
<a:PeriodicDiscType>DiscOffer</a:PeriodicDiscType>
</a:OrderDiscountLine>
</a:OrderDiscountLines>
<a:OrderLines>
<a:OrderLine>
<Id xmlns="http://lsretail.com/LSOmniService/Base/2017">189</Id>
<a:Amount>124.02</a:Amount>
<a:ClickAndCollectLine>false</a:ClickAndCollectLine>
<a:DiscountAmount>27.00</a:DiscountAmount>
<a:DiscountPercent>18.75</a:DiscountPercent>
<a:InventoryTransfer>false</a:InventoryTransfer>
<a:ItemDescription>Jeans Linda line</a:ItemDescription>
<a:ItemId>40000</a:ItemId>
<a:ItemImageId>40000</a:ItemImageId>
<a:LineNumber>10000</a:LineNumber>
<a:LineType>Item</a:LineType>
<a:LotNumber i:nil="true"/>
<a:NetAmount>117.00</a:NetAmount>
<a:NetPrice>72.00</a:NetPrice>
<a:OrderId/>
<a:Price>72.00</a:Price>
<a:Quantity>2</a:Quantity>
<a:SerialNumber i:nil="true"/>
<a:SourcingLocation/>
<a:StoreId/>
<a:TaxAmount>7.02</a:TaxAmount>
<a:UomId>PCS</a:UomId>
<a:ValidateTax>false</a:ValidateTax>
<a:VariantDescription/>
<a:VariantId/>
<a:VendorSourcing>false</a:VendorSourcing>
</a:OrderLine>
</a:OrderLines>
<a:OrderPayments/>
<a:OrderType>Sale</a:OrderType>
<a:PointAmount>1240.20</a:PointAmount>
<a:PointBalance>4406.00</a:PointBalance>
<a:PointCashAmountNeeded>0.00</a:PointCashAmountNeeded>
<a:PointsRewarded>124.02</a:PointsRewarded>
<a:PointsUsedInOrder>0.00</a:PointsUsedInOrder>
<a:ReceiptNo/>
<a:ShipOrder>false</a:ShipOrder>
<a:ShipToAddress xmlns:b="http://lsretail.com/LSOmniService/Base/2017">
<b:Address1/>
<b:Address2/>
<b:CellPhoneNumber/>
<b:City/>
<b:Country/>
<b:County/>
<b:HouseNo/>
<b:Id/>
<b:PhoneNumber/>
<b:PostCode/>
<b:StateProvinceRegion/>
<b:Type>Residential</b:Type>
</a:ShipToAddress>
<a:ShipToEmail/>
<a:ShipToName/>
<a:ShippingAgentCode/>
<a:ShippingAgentServiceCode/>
<a:StoreId>S0001</a:StoreId>
<a:TotalAmount>124.02</a:TotalAmount>
<a:TotalDiscount>27.00</a:TotalDiscount>
<a:TotalNetAmount>117.00</a:TotalNetAmount>
</OneListCalculateResult>
</OneListCalculateResponse>
</s:Body>
</s:Envelope>