Avalara > Blog > Developer > Avalara Customs Duty and Import Tax Badge

Avalara Customs Duty and Import Tax Badge


AvaTax provides features to help you sell a B2C shipment of goods across country borders in an ecommerce environment by calculating what’s called the “landed cost.”

A landed cost is the total cost of an item including customs duty and import taxes incurred from moving the product from the seller's facility in one country to the buyer's door in another. Once you’ve begun using AvaTax REST, you’ll simply have to make a few changes to your CreateTransaction request to do a cross-border transaction, which includes the customs duty and import tax. 

Warning: This post is a little longer than usual. However, we hope you find the information useful.

Cross-border AvaTax Account prerequisites:

  1. Your AvaTax Account must be set up with Global and LandedCost Service Type entitlements
  2. Cross-border Nexus will need to be added to your Account (this can be serviced by using our APIs)
  3. Taxconfig Settings will need to be set appropriately to get the correct default behavior for Importer of Record (currently a back-end process only engineering can service at the Account Level) 

Tariff codes

For every product in your transaction, you must identify the Harmonized System Code (HS code or “tariff code”) for that item. The Harmonized System is a system to classify globally traded goods. The first six digits of these HS codes are typically harmonized internationally but beyond six digits, they will vary by country, so these tariff codes will vary by destination country.

You must pass the hsCode in your CreateTransaction request on each applicable line.

For the example below, we’ll use the code 6403519030, which refers to “Other Footwear With Outer Soles Of Leather”. The exact details of these HS codes are quite complex. As a side note; you can find the details of HS Code 6403519030 using the GetCrossBorderCode request.  

What is de minimis? 

An interesting item of note: Most countries have a “de minimis” threshold — this is each country’s threshold under which customs duty and tax do not apply. The de minimis is determined per the ship-to country and AvaTax will use the currency code passed in the request to determine if the amount of the applicable line item(s) exceeds the de minimis threshold for each HS code passed in the request.

Who pays?

The next thing we need to know about your transaction(s) is who’s responsible for paying the customs duty and tax. If the seller is set as the importer of record, then the selling party bears the risk and responsibility of coordinating the customs clearance (including customs duty and import tax payment) to facilitate delivery to the buyer's door.

If the seller is not the importer of record, then the buyer is responsible for declaring the shipment to the customs authorities in the destination country and remitting any and all customs duty and import tax (including VAT) prior to the shipment being delivered. In this post, we’ll see both sides of who pays and the value in showing the total amount of customs duty and tax for the shipment to prevent having unhappy customers.

Shipping and insurance

Calculating the landed cost for cross-border transactions involves knowing how much is paid for shipping and insurance. To provide these data elements, we’ll add a line item into our transaction for TaxCode FR010000, which is the tax code for freight charges, and a line item for TaxCode FR070100, which is insurance. If you forget what tax codes you want to use, you can always call the API at /api/v2/definitions/taxcodes  this will give a full list of all Avalara defined tax codes you can use for your transactions. Shipping and insurance can dramatically change the amount of customs duty and import tax as in some import scenarios these costs are added to the tax base of the goods before calculating the final customs duty and import tax amounts.

What does an AvaTax transaction look like for a simple cross-border business-to-consumer shipment of goods?

Let’s plan to ship some shoes from Prince Edward Island in Canada to Bainbridge Island in Washington state, USA. In our first request, we’ll assume the buyer has the obligation to pay the import customs costs. Here’s what our request will look like:

Request

    {
  "type": "SalesInvoice",
  "date": "2019-02-12",
  "customerCode": "Guest",
  "addresses": {
    "ShipFrom": {
      "region": "PE",
      "postalCode": "C1A 4P3",	
      "country": "CA"
      
    },
    "ShipTo": {
      "city": "Bainbridge Island",
      "region": "WA",
      "country": "US",
      "postalCode": "98110"
    }
  },
  "lines": [
    {
      "number": "1",
      "quantity": 1,
      "amount": 1000,
      "taxCode": "P0000000",
      "hsCode" : "6403519030" 
    },
    {
      "number": "2",
      "quantity": 1,
      "amount": 50,
      "description": "Shipping",
      "taxCode": "FR010000"
    },
    {
      "number": "3",
      "quantity": 1,
      "amount": 50,
      "description": "Insurance",
      "taxCode": "FR070100"
    }
  ],
  
  "currencyCode": "USD",
  "isSellerImporterOfRecord": false
}

Result

The result object is rich with information. It has information about all the line items, all the jurisdictions, and all the duty and taxes calculated, if any. For the moment, let’s focus on the results for the Footwear line item:

    "nonPassthroughDetails": [
                {
                    "id": 2717959848,
                    "country": "US",
                    "jurisName": "UNITED STATES",
                    "nonTaxableType": "RateRule",
                    "rate": 0.001,
                    "sourcing": "Destination",
                    "tax": 1,
                    "taxableAmount": 1000,
                    "taxType": "LandedCost",
                    "taxName": "US LandedCost",
                    "isNonPassThru": true
                }

You can see that a landed cost calculation was run. However, take note that this tax detail is a NonPassThru, which means the seller will not be collecting this financial value and asking the buyer to remit it as part of the sale. The seller is not the importer of record. Now, if we look at our message section of the results, we get a clear idea of what has taken place and the action the seller can take to set the right expectation of final delivery costs to the buyer.

    "messages": [
        {
            "summary": "Shipment meets US import duty de minimis threshold. Therefore, import duty applies.",
            "details": "",
            "refersTo": "LandedCost",
            "severity": "Success",
            "source": "Avalara.AvaTax.Services.Tax"
        },
        {
            "summary": "Estimated import customs duty & tax calculated. Buyer is the importer of record and will pay import customs duty & tax upon arrival in destination country. 100 Import Duty and 99 Retail Sales and Use tax applies.",
            "details": "",
            "refersTo": "LandedCost",
            "severity": "Success",
            "source": "Avalara.AvaTax.Services.Tax"
        }
    ]

The shipment does meet the United States import duty de minimis threshold; import duty will be assessed. Why is there no local tax? In this example, the seller has no obligation to collect the local tax to Washington state. However, we’re letting the buyer know they may be responsible for the additional expense of $199. The seller will want to present the information to the buyer at the time of purchase in their shopping cart, which might look like this:

Order Summary

Subtotal

1,000.00

Shipping and Insurance

    100.00

Tax

0.00

Order Total

1,100.00

Note: Estimated import customs duty and tax calculated. Buyer is the importer of record and will pay import customs duty and tax upon arrival in the destination country. 100 Import Duty and 99 Retail Sales and Use tax applies.

Cross-border business-to-consumer shipment of goods when the seller is the importer of record

Let’s plan to ship the same shoes from Prince Edward Island in Canada to Bainbridge Island in Washington state, USA. In this request, we will assume the seller is the importer of record and has the obligation to pay the import customs costs and local taxes. 

You can see the customs duty was calculated. However, take note that this tax detail "isNonPassThru" value was set to false, which means the seller will be collecting this financial value and asking the buyer to remit it as part of the sale. In this case, the seller order summary might look like this:

Order Summary

Subtotal

1,000.00

Shipping and Insurance

100.00

Sales Tax

99.00

Customs Duty and Import Tax

100.00

Order Total

1,299.00


That’s the basics!

Other considerations

  • Trade preference programs can be applied to a cross-border transaction and have a significant impact on the duty. Currently, Avalara supports NAFTA. However, we will roll other programs out over time. The important thing to remember on trade preference is the program applied is dependent on the country of export and import. AvaTax is designed to apply the correct application program based on where the goods are shipped from and where they’re going.
  • Plan for supporting Shipping mode in your integration so when a method of shipment is selected you can correctly associate either "air","ground", or "ocean" to request. AvaTax is being designed to recognize the nuances in calculating a landed cost based on the mode of shipment.
  • Make sure you pass a transaction currency code or the de minimis determination will not calculate correctly.  

Handling errors

A successful operation will return a Response Code of 200. There are a few types of errors to look out for when calling the CreateTransaction API:

  • Invalid Trade program
  • Make sure with each HS code you map to an item you have all the required information or it will result in getting an error: "Attributes required for this transaction line but could NOT be located in parameter bag item. Missing Attributes/ParameterBagItems are: AvaTax.Units.Mass". To avoid this, make sure you test your items before using in your production system(s). Note: You can find valid Unit of Measure attributes using this API ListUnitofMeasurement.

Note: The tax code assigned to the item must be of ProductType "Good" or no duty calculation will be made on the line. In addition, if the hsCode is incorrect, no duty calculation will be made on the line.

What about supporting customs duty and import tax using the SOAP API?

We’ve built support for doing cross-border transactions using the SOAP API and the standard SDKs posted to speed up your development. Please only adopt the SOAP API and associated s if it absolutely makes the most business sense. We strongly recommend and encourage you to use our REST endpoints.

How do I find what other parameters are available?

In the REST v2 API, you can find a list of all other parameters via the endpoint/api/v2/definitions/parameters. When you call this API, it will list all the parameters that are available, and provide a quick description of each one. May all of your cross-border shipments be happily received!

Partners, how do you get the Customs Duty and Import Tax badge?

Partners interested in developing an option to enable a cross-border ecommerce experience in their platform can find the detailed requirement of the badge here. Get badged!

Avalara Certified Customs Duty & Import Tax badge

Sales tax rates, rules, and regulations change frequently. Although we hope you'll find this information helpful, this blog is for informational purposes only and does not provide legal or tax advice.
Avalara Author
Mark Withers
Avalara Author Mark Withers
Mark Withers is a founding team member of Avalara, starting in 2004. During his tenure with the company, he has worked on engineering, product, and program teams. Currently, he assists Avalara Partners with design, certification, and launching their Avalara integrations into the marketplace.