Facturar ventas de Shopify con ARCA en n8n
Guía para emitir facturas electrónicas de ARCA desde órdenes pagadas de Shopify usando n8n, Afip SDK y un flujo de actualización de metacampos o tags.
Descargá el workflow shopify-arca-invoice.json para importarlo en n8n y adaptarlo a tu cuenta de Shopify.
Shopify sí tiene una API y Webhooks suficientemente claros para automatizar la facturación. El flujo recomendado es escuchar orders/paid, consultar la orden completa con Admin API, emitir con Afip SDK y escribir el resultado en tags, order metafields o notas internas.
Documentación útil:
- Webhooks de Shopify: https://shopify.dev/docs/apps/build/webhooks
- Topics de Webhooks: https://shopify.dev/docs/api/webhooks
- Admin API: https://shopify.dev/docs/api/admin-rest
- Order resource: https://shopify.dev/docs/api/admin-rest/latest/resources/order
- Nodo Afip SDK para n8n: https://n8n.io/integrations/afip-sdk/
Cómo funciona la integración
- Shopify dispara un Webhook
orders/paid. - n8n recibe el payload en un nodo Webhook.
- n8n verifica que la orden no tenga factura emitida.
- n8n consulta la orden completa con Admin API.
- n8n toma CUIT/DNI desde metafields, cart attributes, note attributes o customer metafields.
- Afip SDK autoriza el comprobante en ARCA.
- n8n guarda CAE, número de factura y PDF en Shopify.
Paso 1: crear el Webhook orders/paid
Desde una app privada/custom app o desde la configuración de Webhooks, creá una suscripción para orders/paid.
En n8n:
- Nodo Webhook.
- Método
POST. - Path, por ejemplo:
/shopify/orders-paid. - Respondé 200 rápido y procesá la factura después si el volumen es alto.
Shopify puede reenviar Webhooks, así que el workflow debe ser idempotente.
Paso 2: consultar la orden completa
Aunque el Webhook trae datos de la orden, conviene consultar la Admin API para trabajar con el estado actual:
GET https://{shop}.myshopify.com/admin/api/2026-01/orders/{{ $json.id }}.json
X-Shopify-Access-Token: {{ $env.SHOPIFY_ACCESS_TOKEN }}
Pedí o persistí estos campos:
idyorder_number.financial_status.line_items.shipping_lines.discount_codes.total_tax,total_price,subtotal_price.billing_address.note_attributes.
Paso 3: dónde guardar CUIT y condición fiscal
Shopify no trae CUIT argentino como campo nativo de checkout para todos los casos. Tenés que definir un lugar estable:
note_attributesdel checkout.- Order metafields.
- Customer metafields.
- Una app de checkout que capture
tax_id, razón social y condición fiscal.
En n8n, agregá un nodo Code que busque el CUIT en esos lugares en orden de prioridad:
const order = $json.order;
const noteAttributes = Object.fromEntries(
(order.note_attributes || []).map((attr) => [attr.name, attr.value])
);
const taxId = noteAttributes.cuit || noteAttributes.tax_id || order.customer?.tax_exemptions?.[0];
return [{
json: {
shopifyOrderId: order.id,
orderNumber: order.order_number,
taxId,
customerName: order.billing_address?.company || `${order.billing_address?.first_name || ''} ${order.billing_address?.last_name || ''}`.trim(),
email: order.email,
},
}];
Si taxId falta, no emitas la factura todavía. Etiquetá la orden como facturacion-pendiente-datos o notificá al equipo.
Paso 4: mapear items, descuentos y envío
Shopify separa:
- Productos en
line_items. - Envíos en
shipping_lines. - Descuentos en
discount_codeso allocations. - Impuestos en campos de tax.
Antes de llamar a ARCA, consolidá esos importes. Si tu tienda carga precios con IVA incluido, el nodo Code debe separar neto e IVA según la alícuota del producto.
Ejemplo de estructura intermedia:
return [{
json: {
externalId: `shopify:${order.id}`,
pointOfSale: 1,
voucherType: taxId ? 1 : 6,
documentType: taxId ? 80 : 99,
documentNumber: taxId || 0,
netAmount,
vatAmount,
totalAmount: Number(order.total_price),
items,
},
}];
Paso 5: emitir con Afip SDK
Usá los nodos de Afip SDK:
- Get authorization token para
wsfe. - Execute web service request con
FECompUltimoAutorizado. - Execute web service request con
FECAESolicitar. - Nodo para generar el PDF con el template de Afip SDK.
El idempotency key debe ser shopify:{order.id}. Antes de emitir, buscá si ya existe un metafield arca.invoice_number.
Paso 6: escribir el resultado en Shopify
Tenés tres opciones prácticas:
- Agregar tag:
facturada-arca. - Crear order metafields:
arca.cae,arca.invoice_number,arca.pdf_url. - Agregar una nota interna con el comprobante.
Para un flujo limpio, usá metafields para datos estructurados y tags para operación diaria.
Errores comunes
- Facturar
orders/createen vez deorders/paid. - No capturar CUIT en checkout.
- Usar el email como dato fiscal.
- No contemplar refunds: una devolución en Shopify no es automáticamente una nota de crédito en ARCA.
- Duplicar facturas por reintentos de Webhook.
Cierre
Shopify funciona muy bien con n8n porque el evento orders/paid es claro y la Admin API permite completar la información. La clave es sumar campos fiscales argentinos y guardar el resultado de ARCA en la orden.