Available Now

Sync Engine

A self-hosted framework for building data integrations between your application and external systems like ERPs, CRMs, and accounting platforms. Bidirectional sync with version-vector-based conflict detection, OAuth management, and a complete QuickBooks Online reference integration.

See It In Action

Watch the full demo to see bidirectional sync, OAuth management, conflict resolution, and the embeddable UI in action.

A Unique Position in the Market

The integration space has unified APIs (hosted, closed-source), ELT tools (one-way only), workflow automation (no sync state), and “open core” products with key features paywalled. A fully open-source, self-hosted, bidirectional sync platform with version vector conflict resolution doesn't exist elsewhere.

Unified APIs (Merge, Codat)

Hosted services with pre-built connectors. You can't self-host, can't see the code, and pay per connection. Write-back support is limited.

ELT Tools (Airbyte)

Great for moving data to warehouses, but one-way only. Airbyte explicitly does not support bidirectional sync.

Developer Infrastructure (Nango)

Closest alternative, but “open source” is misleading — only the API proxy is truly open. Full sync engine requires Enterprise license.

Workflow Automation (n8n)

Great for “when X happens, do Y” flows, but no built-in sync state management or conflict resolution. You build everything yourself.

How We Compare

Full source code, self-hosted deployment, and true bidirectional sync — capabilities that don't exist together in any other product.

CapabilitySaaSDogWorkatoMerge / CodatNangoAirbyte
Bidirectional SyncFullWorkflow-basedLimitedLimitedNo
Self-HostedYesNoNoPartial*Yes
Full Source CodeYesNoNoPartial*Yes
Extend with AI Coding ToolsYesNoNoNoOne-way only
Conflict ResolutionVersion vectorsVariesVariesNoN/A
Per-Record Sync StateFullLimitedLimitedLimitedNo
Push / Webhook TriggersBuilt-inYesLimitedYesNo
OAuth ManagementBuilt-inBuilt-inBuilt-inBuilt-inNo
Embeddable UIYes + sourceNoYesYesYes
Per-Connection PricingNoneYesYesYesYes

* Nango's free self-hosted version only includes the API proxy. Full sync engine requires Enterprise license. Airbyte is open source but designed for one-way ELT to data warehouses, not application-to-application sync.

Built for AI-Assisted Development

The QuickBooks Online integration serves as a complete reference implementation. Point Claude Code, Cursor, or GitHub Copilot at it and describe your target system — they can generate a new integration adapter, strategy, and mappers following the same patterns.

Key Features

Bidirectional Sync

Inbound, outbound, and bidirectional sync per entity type. Version vectors track changes on both sides with configurable conflict resolution.

Record-Level Sync State

Track the sync status of every individual record. Know exactly which records are synced, pending, failed, or in conflict.

OAuth & Credential Management

Built-in OAuth flow with encrypted credential storage. Supports AWS KMS, Azure Key Vault, and Fernet for development.

Reference Integration

Complete QuickBooks Online integration with OAuth, schema mapping, entity ordering, and bidirectional sync. Use it as a blueprint for new integrations.

Self-Hosted & Multi-Cloud

Deploy on your own infrastructure with Terraform. Supports AWS (ECS/Fargate), Azure, and GCP. Your data never leaves your environment.

Job History & Admin APIs

Full sync job history with per-record details. Admin APIs for cross-tenant management, sync status monitoring, and cursor resets.

Strategy & Adapter Patterns

Clean extension model: implement an Adapter for API calls and a Strategy for sync logic. Register and go.

Async & Queue-Based

Sync jobs run asynchronously via SQS (or in-memory for dev). Stuck job detection, auto-termination, and dead-letter queues built in.

Embeddable Micro-Frontend UI

Ships with a complete React UI that you can embed directly into your application via Module Federation — or run standalone. Manage integrations, monitor sync jobs, and configure sync rules without building your own interface.

Integration Management

Browse available integrations, connect via OAuth, view connection status, and manage credentials. Supports reconnect and disconnect flows.

Sync Monitoring

Real-time job list with auto-refresh, status filtering, and pagination. Drill into any job to see entity-level counts and record-level sync details.

Sync Configuration

Per-entity sync rules: enable/disable entities, set direction (inbound, outbound, bidirectional), choose conflict resolution, and configure sync frequency.

Admin Dashboard

System-wide default settings, cross-tenant management, per-entity sync status monitoring, and the ability to reset sync cursors for full re-sync.

Flexible Embedding Options

Full Standalone

Complete app with layout and routing. Deploy on its own or in an iframe.

Micro-Frontend

Content-only component — your host app provides the layout, sidebar, and navigation.

Individual Pages

Import only the pages you need: IntegrationList, IntegrationDetail, SyncJobs, or JobDetail.

// Embed in your host application via Module Federation
import { IntegrationsProvider, MicroFrontend } from 'integrations/federation'

<IntegrationsProvider config={{
  apiBaseUrl: 'https://api.yourapp.com/integrations',
  getAuthToken: () => getToken(),
  onUnauthorized: () => redirectToLogin(),
}}>
  <MicroFrontend />
</IntegrationsProvider>
React 19
TypeScript
Vite + Module Federation
Tailwind CSS

How Sync Works

Every record tracks three version numbers. Comparing them determines what needs to sync and in which direction.

internal_version  = 3   // Bumped when your system changes the record
external_version  = 2   // Bumped when external system changes the record
last_sync_version = 2   // Set to max(iv, ev) after successful sync

// Decision logic:
iv == ev == lsv  →  In sync (nothing to do)
iv > lsv         →  Outbound sync needed (push your changes)
ev > lsv         →  Inbound sync needed (pull their changes)
iv > lsv AND ev > lsv  →  Conflict (resolved by configured master)

Inbound

External system is the source of truth. Fetch records from QuickBooks, Xero, etc. and write to your database.

Outbound

Your system is the source of truth. Detect local changes via version vectors and push to the external system.

Bidirectional

Both systems can change records. Version vectors classify each record and resolve conflicts automatically.

Change Detection & Sync Triggers

Each sync rule specifies how changes are detected and when to act on them. Combine these for polling-only, event-driven, or hybrid sync workflows.

Change Source

polling

Default. Changes discovered during scheduled sync jobs.

push

Your system notifies the platform via POST /integrations/{id}/notify.

webhook

External system pushes changes via POST /integrations/{id}/webhooks/{provider}.

hybrid

Combination of polling and webhook/push for redundancy.

Sync Trigger

deferred

Default. Bump version vectors only; changes picked up at next scheduled sync.

immediate

Queue an incremental sync job as soon as the change notification arrives.

Event-Driven Sync

Combine push + immediate for near-real-time sync without polling overhead.

// Example: push-based sync with immediate trigger
{
  "entity_type": "vendor",
  "direction": "bidirectional",
  "enabled": true,
  "master_if_conflict": "external",
  "change_source": "push",
  "sync_trigger": "immediate"
}

API Overview

Integrations

GET
/integrations/available

List all available integrations in the catalog

GET
/integrations

List connected integrations for the authenticated user

POST
/integrations/{id}/connect

Start OAuth flow and get authorization URL

POST
/integrations/{id}/callback

Complete OAuth with authorization code

DELETE
/integrations/{id}

Disconnect an integration

GET
/integrations/{id}/sync-status

Get per-entity sync status and timestamps

POST
/integrations/{id}/notify

Push notification: bump internal version for changed records

POST
/integrations/{id}/webhooks/{provider}

Webhook endpoint for external system change notifications

Sync Jobs

POST
/sync-jobs

Trigger a sync job (full, incremental, or entity-specific)

GET
/sync-jobs

List sync jobs with pagination and filtering

GET
/sync-jobs/{id}

Get job details including entity-level counts

POST
/sync-jobs/{id}/cancel

Cancel a running sync job

GET
/sync-jobs/{id}/records

Get record-level sync details (paginated)

Settings & Admin

GET
/integrations/{id}/settings

Get sync rules, directions, and conflict resolution config

PUT
/integrations/{id}/settings

Update sync settings for an integration

GET
/admin/integrations

Admin: list all user integrations across tenants

POST
/admin/.../sync-status/{entity}/reset

Admin: reset sync cursor for an entity

Adding a New Integration

The platform uses a Strategy + Adapter pattern. Each integration needs three things: an Adapter for API calls, a Strategy for sync logic, and Mappers for schema translation.

# 1. Adapter — handles OAuth and API calls
class XeroAdapter(IntegrationAdapterInterface):
    async def authenticate(code, redirect_uri) -> OAuthTokens
    async def fetch_records(entity_type, since) -> list[ExternalRecord]
    async def create_record(entity_type, data) -> external_id
    async def update_record(entity_type, external_id, data) -> success

# 2. Strategy — handles sync logic and entity ordering
class XeroSyncStrategy:
    async def sync_entity_inbound(entity_type, ...)
    async def sync_entity_outbound(entity_type, ...)
    async def sync_entity_bidirectional(entity_type, ...)
    def get_entity_order() -> list[str]

# 3. Mappers — bidirectional schema translation
def map_vendor_inbound(xero_data: dict) -> dict   # Xero → internal
def map_vendor_outbound(internal_data: dict) -> dict  # internal → Xero

# 4. Register in factory and strategy registry
adapter_factory.register("Xero", XeroAdapter)
register_sync_strategy("Xero", XeroSyncStrategy)

Use the QuickBooks integration as your blueprint

The QuickBooks Online integration is a fully working reference with OAuth, 7 entity types, bidirectional sync, and schema mapping. Point your AI coding tool at it and describe your target system to generate a new integration.

Configurable Sync Rules

Each entity type has its own sync rule. Configure direction, conflict resolution, and enable/disable per entity.

{
  "sync_rules": [
    {
      "entity_type": "vendor",
      "direction": "bidirectional",
      "enabled": true,
      "master_if_conflict": "external"
    },
    {
      "entity_type": "bill",
      "direction": "inbound",
      "enabled": true,
      "master_if_conflict": "external"
    },
    {
      "entity_type": "invoice",
      "direction": "outbound",
      "enabled": true,
      "master_if_conflict": "our_system"
    }
  ]
}

Supported Entity Types (QuickBooks Reference)

Vendor
Customer
Chart of Accounts
Item
Bill
Invoice
Payment

Technology Stack

Python 3.12+
FastAPI
SQLAlchemy 2
PostgreSQL
AWS SQS
AWS KMS
Docker
Terraform

Clean Architecture

Built with hexagonal architecture. Swap databases, cloud providers, queue backends, or encryption services without touching business logic.

Domain Layer

Version vectors, sync rules, conflict resolution. No external dependencies.

Services Layer

Sync orchestrator, job runner, settings management. Coordinates adapters and strategies.

Infrastructure Layer

Database, queues, encryption, HTTP clients. Pluggable adapters for each external system.

API Layer

REST endpoints with OpenAPI spec. Multi-tenant isolation via JWT. Admin APIs for operations.

Own your integration infrastructure

Stop paying per-connection fees to iPaaS vendors. Get full source code with a working QuickBooks integration, deploy on your infrastructure, and build new integrations with AI coding tools.

Book a Demo