DOCS

Exenciones fiscales

Sincronice certificados de exención de impuestos de venta de EE. UU. con un perfil de cliente.

Si vende a revendedores, agencias gubernamentales u organizaciones sin fines de lucro, esos compradores tienen certificados de exención que los eximen del impuesto de venta en estados específicos. Zonos almacena esos certificados en un perfil de cliente para que un comprador exento pueda ser reconocido en el checkout.

Las exenciones se registran por jurisdicción. Un cliente exento en Carolina del Sur no está automáticamente exento en Texas, por lo que cada estado para el que el cliente tiene un certificado es un registro independiente con sus propias fechas y número de certificado.

Las exenciones se asocian a un cliente ya existente, por lo que la sincronización requiere dos llamadas: crear el cliente y luego sincronizar sus certificados. Ambas se identifican con su propio ID de cliente, el mismo customerId que utiliza en el resto de Checkout. Zonos nunca requiere que almacene un ID interno.

Esta función solo está disponible para integraciones de API personalizadas.

Las exenciones aún no se aplican a las cotizaciones de landed cost

Puede sincronizar y administrar exenciones hoy mismo, y los registros se almacenan en el perfil del cliente. La deducción de una exención en el impuesto de un landed cost estará disponible próximamente, por lo que una exención sincronizada aún no modifica el impuesto que se cotiza a un comprador. Sincronizar ahora significa que sus certificados ya estarán en su lugar cuando esto entre en vigor.

Crear o actualizar el cliente 

checkoutCustomerUpsert crea un perfil de cliente, o lo actualiza si ya existe uno para ese customerId. A diferencia de checkoutCustomerProfileAuthenticate, esto no requiere que el comprador esté presente, por lo que puede aprovisionar su lista de clientes con antelación. Consulte crear o actualizar un perfil sin un comprador para conocer el comportamiento completo de los campos.

1mutation checkoutCustomerUpsert($input: CheckoutCustomerProfileInput!) {
2 checkoutCustomerUpsert(input: $input) {
3 customerId
4 email
5 name
6 phone
7 }
8}

Como coincide según customerId, invocarlo repetidamente actualiza el mismo perfil en lugar de crear duplicados. Es seguro ejecutarlo en toda su lista de clientes en cada sincronización.

Sincronizar exenciones fiscales 

checkoutCustomerTaxExemptionsSync acepta varios clientes a la vez. Cada entrada reemplaza el conjunto completo de exenciones de ese cliente.

1mutation checkoutCustomerTaxExemptionsSync(
2$input: [CheckoutCustomerTaxExemptionSyncInput!]!
3) {
4 checkoutCustomerTaxExemptionsSync(input: $input) {
5 customerId
6 accepted {
7 id
8 countryCode
9 administrativeArea
10 effectiveAt
11 expiresAt
12 exemptionReason
13 }
14 rejected {
15 code
16 message
17 administrativeArea
18 effectiveAt
19 }
20 }
21}

Un expiresAt omitido significa que el certificado no caduca. Un exemptionReason omitido usa UNSPECIFIED de forma predeterminada.

Cómo funciona la sincronización 

Tres reglas rigen cada sincronización.

La lista es la fuente autorizada. taxExemptions es el conjunto completo del cliente, no una lista de cambios. Cualquier exención ya registrada que falte en la lista se elimina; así es como un certificado retirado deja de aplicarse. Enviar una lista parcial elimina silenciosamente todo lo que se omite.

Cada registro es una exención. No existe forma de registrar que un cliente no está exento en algún lugar; consulte la nota a continuación.

Eliminar todas las exenciones es una lista vacía. Para borrar los certificados de un cliente, envíelos con "taxExemptions": []. Omitir al cliente por completo en la carga útil deja intactos sus registros existentes.

Envíe solo las jurisdicciones en las que el cliente está exento

Zonos no tiene un registro de "no exento": una jurisdicción está en la lista o no lo está. Si su sistema almacena jurisdicciones exentas y no exentas juntas, filtre las exentas antes de sincronizar. Un registro no exento es indistinguible de un certificado real, por lo que se acepta en lugar de rechazarse, y el cliente será tratado como exento en ese estado.

Motivos de exención 

exemptionReason describe por qué el cliente está exento. Es opcional y usa UNSPECIFIED de forma predeterminada, pero indicarlo vale la pena; consulte a continuación.

Valor↕Se aplica a↕
RESALEBienes comprados para revender en lugar de consumir
FEDERAL_GOVERNMENTUna agencia o departamento federal de EE. UU.
STATE_LOCAL_GOVERNMENTUna agencia estatal, condado, municipio o distrito escolar
TRIBAL_GOVERNMENTUna tribu reconocida a nivel federal o un miembro tribal
CHARITABLEUna organización benéfica sin fines de lucro
RELIGIOUS_ORGANIZATIONUna iglesia u otra organización religiosa
EDUCATIONAL_ORGANIZATIONUna escuela o universidad
DIRECT_PAYUn comprador que tiene un permiso de pago directo y remite el impuesto por sí mismo
OTHERCualquier otro caso, incluidos diplomáticos extranjeros, producción agrícola, producción industrial y correo directo
UNSPECIFIEDNo se proporcionó un motivo

Los motivos se dividen en dos grupos, y la diferencia importa. Los motivos basados en la entidad (gobierno, benéfico, religioso, educativo) eximen al comprador sin importar lo que compre. Los motivos basados en el uso, sobre todo RESALE, solo cubren bienes que califican: un certificado de reventa cubre el inventario que el comprador revenderá, no el mobiliario de oficina del mismo pedido.

Sin un motivo, Zonos no puede distinguir entre ambos casos y solo puede eximir pedidos completos, lo cual es más difícil de justificar para los certificados de reventa. Si la mayoría de sus exenciones son de reventa, enviar RESALE como valor predeterminado con las excepciones indicadas individualmente suele suponer mucho menos trabajo que clasificar a cada cliente.

Referencia de exención 

exemptionReference es el número impreso en la documentación de exención del cliente. Según el estado y el tipo de exención, puede ser un número de permiso de reventa o de vendedor, un número de certificado de exención estatal, un número de permiso de pago directo o un ID fiscal federal.

Es obligatorio en cada registro. Almacénelo y envíelo exactamente como aparece en el certificado; los formatos varían ampliamente según la jurisdicción (SR EAA 12-345678, 85-8012345678C-9, 12-3456789), y Zonos conserva el valor tal como se envió, salvo por eliminar los espacios en blanco circundantes. No cambie las mayúsculas ni elimine guiones ni espacios.

Por privacidad, exemptionReference se puede enviar pero no se devuelve al leer las exenciones, ya que puede contener un ID fiscal federal.

Registros rechazados 

Los registros se validan uno por uno. Un registro rechazado se reporta en rejected y no hace fallar el resto del lote, ni altera la exención ya registrada para esa jurisdicción.

Código↕Causa↕
UNKNOWN_CUSTOMERNingún cliente coincide con customerId. Cree primero al cliente
UNKNOWN_JURISDICTIONadministrativeArea no es un estado, distrito o territorio de EE. UU. reconocido
INVALID_DATE_RANGEexpiresAt no es posterior a effectiveAt
MISSING_EXEMPTION_REFERENCEexemptionReference está vacío
DUPLICATE_JURISDICTIONDos registros en una misma carga útil comparten país, área y fecha de vigencia. Se conserva el primero

Los clientes desconocidos se rechazan en lugar de crearse, de modo que un customerId mal escrito aparece en la respuesta en lugar de crear un perfil que nunca coincidirá con un comprador real.

Solo se validan las áreas administrativas de EE. UU. Las subdivisiones de otros países se aceptan tal como se envían.

Leer y eliminar 

Lea las exenciones de un cliente para confirmar que una sincronización se realizó correctamente:

1query checkoutCustomerTaxExemptions($customerId: String!) {
2 checkoutCustomerTaxExemptions(customerId: $customerId) {
3 countryCode
4 administrativeArea
5 effectiveAt
6 expiresAt
7 exemptionReason
8 }
9}

Para eliminar todas las exenciones de un cliente, por ejemplo cuando cierra su cuenta, use checkoutCustomerTaxExemptionsDelete. Devuelve SUCCESS independientemente de si el cliente tenía exenciones o no, por lo que es seguro invocarlo más de una vez.

1mutation checkoutCustomerTaxExemptionsDelete($customerId: String!) {
2 checkoutCustomerTaxExemptionsDelete(customerId: $customerId)
3}

¿Fue útil esta página?