Tax identifiers
Learn how to manage and apply tax identifiers.
In versions 2021-02-23
and later, use the features described on this page to manage tax identifiers. Once you upgrade to any of these versions, the tax identifiers you previously created through the Customers API will no longer be available. Please contact us to have your data migrated.
For versions 2020-12-17
and earlier, refer to the Tax identifiers (legacy) section on the Setting up tax exemptions page.
In the Digital River API, tax identifiers are used for tax assessment and invoicing purposes.
When you create a tax identifier, we initiate a validation process. Once the tax identifier object transitions to the appropriate verification state, and assuming it's applicable to the order, it can be used to determine an order's taxability.
To apply a tax identifier, you can attach it directly to a checkout or invoice. Alternatively, you can associate it with a customer and then use it in registered checkouts.
Your checkout flow should also consider that some countries require tax identifiers. When a customer in one of these countries doesn't supply a tax identifier, we block the order and provide notification of the problem.
You can use our test tax identifiers when you're ready to evaluate your integration.
Background
In most value-added tax (VAT) schemes, domestic sales to business customers are assessed tax and customers then take a credit for this tax paid when they complete their monthly or quarterly VAT return. In these cases, customers need the invoice to display their tax identifier so they can obtain this credit.
Alternatively, cross-border sales to business customers are not assessed tax in most VAT schemes. Instead, in a practice called reverse charge, customers self-assess the tax while simultaneously taking a credit for the tax when they complete their monthly or quarterly VAT return. In these cases, the tax identifier is used to determine whether or not a reverse charge applies to a specific order.
Additionally, in a limited number of cases, tax identifiers are collected because they are required by a specific country’s tax authority for invoicing purposes.
The tax identifier object
In the Digital River APIs, a tax identifier is always represented by a unique identifier. Additionally, the object will contain attributes that indicate its type and value, its state, and created time.
In some cases, a tax identifier may also include a customer identifier, a verified name and address, and an updated time.
Unique identifier
A tax identifier is always returned with a unique id
. Besides using this identifier to retrieve and delete a tax identifier, you can use it to attach a tax identifier to a checkout or associate it with a customer.
Customer identifier
The customerId
is only returned when the tax identifier is associated with a customer.
Type and value
The type
attribute identifies the country that issued the tax identifier. The available types typically consist of a lowercase, two-letter country code. However, some countries have more than one
and contain a suffix to the country code. For example, Brazil has tax identifiers with types of br
, br_ie
, and br_natural
.
The value
is assigned by the issuing country. Before creating a tax identifier, you can use the tax identifier element to help you validate its format. This element also lets you know whether a tax identifier is required in the country where the purchase is being made.
States and triggered events
A tax identifier can be in a state of pending
, not_valid
, and verified
. Its state is dependent on where it is in the verification process.
Each state transition causes a corresponding event to be emitted whose data.object
consists of the tax identifier.
(1) When the tax identifier is... | (2) its state transitions to... | (3) and a...event is emitted. |
---|---|---|
under review by an external verification agency |
|
|
determined to be valid |
|
|
determined to be invalid |
|
|
A tax identifier in any state can be attached directly to a checkout or associated with a customer. Before taking either action, your integration should ideally wait to receive the tax_identifier.verified
event. However, a tax identifier in either a pending
or verified
state is used to determine an order's taxability.
Additionally, as it moves from one state to another, an ISO8601 formatted date and time is returned in the stateTransitions
hash table.
Verified name and address
During the tax identifier verification process, we sometimes are able to obtain the holder's verifiedName
and verifiedAddress
.
Created and updated time
A tax identifier always contains a createdTime
. When a tax identifier is associated with a customer, its state changes, or the holder's name and address is added, then the time these events occurred is reflected in the updatedTime
field.
How we validate tax identifiers
When a POST/ tax-identifiers
request is submitted, Digital River initiates a validation process. As part of this process, we always validate the format of a tax identifier, whatever its country of origin. Incorrectly formatted tax identifiers return the following error:
Prior to creating a tax identifier, you can use the tax identifier element to perform validation.
For European Union tax identifiers, commonly known as Value Added Tax (VAT) numbers, we use the VAT Information Exchange System (VIES) to validate the customer's data.
After a POST /tax-identifiers
is submitted, Digital River provides VIES with the data submitted in the request. VIES, in turn, transmits our validation query to the database of the relevant member state. The member state's reply to VIES indicates whether the number exists and, if so, whether it's valid. The reply may also include the holder's name and address. VIES then relays this information back to us.
VIES no longer verifies VAT numbers from Great Britain.
If VIES successfully responds before the checkout is converted to an order, then the tax identifier's state
transitions to either verified
or not_valid
. This causes either a tax_identifier.verified
or tax_identifier.not_valid
event to fire. If the number is verified, then the tax identifier is immediately applied to the order.
In many situations, however, VIES responds slowly or is down for scheduled or unscheduled reasons. This means the tax identifier might not transition from pending
to verified
until after order creation. We treat a pending
tax identifier as being verified
in these cases until we know otherwise. In other words, pending
and verified
tax identifiers are both used by Digital River to determine an order's taxability.
If VIES indicates a tax identifier is not_valid
, then we don't use it to determine an order's taxability.
A tax identifier's information is displayed on invoices, regardless of its state
.
For certain countries, we also apply validation algorithms defined by the local authority that issued the number.
When tax identifiers can be applied to checkouts
Before a tax identifier can be successfully applied to a checkout, the tax identifier type, the customer type, the selling entity, and the country (a ship to country for physical goods or a bill to country for digital goods) must all be in agreement.
With a few notable exceptions, most countries only allow business
customers to apply tax identifiers.
For example, the following is a partial response to a POST/orders
request. In this case, a tax identifier has been successfully applied. This is because the tax identifier's type
is in agreement with the order's shipTo.country
and the customer is a business
entity.
If you were to submit another POST/orders
request with the same settings—the only difference is that in the new request, you specified ashipTo.country
of DK
(Denmark)—you'd receive a 409 Conflict
response. Customers holding tax identifiers issued by one country can't apply them to orders shipped to a different country.
How we select tax identifiers
Digital River first searches for applicable tax identifiers directly attached to a checkout or invoice. This is true whether you're checking out a guest customer or a registered customer.
However, when it's a registered checkout and that customer has associated tax identifiers that are applicable, and those tax identifiers are not yet attached, we apply them as well.
If no tax identifiers are directly attached to a checkout or invoice and the customer is a guest, we don't use any tax identifiers when computing taxes.
Managing tax identifiers
Before they are applied to orders, we provide you the ability to validate the tax identifier information provided by customers. Once validated, you can use the Tax Identifiers API to create, retrieve, delete, and search for them.
You can also attach tax identifiers to customers and then later, if necessary, detach them. To reassign or replace tax identifiers, you must first delete the existing object before creating a new one.
Validating tax identifiers
You can use the tax identifier element to validate the format entered by a customer and determine whether a tax identifier is required and applicable to the transaction. To create the element, you must use some combination of the selling entity identifier, payment session identifier, and ship to/bill to ISO 3166 country code returned in a Checkout or Invoice.
When you configure the element with a payment session identifier, we filter out tax identifiers that are not applicable to the transaction.
Creating tax identifiers
You use the POST/tax-identifiers
method to create a tax identifier. In the request, you must specify both a type and value. Once the request is submitted, we initiate a validation process.
The following is an example 201 Created
response. It doesn't contain a customerId
because the tax identifier hasn't been attached to a customer yet. The pending state of the tax identifier indicates it's still being validated by an external agency.
Deleting tax identifiers
You can delete a tax identifier by submitting a DELETE/tax-identifiers/{id}
request that sends its unique identifier as a path parameter. A successful request returns a 204 No Content
response. It also triggers a tax_identifier.deleted
event and detaches the tax identifier from any customer it may have been associated with.
Once a tax identifier is deleted, if you later attempt to attach it to a customer, you'll get the following 404 Not Found
error.
Attaching tax identifiers to customers
Once you've created a tax identifier, you can use the POST/customers/{id}/tax-identifiers/{taxId}
method to attach it to an existing customer. This request returns the tax identifier and triggers a customer.tax_identifier.created
event. The event's data.object
also represents the tax identifier.
The customerId
attribute is populated in the response since it's now associated with a customer. The following example response shows a British (uk
) issued tax identifier in a verified state. When the customer next makes an applicable purchase, this tax identifier will be automatically applied to the order.
Detaching tax identifiers from customers
To disassociate a tax identifier from a customer, send a delete request through the Tax Identifiers API. A successful request means that when the customer creates applicable registered checkouts in the future, this tax identifier will no longer be applied.
Reassigning tax identifiers
The same tax identifier object can't be attached to multiple customers. If you attempt to associate a tax identifier with a customer, but it's already attached to a different customer, you'll receive a 409 Conflict
response.
In these cases, you must first delete the tax identifier, create a new object with an identical type and value, and then assign it to the desired customer.
Replacing a customer's tax identifier
Customers can have multiple tax identifiers, but they can't have more than one of the same type. So if you'd like to attach a new tax identifier to a customer, but that customer already holds one with that type
, you must first delete the existing object. Once you've consumed either the 204 No Content
response or the tax_identifier.deleted
event, your integration can create the new tax identifier and attach it to the same customer.
Applying tax identifiers
Once they are created, there are two ways to apply tax identifiers to a purchase. You can either attach the tax identifier directly to a checkout or invoice. Or you can use tax identifiers in registered checkouts.
In either case, during the checkout process, we determine whether the tax identifier is applicable and notify you of missing tax identifiers.
You should also ensure you pass the necessary information to correctly display the tax identifier on invoices.
Attaching tax identifiers to checkouts and invoices
When checking out both registered and guest customers, you can attach tax identifiers directly to a checkout or invoice. You do this by using a POST/checkouts
,POST/checkouts/{id}
, or POST/invoices
request and sending the object's identifier in the taxIdentifiers
array.
A successful response returns a checkout or invoice that contains an array of tax identifier objects. The state
of each tax identifier, which indicates whether it will be used to determine an order's taxability, depends on how it is validated.
For registered checkouts, any tax identifiers directly attached to the checkout must be associated with the customer placing the order. If any are held by a different customer, the following 409 Conflict
response is returned:
Before attaching a tax identifier, you should determine whether it's applicable.
When using a customer's saved tax identifier, make sure you determine whether it exists. If you associate a tax identifier with a checkout, but the object has been deleted, we return the following error:
Using tax identifiers in registered checkouts
This information in this section is only applicable to versions 2021-03-23
and earlier of the Digital River APIs.
For more information, refer to registered checkouts on the Checking out guest and registered customers page.
When you create a registered checkout, we search for applicable tax identifiers attached to that customer. If we locate any, they are automatically applied to the checkout or invoice and returned in its taxIdentifiers
array.
You can send an empty taxIdentifiers
array to instruct Digital River not to automatically apply tax identifiers.
For example, let's say a business customer holds a tax identifier of type dk
(Denmark) and another of type uk
(Great Britain). In a POST/checkouts
request, you associate this customer with the checkout and specify a ship to country of GB
(Great Britain).
In this case, only the uk
tax identifier is returned in the response. This is because tax identifiers are not applied to purchases when the type and ship to country are not in agreement.
Filtering applicable tax identifiers
If you attach a tax identifier to a checkout and the necessary requirements are not met, you receive an error:
To avoid this, you can apply a filter using the tax identifier's applicability
block. This data structure contains the following attributes:
country
: The ship to country for physical goods or the bill to country for digital goodsentity
: The selling entity of the transactioncustomerType
: The type of customer making the purchase
Each attribute provides the required transaction values that must exist before a tax identifier can be successfully applied. In other words, the corresponding values in the checkout/invoice must be the same. If they're not, the tax identifier isn't applicable.
The applicability
block is especially useful with saved tax identifiers. But, if for some reason you decide not to use the tax identifier element as a filter, you can also use applicability
with new tax identifiers.
Saved tax identifiers
During registered checkouts, you can use applicability
to filter customers' saved tax identifiers and display this filtered list to them on your site. Once the transaction's customer type is set and we've assigned a selling entity, make a GET/customers/{id}
request to retrieve the customer's saved tax identifiers.
In registered checkouts, you can send an empty taxIdentifiers
array to instruct Digital River not to automatically apply tax identifiers.
In the following example, a customer has two saved tax identifiers. Both are applicable for DR_IRELAND-ENTITY
facilitated transactions. The first tax identifier, however, is only appropriate for purchases made by individuals in Italy, while the other can be used for business transactions in the Netherlands.
Next, use the checkout's shipTo.country
(or billTo.country
for digital goods), sellingEntity.id
, and customerType
, along with the corresponding values in each of the customer's applicability
blocks, to filter out the non-applicable tax identifiers.
After that, display this filtered list to the customer. Once the customer selects an option, attach that tax identifier to the transaction.
New tax identifiers
If a registered or guest customer supplies new tax identifier information during checkout, send the necessary data in a POST/tax-identifiers
request. You can then use applicability
in the response to determine whether the checkout contains the matching country, selling entity, and customer type values.
In this scenario, we suggest using the tax identifier element to determine applicability.
If it does, attach the tax identifier to the checkout. If not, inform the customer that they provided an ineligible tax identifier. In the following guest checkout, the customer-supplied tax identifier is not applicable because the customerType
values are not in agreement.
Informing Digital River not to apply tax identifiers
When you want to inform us that no tax identifiers should be applied to a registered checkout, submit a create or update request with an empty taxIdentifiers
array. This indicates that none of the customer's applicable tax identifiers should be used to determine the order's taxability.
For example, if a customer selects a saved tax identifier during the checkout process, but later deselects it, you can submit the following POST/checkouts/{id}
request to ensure it's not applied.
On the other hand, not including thetaxIdentifiers
array in a registered checkout has no effect. In this scenario, we automatically apply any applicable tax identifiers that are saved to the customer's account.
Missing tax identifier notifications
In some countries, customers are required to provide a valid tax identifier when conducting online transactions. If customers in these countries don't provide this information, Digital River blocks their orders from being placed.
During checkout, you can use the tax identifier element to determine whether a tax identifier is required in the customer's country.
As an example, let's say a POST/checkouts
request specifies a customer type of individual
and a ship-to country of BR
(Brazil). In that same request, if no tax identifiers with a type
of br_natural
are either attached directly to the checkout or associated with the customer placing the order, you'll receive a 409 Conflict
response.
Ensuring tax identifier information displays on invoices
After an order is successfully fulfilled and receiving the necessary events, you can share the generated invoice with customers. When a business customer applies a tax identifier, the company name needs to be displayed on these invoices. To ensure this happens, you must set the organization
parameter when specifying a shipping address for orders that contain physical products.
Supported tax identifiers
The following table lists the combination of ship to country, tax id type, customer type, and selling entity that must be in alignment before a tax identifier can be applied to an order.
As the table indicates, most countries don't require a tax identifier when making an online purchase within their borders. For those that do, however, customers can't conduct transactions without first providing a valid tax identifier.
Ship to country | Tax id type | Customer Type | Selling Entity | Required? | Description |
---|---|---|---|---|---|
Australia |
|
|
| No | ABN |
Austria |
|
|
| No | VAT Number |
Bahrain |
|
|
| No | VAT Number |
Belarus |
|
|
| No | VAT Number |
Belgium |
|
|
| No | VAT Number |
Brazil |
|
|
| Yes | Cadastro Nacional da Pessoa Jurídica |
Brazil |
|
|
| Yes | Inscrição Estadual |
Brazil |
|
|
| Yes | Cadastro de Pessoas Físicas (individuals) |
Bulgaria |
|
|
| No | VAT Number |
Canada |
|
|
| No | Canadian GST |
Canada |
|
|
| No | GST Number |
Chile |
|
|
| No | RUT |
Chile |
|
|
| No | RUT |
Colombia |
|
|
| No | VAT Number |
Croatia |
|
|
| No | VAT Number |
Cyprus |
|
|
| No | VAT Number |
Czech Republic |
|
|
| No | VAT Number |
Denmark |
|
|
| No | VAT Number |
Estonia |
|
|
| No | VAT Number |
Finland |
|
|
| No | VAT Number |
France |
|
|
| No | VAT Number |
Germany |
|
|
| No | VAT Number |
Greece |
|
|
| No | VAT Number |
Hungary |
|
|
| No | VAT Number |
Iceland |
|
|
| No | VAT Number |
India |
|
|
| No | GSTIN |
Indonesia |
|
|
| No | NPWP |
Ireland |
|
|
| No | VAT Number |
Isle of Man |
|
|
| No | VAT Number |
Isle of Man |
|
|
| No | VAT Number |
Italy |
|
|
| No | VAT Number |
Italy |
|
|
| No | Codice Fiscal (individuals) |
Italy |
|
|
| No | VAT Number (individuals) |
Japan |
|
|
| No | TIN |
Japan |
|
|
| No | Consumption Tax ID (offshore) |
Kenya |
|
|
| Yes | PIN |
Korea |
|
|
| No | VAT Number (offshore) |
Latvia |
|
|
| No | VAT Number |
Lithuania |
|
|
| No | VAT Number |
Luxembourg |
|
|
| No | VAT Number |
Malaysia |
|
|
| No | VAT Number |
Malta |
|
|
| No | VAT Number |
Mexico |
|
|
| No | RFC |
Mexico | mx |
|
| No | RFC |
Monaco |
|
|
| No | VAT Number |
Netherlands |
|
|
| No | VAT Number |
New Zealand |
|
|
| No | GST ID |
Norway |
|
|
| No | VAT Number |
Philippines |
|
|
| No | TIN |
Poland |
|
|
| No | VAT Number |
Portugal |
|
|
| No | VAT Number |
Portugal |
|
|
| No | NIF |
Romania |
|
|
| No | VAT Number |
Russia |
|
|
| No | INN |
Russia |
|
|
| No | INN |
Saudi Arabia |
|
|
| No | VAT Number |
Singapore |
|
|
| No | VAT Number |
Slovakia |
|
|
| No | VAT Number |
Slovenia |
|
|
| No | VAT Number |
South Africa |
|
|
| No | VAT Number |
Spain |
|
|
| No | VAT Number |
Sweden |
|
|
| No | VAT Number |
Switzerland |
|
|
| No | VAT Number |
Taiwan |
|
|
| Yes | Unified Business Number |
Taiwan |
|
|
| Yes | Unified Business Number (offshore) |
Thailand |
|
|
| No | VAT Number |
Turkey |
|
|
| No | VAT Number |
Ukraine |
|
|
| No | VAT Number |
United Arab Emirates |
|
|
| No | VAT Number |
United Kingdom |
|
|
| No | VAT Number |
United Kingdom |
|
|
| No | VAT Number |
Test tax identifiers
In the test environment, the following type
and value
pairs allow you to create verified
tax identifiers:
Country |
|
|
Belgium |
|
|
Germany |
|
|
Italy |
|
|
The Italian values can be paired with either it
or it_natural
. The type
you specify depends on whether you're applying the tax identifier to a test purchase made by an individual
or a business
. Once you create a test tax identifier, you can always reference applicability
to determine its appropriate use.
Last updated