ERP Integration
Eryxon Flow supports two-way data synchronization with external ERP systems like SAP, NetSuite, Odoo, and others.
Architecture Overview
Section titled “Architecture Overview”flowchart LR
ERP["Your ERP"] -->|REST sync, bulk-sync| API["Edge Functions<br/>(API key)"]
API --> PG[("Postgres<br/>external_id · sync_hash · RLS")]
PG -->|triggers| WH["Signed webhooks"]
WH --> ERP
Integration Options
Section titled “Integration Options”1. REST API Sync (Real-time)
Section titled “1. REST API Sync (Real-time)”Best for: Webhook-driven updates, event-based sync, real-time integration.
| Method | Endpoint | Use Case |
|---|---|---|
PUT | /api-{entity}/sync | Upsert single record |
POST | /api-{entity}/bulk-sync | Batch upsert (up to 1000) |
DELETE | /api-{entity}?id={uuid} | Hard delete |
Sync endpoints exist for jobs, parts, operations, batches, cells, resources, materials, time entries, webhooks, and assignments. See the REST API reference for the full catalog.
2. CSV Batch Import (UI-based)
Section titled “2. CSV Batch Import (UI-based)”Best for: Initial data migration, periodic bulk updates, manual imports.
Navigate to Admin → Data Import in the web UI.
Supported Entities
Section titled “Supported Entities”| ERP Concept | Eryxon Entity | Sync Endpoint |
|---|---|---|
| Sales Order | Job | /api-jobs/sync |
| Work Center | Cell | /api-cells/sync |
| Equipment / Tooling | Resource | /api-resources/sync |
Parts and operations are synced via the unified /api-erp-sync endpoint or created nested within jobs.
Key Fields
Section titled “Key Fields”external_id
Section titled “external_id”Every synced record should include:
{ "external_id": "SO-12345", // Your ERP's unique identifier "external_source": "SAP", // Source system name ...other fields}The combination of (tenant_id, external_source, external_id) forms a unique constraint for upsert operations.
sync_hash
Section titled “sync_hash”Eryxon automatically generates a SHA-256 hash of the payload for change detection. On subsequent syncs, unchanged records can be skipped.
synced_at
Section titled “synced_at”Timestamp of the last successful sync, useful for incremental updates.
Related Documentation
Section titled “Related Documentation”- CSV Import - Step-by-step CSV import instructions
- REST API Reference - Full endpoint documentation
Database Schema
Section titled “Database Schema”The sync infrastructure adds these columns to core tables:
-- Added to jobs, parts, cells, resourcesexternal_id TEXT, -- ERP identifierexternal_source TEXT, -- Source system namesynced_at TIMESTAMPTZ, -- Last sync timestamp
-- Soft delete support (jobs, cells)deleted_at TIMESTAMPTZ, -- NULL = activedeleted_by UUID -- User who deletedBest Practices
Section titled “Best Practices”- Always include external_id - Required for upsert operations
- Sync dependencies first - Sync cells before operations that reference them
- Use bulk-sync for batches - More efficient than individual requests
- Implement webhooks - Receive real-time updates back to your ERP
- Handle errors gracefully - Bulk responses include per-record errors