Comienza por ownership, no por endpoints
Define qué sistema controla cada hecho. El ERP puede ser dueño de productos fiscales, facturas, cuentas por cobrar y stock. Zoho Creator puede controlar workflow de servicios, aprobaciones o formularios. CRM controla interacción comercial. SQL preserva evidencia e historia. Sheets presenta un reporte para personas.
Dos sistemas pueden guardar el nombre del cliente, pero solo uno controla el registro legal. Sin ownership por campo, el sync bidireccional se convierte en un loop de sobrescritura.
ParteCliente, proveedor, carrier, identidad legal, contactos, direcciones, perfil fiscal, IDs y merges.
CatálogoProducto, servicio, SKU, unidad, tipo fiscal, NCM/código, precio, activo y policy de stock.
Ciclo comercialLead, cotización, pedido, orden de servicio, factura, receivable, pago, cancelación y devolución.
Evidencia operacionalPayload raw, versión, ventana, cursor, mapping, intento, error, conciliación y auditoría.
Los adapters conservan semántica
Omie organiza operaciones por servicios de negocio; SIGE Cloud expone recursos ERP; Zoho Creator trabaja con forms, reports, field link names, validación, workflows, paginación y bulk jobs. No son CRUDs equivalentes.
Cada adapter conoce auth, páginas, cuotas, filtros, estados, producto versus servicio, errores, retries y mutations. El pipeline central consume un contrato normalizado.
Usa una capa raw antes del modelo canónico
Guarda payload original con provider, tenant, recurso, external ID, extracción, source update time, versión API, ventana, hash y run. Esto permite reproducir transformaciones e investigar drift.
La normalización crea tablas o eventos separados. Los campos desconocidos no desaparecen; van a quarantine o compatibilidad explícita.
Construye un grafo de normalización multi-ERP
Grafo de normalización multi-ERP01 ExtraerLee ventanas específicasServicios Omie, recursos SIGE, reports/bulk Zoho, archivos, webhooks o inputs controlados.
02 AterrizarConserva evidencia rawPayload, headers, IDs, tiempos, cursor, página, hash, run, tenant y versión.
03 ValidarComprueba contratosCampos, tipos, enums, continuidad de paginación, totales y errores.
04 ResolverMapea identidadesUne IDs externos con parte, item, pedido, factura, pago y workflow canónicos.
05 NormalizarTraduce significadoFechas, decimales, documentos, estado, producto/servicio, unidades, dinero y direcciones.
06 PersistirHaz upsert seguroVersión/hash, constraints SQL, idempotencia, transacciones e historia append-only.
07 PublicarAtiende consumidoresWrites ERP, workflows Zoho, APIs, colas, snapshots Sheets, BI y excepciones.
08 ConciliarCompara fuente y outcomeConteos, valores, IDs, estados, fiscal, stock, pagos, freshness y errores.
El mapeo de identidad es una tabla propia
No asumas que identificador fiscal, email, SKU o nombre es único global. Guarda tenant, source, resource, external ID, canonical ID, validez, método, confianza e historia de merge/split. Conserva aliases.
Usa claves deterministas cuando exista garantía y matching limitado con revisión en los demás casos.
La extracción incremental requiere overlap y watermark
Usa updated_at o cursor con ventana superpuesta. Registra rango, páginas, timestamps, vistos, únicos, rechazados y watermark committed.
Separa sync reciente y backfill. No avances watermark si falta una página.
Los writes necesitan controles más fuertes
Repetir lectura suele ser inocuo; repetir creación, facturación, cancelación, stock o pago causa daño. Cada mutation requiere operation ID, versión, precondiciones, lookup, hash, result ledger y retry class.
Busca por integration key antes de crear. Tras timeout consulta estado. Separa transporte/rate limit de validación, permiso, fiscal y negocio. Conserva la causa específica.
Producto, servicio, fiscal y stock son distintos
Un servicio no es un producto sin stock. Puede usar impuestos, documentos, códigos y ciclos diferentes. Comparte campos comunes sin borrar el tipo fiscal.
Usa decimal, moneda, base, descuento, flete y redondeo explícitos. Conserva códigos y documentos del ERP.
Google Sheets queda en el borde de reporting
Sheets es útil para equipos, pero no es event store ni base transaccional. Publica snapshot versionado o ranges con ownership claro. Protege fórmulas, headers y row keys.
Respeta cuotas con batch y backoff. Prefiere actualización atómica a cambios fila por fila. Incluye run marker, ventana, tiempo, filas, schema y estado.
SQL controla hechos durables
PostgreSQL guarda raw metadata, identity maps, proyecciones, ledgers, watermarks, conciliación y excepciones. Unique constraints aplican idempotencia; FKs y checks protegen relaciones y estados; transacciones agrupan cambios.
Raw responde qué llegó; canónico qué significa; views responden la pregunta actual.
Usa una matriz de source of truth
| Dominio | Owner típico | Lectura | Escritura | Evidencia |
|---|
| Cliente/proveedor legal | ERP o master data. | Incremental con overlap y revisión de duplicados. | Upsert por integration key con validación fiscal. | ID map, documento, estado, dirección y actualización. |
| Workflow custom | Zoho Creator o app. | Reports, paginación, ventana o bulk. | Update sujeto a validación/workflows. | Record ID, form/report, workflow, historia y error. |
| Catálogo | ERP. | Referencia completa más cambios. | Paths separados producto/servicio. | SKU, tipo fiscal, activo, precio y stock. |
| Pedidos/documentos | ERP en fiscal; app puede controlar intención. | Ventanas recientes, refresh y webhook. | Crear una vez y transicionar con versión. | IDs, líneas, totales, número fiscal, cancelación y pago. |
| Snapshot de reporte | Modelo SQL; Sheets presenta. | View/export versionado. | Batch replacement o append acotado. | Run, schema, filas, totales, tiempo y watermark. |
| Control de integración | SQL/control plane. | Jobs, mappings, policies y resultados. | Attempts append-only y proyecciones transaccionales. | Trace, request/response, idempotencia, retry y owner. |
Webhooks y polling se complementan
Webhook ofrece baja latencia pero debe disparar fetch o verificación. Polling cubre backfill, eventos perdidos y recursos sin webhook. Ambos entran al mismo pipeline deduplicado.
Monitorea edad, autenticación, event ID, versión y resultado. La falla activa polling fallback.
El error forma parte del dominio
Normaliza timeout, rate limit, auth, permiso, not found, validación, duplicate, rechazo fiscal, workflow, conflict e interno. Conserva código y mensaje saneado junto con entidad, operación, payload, intento, policy y owner.
Un mensaje genérico pierde la acción correctiva ya informada por el ERP.
Concilia conteo, valor y lifecycle
Compara totales de pedidos, facturas, receivables, pagos, stock, clientes activos, etapas y freshness. Detecta solo-source, solo-target y versiones conflictivas.
La excepción necesita owner, severidad, impacto, edad, evidencia, acción y cierre. No hagas overwrite automático sobre discrepancias fiscales o financieras.
Protege credenciales y tenants
Guarda keys, secrets, refresh tokens, SQL y service accounts en secret manager o CI protegida. Scope por tenant y capacidad. No registres secretos ni payloads sensibles completos.
Tenant context debe existir en tablas, colas, cache y traces. Autoriza en la frontera de write.
Prueba la conducta del vendor
Usa fixtures para páginas vacías, null, decimal, timezone, enum nuevo, validación, rate limit, partial success, timeout post-commit, webhook duplicado y drift. Usa sandbox o cuenta controlada.
Backfill y replay deben ser idempotentes; evento antiguo no sobrescribe versión reciente.
Observa cada run como proceso de negocio
Mide requested, received, normalized, inserted, updated, unchanged, rejected, retried y reconciled. Acompaña cuota, watermark lag, excepción más antigua, tiempo de Sheets y freshness.
Correlaciona run, request, raw, entidad, operación, resultado, snapshot y caso. Worker verde no prueba datos actuales.
Qué construiría
Construiría una plataforma con adapters, scheduler durable, landing raw, schemas canónicos, identity mapping, operation ledger, proyecciones SQL, conciliación, consola de excepciones y publishers. Reads y writes usarían credenciales y colas separadas.
Cada package declararía recursos, páginas, incremental key, límites, webhooks, idempotencia, fiscal, errores y fixtures.
El principio de diseño
Una integración regional exitosa no finge que todos los sistemas son iguales. Explicita diferencias, conserva verdad de origen, traduce significado con contratos y prueba el outcome de cada sync.