Facturar ventas de Zoho con ARCA en n8n
Cómo conectar ventas de Zoho con Afip SDK en n8n para autorizar facturas electrónicas de ARCA y devolver CAE, PDF y estado fiscal al CRM o ERP.
Descargá el workflow zoho-arca-invoice.json para importarlo en n8n y adaptarlo a tu cuenta de Zoho.
Zoho puede significar varias cosas: Zoho CRM, Zoho Inventory, Zoho Books o Zoho Commerce. Para facturación electrónica, conviene elegir un módulo como fuente de verdad y no dejar que varios módulos disparen la misma factura.
En este tutorial usamos Zoho Inventory o Books como caso principal, porque ya trabajan con contactos, sales orders, items e invoices. n8n consulta Zoho por API, emite con Afip SDK y escribe el resultado fiscal de vuelta.
Documentación útil:
- Zoho Inventory API: https://www.zoho.com/inventory/api/v1/introduction/
- Zoho Books API: https://www.zoho.com/books/api/v3/introduction/
- Zoho OAuth: https://www.zoho.com/accounts/protocol/oauth.html
- Nodo Afip SDK para n8n: https://n8n.io/integrations/afip-sdk/
Cómo funciona la integración
- Una venta queda aprobada en Zoho.
- n8n se dispara por Webhook, workflow de Zoho o cron.
- n8n consulta Sales Order, Invoice o Contact por API.
- n8n valida campos fiscales argentinos.
- Afip SDK emite la factura en ARCA.
- n8n actualiza Zoho con CAE, número de comprobante y PDF.
Paso 1: elegir el módulo fuente
Definí una sola fuente para facturar:
- Zoho Inventory Sales Orders: útil si el negocio maneja stock y fulfillment.
- Zoho Books Invoices: útil si el documento comercial ya nace como factura interna.
- Zoho CRM Deals: útil sólo si CRM dispara el proceso, pero la factura debería salir desde Books/Inventory o un ERP.
No hagas que CRM, Books e Inventory disparen Afip SDK al mismo tiempo.
Paso 2: autenticar Zoho en n8n
Zoho usa OAuth 2.0. En n8n podés:
- Usar un nodo Zoho si cubre el módulo que necesitás.
- Usar HTTP Request con OAuth configurado.
- Guardar
organization_idcomo variable de entorno.
Para Zoho Inventory:
GET https://www.zohoapis.com/inventory/v1/salesorders/{{ $json.salesorder_id }}?organization_id={{ $env.ZOHO_ORGANIZATION_ID }}
Authorization: Zoho-oauthtoken {{ $env.ZOHO_ACCESS_TOKEN }}
La región puede cambiar: .com, .eu, .in, etc. Usá el dominio de tu cuenta.
Paso 3: disparar el workflow
Opciones:
- Webhook desde una custom function de Zoho.
- Schedule Trigger que busca órdenes con estado aprobado y campo
arca_statusvacío. - Trigger manual para pruebas.
En producción, conviene agregar campos propios en Zoho:
arca_status.arca_cae.arca_invoice_number.arca_pdf_url.
Paso 4: mapear contacto y datos fiscales
El contacto debe tener campos argentinos:
- CUIT o DNI.
- Razón social.
- Condición frente al IVA.
- Domicilio fiscal.
Si esos campos no existen, crealos como custom fields en Zoho. No dependas de notas o texto libre.
Ejemplo de normalización:
const sale = $json.salesorder || $json.invoice;
const customer = sale.customer || {};
return [{
json: {
externalId: `zoho:${sale.salesorder_id || sale.invoice_id}`,
customerName: customer.company_name || customer.customer_name,
taxId: customer.custom_field_hash?.cf_cuit,
ivaCondition: customer.custom_field_hash?.cf_condicion_iva,
totalAmount: Number(sale.total),
items: (sale.line_items || []).map((item) => ({
sku: item.sku,
description: item.name,
quantity: Number(item.quantity),
unitPrice: Number(item.rate),
taxName: item.tax_name,
taxPercentage: item.tax_percentage,
})),
},
}];
Paso 5: emitir con Afip SDK
Usá los nodos:
- Obtener autorización
wsfe. FECompUltimoAutorizado.FECAESolicitar.- Generar el PDF con el template de Afip SDK.
Clave de idempotencia:
zoho:{module}:{id}
Por ejemplo zoho:salesorder:123456789.
Paso 6: actualizar Zoho
Después de emitir:
- Actualizá custom fields del documento.
- Adjuntá o enlazá el PDF.
- Cambiá
arca_statusaauthorized. - Guardá errores con
arca_errorsi ARCA rechaza.
Si Zoho Books ya genera una invoice comercial, no intentes reemplazarla. Relacionala con la factura fiscal de ARCA.
Errores comunes
- Disparar desde CRM y desde Books al mismo tiempo.
- No crear custom fields fiscales.
- Usar customer name como razón social sin validación.
- No contemplar dominios regionales de Zoho.
- No guardar el CAE estructurado en Zoho.
Cierre
Zoho funciona bien cuando se define un único módulo fuente. n8n debe tomar ese documento, convertirlo a payload fiscal argentino, emitir con Afip SDK y devolver el estado a Zoho.