
Si vendés con Shopify en Argentina, no alcanza con cobrar el pedido: también tenés que definir cuándo, cómo y con qué datos se emite cada comprobante ante AFIP/ARCA.
Yo resumiría esta nota así: antes de salir a producción, tengo que revisar 7 puntos que cubren datos fiscales, checkout, reglas de emisión, webhooks, mapeo del pedido, notas de crédito y control posterior. Si uno falla, puedo terminar con facturas duplicadas, CAE mal asociado, pagos sin comprobante o devoluciones mal resueltas.
En simple, esta checklist me sirve para validar:
Hay un dato que no conviene pasar por alto: cuando el comprobante supera $ 21.505, AFIP pide informar nombre, domicilio e identificación del comprador. Y en webhooks, Shopify puede reintentar entregas fallidas hasta 8 veces en 4 horas, así que no alcanza con “que funcione”: también hay que controlar errores y duplicados.
Esta guía ordena ese trabajo para que ecommerce, desarrollo y finanzas hablen el mismo idioma antes del alta.
7 Checks para Integrar E-Invoicing en Shopify Argentina

Antes de integrar, resolvé estos tres puntos: perfil fiscal, datos del checkout y regla de emisión. Si esa base no está bien armada, la integración se rompe.
Sin CUIT activo y clave fiscal nivel 3 o superior, la integración no puede emitir comprobantes.
También conviene separar el punto de venta web del manual y usar uno habilitado para Factura Electrónica por Web Services. Ese número va a figurar en cada comprobante que emita la tienda, así que no es un dato menor.
La condición fiscal del emisor define qué comprobantes puede sacar el sistema. Un Responsable Inscripto emite Facturas A y B. Un Monotributista emite Facturas C. Esa regla tiene que quedar configurada en la app de facturación desde el arranque.
Después viene el catálogo. Cada SKU necesita tener bien marcado si está gravado o exento, qué alícuota de IVA le corresponde - 21%, 10,5%, 27% o exento - y, si aplica, su clasificación para exportación. En Shopify, esto se puede resolver con metafields de producto. Por ejemplo, afip.tax_rate para el mercado local.
Con el perfil fiscal listo, el paso siguiente es pedir y guardar bien esos datos en el checkout.
Shopify no pide CUIT ni condición fiscal de forma nativa. Por eso, hay que cargar CUIT, condición fiscal y datos de facturación en metafields, atributos de carrito o extensiones de checkout.
Para emitir un comprobante válido ante AFIP, necesitás estos datos:
Hay un detalle práctico que suele pasarse por alto. AFIP indica que, cuando el monto del comprobante supera los $21.505, se deben informar nombre, domicilio e identificación del comprador. En otras palabras, no alcanza con cobrar y seguir. Conviene validar el formato del CUIT en tiempo real y hacer que los datos de facturación queden completos antes de cerrar la compra.
Con esos campos resueltos, falta definir el momento exacto de emisión según cómo entra el pago.
Definí cuándo se emite según el medio de pago. Este punto tiene que quedar acordado por el equipo antes de configurar los webhooks. Si no, aparecen errores clásicos: facturas emitidas antes de tiempo, operaciones duplicadas o notas de crédito que se podrían haber evitado.
| Escenario de pago | Disparador | Lógica |
|---|---|---|
| Tarjeta de crédito (captura inmediata) | order.paid | Emitir cuando el gateway confirma la captura. |
| Autorización y captura diferida | Evento de captura confirmada | No emitir en autorización; esperar la captura efectiva. |
| Transferencia bancaria / depósito | order.paid (marcado manual) | Finanzas confirma el acreditamiento antes de emitir. |
| Efectivo (Rapipago, Pago Fácil) | order.paid (webhook del gateway) | El gateway notifica el pago; emitir automáticamente. |
| Fraude / cancelación antes de captura | Sin comprobante | No emitir; si ya se emitió, generar nota de crédito. |
La idea es simple: el sistema tiene que emitir cuando el pago está efectivamente confirmado, no antes. Ese criterio evita bastante ruido operativo.
Con la regla de emisión ya resuelta, el trabajo ahora es más concreto: convertir cada evento de Shopify en un comprobante válido.
Los eventos clave son orders/create, orders/paid, orders/updated, refunds/create y orders/cancelled. Si el costo de envío impacta el comprobante, también incluí el evento de envío correspondiente.
El flujo de procesamiento tiene que ser uno solo y sin vueltas: verificá la firma HMAC-SHA256 que Shopify manda en X-Shopify-Hmac-SHA256, guardá el payload crudo, respondé 200 enseguida y dejá la lógica fiscal para un worker asíncrono. Si la firma no coincide, respondé 401 y no procesés el evento. La verificación de firma tiene que hacerse con comparación en tiempo constante.
Para evitar comprobantes duplicados, usá X-Shopify-Webhook-Id como clave de idempotencia y guardá los IDs procesados durante al menos 72 horas. También conviene sumar logging estructurado con topic, dominio de la tienda, order ID, webhook ID y resultado. Y si ves picos de errores o crecimiento en la cola de fallos, activá alertas.
| Tópico | Propósito en facturación | Control requerido |
|---|---|---|
orders/create | Capturar datos fiscales y validar la condición del cliente | Validación HMAC + chequeo de idempotencia por X-Shopify-Webhook-Id |
orders/paid | Emitir la factura cuando el pago fue capturado | Verificar que el estado financiero sea paid antes de llamar a la API fiscal |
orders/updated | Actualizar el borrador si cambian datos fiscales o impuestos | Comparar solo los campos fiscales que importan; no reprocesar si no hubo cambios |
refunds/create | Generar una Nota de Crédito referenciando la factura original | Mapear los ítems devueltos a importe_gravado, importe_exento_iva e importe_iva |
orders/cancelled | Anular una factura pendiente o emitir un documento correctivo | Verificar si el CAE ya fue otorgado antes de decidir la acción |
Con los webhooks bajo control, el paso siguiente es traducir cada pedido al esquema fiscal.
Tomá el CUIT y la condición fiscal desde los campos personalizados que ya cargaste en el checkout. La lógica del tipo de comprobante sale del cruce entre la condición fiscal del emisor y la del receptor. Ese cruce define si emitís Factura A, B o C, y también cómo tratás el IVA. Los tax_lines del pedido son la base para armar el desglose de alícuotas que exige AFIP.
Los descuentos, tanto a nivel de ítem como de orden, tienen que verse reflejados en los totales. Si no, importe_gravado e importe_iva no van a cerrar contra lo que se cobró de verdad.
| Campo Shopify | Campo AFIP (XML) | Uso fiscal |
|---|---|---|
customer + metafield para CUIT | Receptor.CUIT | 11 dígitos; validar el formato antes de enviar a AFIP |
customer.tax_status (metafield) | Receptor.CondicionIVA | Define el tipo de factura y el tratamiento del IVA |
billing_address | Receptor.Domicilio | La provincia puede incidir en percepciones de IIBB |
line_items (SKU, cantidad, precio) | Descripción, cantidad, precio unitario | Cada SKU debe tener su alícuota de IVA configurada |
total_discounts / discount_applications | Descuentos sobre base imponible | Itemizar para que el subtotal fiscal sea correcto |
shipping_lines | Servicio de flete | Definir si está gravado o exento e incluirlo en el desglose de IVA |
tax_lines | ImporteIVA / alícuotas | Base imponible e IVA por alícuota, según lo exigido por AFIP |
transactions[].gateway + ID | Referencia de pago | Conciliar el comprobante AFIP con el cobro |
order_number | Referencia externa / número de venta | Auditoría y vínculo con el pedido |
| Nro. de factura original + CAE | CbtesAsoc (en NC/ND) | Las notas de crédito deben referenciar la factura original y su CAE |
Para una Nota de Crédito, guardá el número de factura original y el CAE desde el mismo momento en que se emite el comprobante.
Con el mapeo cerrado, pasá a devoluciones, notas de crédito y pruebas end-to-end. Para escalar estas operaciones, podés apoyarte en un cerebro de comercio inteligente que orqueste tus automatizaciones.
Con el mapeo ya cerrado, toca meterse en una de las partes más delicadas: devoluciones, reembolsos y notas de crédito.
Cada devolución o ajuste de base imponible pide una nota de crédito vinculada a la factura original, con su número, punto de venta y CAE.
Hay un detalle que no se puede pasar por alto: solo el emisor original puede emitir la nota de crédito. Si la tienda opera con más de un CUIT o más de un punto de venta, la integración tiene que mandar cada NC al emisor que corresponda.
Para que eso salga bien, conviene guardar en los metafields de Shopify - o en la base de datos de la integración - estos datos desde el momento en que se emite cada factura: tipo de comprobante (A/B/C), punto de venta, número de factura, CAE y condición frente al IVA del cliente.
| Escenario de devolución | Acción fiscal | Dato clave requerido |
|---|---|---|
| Reembolso total post-envío | Nota de Crédito completa | Número de factura + CAE original |
| Reembolso parcial por ítem | Nota de Crédito parcial con IVA por línea | SKU, cantidad, alícuota de IVA por ítem |
| Cambio de producto | Nota de Crédito + nueva Factura | CAE original + nueva condición fiscal del reemplazo |
| Cancelación antes de emitir el comprobante | Sin acción fiscal | Estado del pedido |
| Cancelación con comprobante ya validado | Nota de Crédito total o anulación del comprobante | CAE + número de factura + punto de venta |
| Descuento posterior a la venta | Nota de Crédito si afecta la base imponible | Importe del descuento + IVA correspondiente |
Con las reglas de devolución ya definidas, el siguiente paso es probar el circuito completo antes de pasar a producción.
Armá un plan de pruebas con datos reales en ARS, medios de pago locales y condiciones fiscales comunes en Argentina. Probar solo el caso ideal no alcanza. También hay que revisar qué pasa cuando algo falla, porque ahí es donde suelen aparecer los problemas más caros.
| Escenario de prueba | Resultado esperado | Equipo responsable |
|---|---|---|
| Orden pagada con CUIT válido (Factura B) | Factura B emitida con IVA incluido y CAE registrado | Dev / Finanzas |
| Orden de Responsable Inscripto (Factura A) | CUIT validado; IVA discriminado; Factura A con CAE | Dev / Impuestos |
| CUIT ausente o inválido | Emisión bloqueada; error logueado; alerta al equipo | Soporte / Dev |
| Reembolso parcial (ítem + envío) | Nota de Crédito emitida por el monto exacto; vinculada a la factura original | Finanzas / Dev |
| Cancelación total del pedido | Nota de Crédito total o anulación del comprobante, según corresponda | Finanzas |
| Webhook duplicado | El sistema detecta el X-Shopify-Webhook-Id repetido y no emite un segundo comprobante | Dev |
| Descalce de IVA en el catálogo | Error bloqueante antes de emitir; alerta al administrador | Dev / Impuestos |
Ya en producción, el monitoreo tiene que mirar tres capas.
Si este control falla, el problema no siempre aparece en el momento. A veces explota días después, cuando alguien intenta conciliar cobros, revisar IVA o emitir una nota de crédito y descubre que falta el dato más simple de todos: la referencia a la factura original.
Con la lógica fiscal y técnica ya definida, falta un último paso: cerrar el control operativo antes de pasar a producción. Dejás por escrito, en una sola fuente de verdad versionada, las reglas de emisión, impuestos, pagos y devoluciones.
También conviene dejar la localización cerrada antes del alta. Eso incluye:
America/Argentina/Buenos_AiresCon esa base, el riesgo baja y el alta queda lista para producción. Si alguno de los siete puntos sigue ambiguo, la integración no está lista para producción.
Facturar antes de confirmar el pago puede traer desajustes contables y líos en la operación del día a día. Lo más conveniente es emitir el comprobante solo cuando la transacción ya esté liquidada de forma efectiva, por ejemplo, a partir de eventos como order.paid.
Si no esperás esa confirmación, los reportes financieros pueden perder precisión. Y además, las devoluciones o cancelaciones se vuelven más engorrosas de manejar. Para evitar ese problema, configurá la emisión fiscal después de verificar el estado del pago.
Para integrar bien el e-invoicing y cumplir con la normativa en Argentina, en el checkout tenés que pedir y validar los datos necesarios para emitir facturas electrónicas ante ARCA (ex AFIP).
Sí o sí, solicitá la identificación fiscal del cliente: CUIT, CUIL o DNI, según su condición frente al IVA. Validar esos datos te evita errores y te permite emitir comprobantes con los requisitos legales, como el CAE y el código QR.
Implementá idempotencia en tu sistema: como los webhooks de Shopify pueden llegar más de una vez, verificá si el ID del pedido ya se procesó antes de emitir un comprobante nuevo.
Dicho simple: si Shopify manda el mismo evento dos veces, tu sistema no debería facturar dos veces. La forma más directa de evitarlo es guardar el ID del pedido y chequearlo antes de generar cualquier transacción.
Además, podés sumar un polling cada 6 a 12 horas para detectar eventos perdidos o inconsistencias. Eso te da una segunda capa de control, algo así como una red de seguridad por si un webhook no llegó o falló en el camino.
También conviene usar una cola de mensajes fallidos para registrar errores sin repetir transacciones. Así, cuando algo sale mal, no perdés el rastro del problema ni corrés el riesgo de volver a emitir un comprobante por accidente.