Skip to content

Settings — Integrations

The Settings ▸ Integrations page is the connection surface for mirroring Athenty’s general ledger to external accounting systems. Two providers are supported today: QuickBooks Online and Xero.

The platform’s design is one-way mirror. Athenty posts authoritative journal entries; the integration replicates them to your accounting system so your bookkeeper sees the same numbers. Athenty never reads back from the external system.

Settings Integrations — Acme Financial Group demo tenant

Standard PageHeader with the title Integrations and a multi-line description.

The page uses a Tabs container with two tabs:

TabContents
ConnectionsPer-provider connect/disconnect + account mapping
Sync ModeLive / Batched / Off radio group

The active tab is reflected in the URL via the standard search-param pattern.

Each provider has a card with:

  • Provider logo + name
  • Connection status pill (Disconnected / Connected / Error)
  • When connected: company / organization name, last-sync timestamp
  • Action button: Connect (when disconnected), Disconnect (when connected)
  • An expanded mapping table when connected — Athenty account ↔ provider account
  1. User clicks Connect
  2. The platform initiates an OAuth 2.0 Authorization Code flow with the provider
  3. The user authenticates and selects the target company/org
  4. The provider redirects back with an authorization code
  5. The platform exchanges the code for a refresh token and stores it encrypted at rest
  6. The platform discovers the provider’s chart of accounts and surfaces the mapping table

Refresh tokens have provider-specific TTLs (QBO: 100 days, Xero: 60 days). The platform refreshes proactively before expiry.

The mapping table pairs Athenty’s PC-Law-style numeric chart with the provider’s account list:

Athenty 1000 Operating Bank → QBO "Operating Cash" (id: 42)
Athenty 1100 Trust Bank → QBO "Trust Account" (id: 47)
Athenty 2100 Client Trust → QBO "Trust Liab" (id: 81)
Athenty 4000 Revenue → QBO "Sales" (id: 12)
...

Unmapped accounts surface a warning. Sync pauses until every required account has a target.

Three options:

ModeBehaviour
Live (default)Every posted journal entry mirrors within ~30 s
BatchedEntries queue; flushed every 4 h
OffNo entries flow; OAuth grant remains intact

Switching modes is a no-op on the connection itself — only the queue behaviour changes.

RoleViewConnectDisconnectMode
Owner
Admin
Member
Viewer

OAuth tokens are tenant-scoped and encrypted at rest. Athenty infrastructure operators cannot read refresh tokens in plaintext; the encryption key lives in a separate KMS boundary.

ActionEvent
Connectintegration.connected (provider)
Disconnectintegration.disconnected
Mode changeintegration.sync_mode_updated
Mapping changeintegration.mapping_updated
Sync failureintegration.sync_failed (with provider error)

These events surface in Settings ▸ Audit Log alongside other org events.

The mirror runs as an out-of-band worker reading from a journal_sync_queue table. Live mode dequeues immediately; Batched dequeues every 4 hours. Worker failures are retried with exponential backoff and emit integration.sync_failed for any persistent failure that exceeds the retry budget.

SymptomMost likely causeFix
Connect button errorsOAuth redirect URI not whitelistedContact support to verify redirect URI provisioning
Sync stuck after connectMapping incompleteMap all required accounts; the table flags missing rows
429 rate-limited (QBO)Too many entries in Live modeSwitch to Batched mode
Xero “tenant deleted”Org offboarded at XeroDisconnect + re-connect
Disconnected status with no actionRefresh token expiredRe-connect; provider grant must be fresh