Facturar ventas de WooCommerce con ARCA en n8n
Guía práctica para emitir facturas electrónicas de ARCA desde pedidos de WooCommerce usando webhooks, n8n y Afip SDK.
Descargá el workflow woocommerce-arca-invoice.json para importarlo en n8n y adaptarlo a tu cuenta de WooCommerce.
WooCommerce es uno de los casos más directos para n8n: tiene REST API, Webhooks y meta_data para guardar campos fiscales o el resultado de ARCA. El punto delicado es elegir el estado correcto del pedido y no duplicar facturas cuando WooCommerce dispara varios updates.
Documentación útil:
- WooCommerce REST API: https://developer.woocommerce.com/docs/apis/rest-api/
- Webhooks de WooCommerce: https://woocommerce.com/document/webhooks/
- Webhooks desde API: https://woocommerce.github.io/woocommerce-rest-api-docs/v3.html#webhooks
- Nodo Afip SDK para n8n: https://n8n.io/integrations/afip-sdk/
Cómo funciona la integración
- WooCommerce dispara un Webhook de pedido.
- n8n recibe el evento.
- n8n consulta el pedido por REST API.
- n8n procesa sólo estados
processingocompleted. - n8n lee CUIT y condición fiscal desde checkout fields o
meta_data. - Afip SDK autoriza la factura.
- n8n guarda CAE, número y PDF como
meta_datao nota privada.
Paso 1: generar credenciales REST API
En WordPress:
- WooCommerce > Settings > Advanced.
- REST API.
- Add key.
- Permisos
Read/Write.
Guardá consumer key y consumer secret en credenciales de n8n.
Paso 2: crear Webhook de pedido
En WooCommerce:
- Topic:
Order updatedoOrder created. - Delivery URL: URL del nodo Webhook de n8n.
- Status: Active.
Si usás Order updated, el evento se dispara muchas veces. Por eso el primer filtro en n8n debe mirar estado e idempotencia.
Paso 3: consultar el pedido completo
Con el id recibido:
GET https://tutienda.com/wp-json/wc/v3/orders/{{ $json.id }}
Authorization: Basic consumer_key:consumer_secret
Revisá:
status.billing.line_items.shipping_lines.fee_lines.coupon_lines.tax_lines.meta_data.
Paso 4: campos fiscales en checkout
WooCommerce no trae CUIT argentino estándar. Agregalo con un plugin de checkout fields o código propio y guardalo en meta_data.
Campos recomendados:
_billing_cuit._billing_razon_social._billing_condicion_iva._arca_invoice_number._arca_cae._arca_pdf_url.
Ejemplo de lectura en n8n:
const order = $json;
const meta = Object.fromEntries((order.meta_data || []).map((entry) => [entry.key, entry.value]));
return [{
json: {
externalId: `woocommerce:${order.id}`,
status: order.status,
taxId: meta._billing_cuit,
businessName: meta._billing_razon_social || order.billing.company,
ivaCondition: meta._billing_condicion_iva,
alreadyInvoiced: Boolean(meta._arca_invoice_number),
},
}];
Si alreadyInvoiced es true, terminá el workflow sin llamar a Afip SDK.
Paso 5: mapear importes
WooCommerce puede manejar precios con IVA incluido o excluido. Revisá cómo está configurada la tienda antes de calcular.
Mapeá:
line_items: productos.shipping_lines: envío.fee_lines: recargos.coupon_lines: descuentos.tax_lines: impuestos.
No recalcules a ciegas si WooCommerce ya calculó impuestos. Validá contra el total del pedido.
Paso 6: emitir con Afip SDK
Tramo fiscal:
- Obtener autorización
wsfe. - Consultar último comprobante.
- Autorizar con
FECAESolicitar. - Generar el PDF con el template de Afip SDK.
Clave de idempotencia:
woocommerce:{order.id}
Paso 7: actualizar el pedido
Usá REST API para escribir meta_data:
PUT https://tutienda.com/wp-json/wc/v3/orders/{{ order.id }}
Payload:
{
"meta_data": [
{ "key": "_arca_invoice_number", "value": "0001-00001234" },
{ "key": "_arca_cae", "value": "12345678901234" },
{ "key": "_arca_pdf_url", "value": "https://..." }
]
}
También podés crear una order note privada para soporte.
Errores comunes
- Facturar
pendingoon-hold. - No bloquear duplicados en
Order updated. - No tener campos CUIT/IVA en checkout.
- Duplicar IVA porque la tienda ya guarda precios con impuestos.
- No diferenciar refund de nota de crédito.
Cierre
WooCommerce es ideal para este flujo si usás meta_data de forma disciplinada. El Webhook dispara, la REST API confirma el estado y Afip SDK emite sólo una vez.