_Docs/
Get StartedModulesPlatformDeployCookbookChangelogReference
_Stack
_Modules
  • Ledger
  • Numscript
  • Connectivity
    • Capabilities
    • Operations
    • Accounts
    • Payments
    • Transfer Initiation
    • Account Pools
    • Payment Service Users
    • Connectors
      • Generic ConnectorEE
        • Getting Started
        • How it Works
      • PSP Connectors
        • Adyen
        • Atlar
        • Bankingcircle
        • Column
        • Currencycloud
        • Increase
        • Mangopay
        • Modulr
        • Moneycorp
        • Qonto
        • Stripe
        • Wise
        • Banking BridgeEE
        • RoutableEE
      • Exchange Connectors
        • Coinbase PrimeEE
          • Payments
          • Conversions
          • Orders
        • FireblocksEE
        • BitstampEE
      • Open BankingEE
        • Getting Started with Open Banking
        • Plaid
        • Tink
        • Powens
      • Build a connector
  • WalletsEE
  • FlowsEE
  • ReconciliationEE
  1. Modules
  2. Connectivity
  3. Connectors
  4. PSP Connectors
  5. Routable
Routable
PSP Connectors

Routable

Connect a Routable workspace to Formance Connectivity to sync settings accounts, companies, payables and receivables, and initiate ACH / wire / check / international payouts and transfers.

Requires payments 3.3.0+.

The Routable connector polls a Routable workspace and surfaces its settings accounts, companies (counterparties), payables, and receivables to the Connectivity service. It also initiates outbound payables on Routable in response to Formance CreateTransfer and CreatePayout workflows.

Prerequisites#

You need a Routable account with an API key dedicated to Formance. Decide upfront which team member will own payables initiated through Formance — Routable requires an acting_team_member on every payable creation. You can either set this per-connector via config, or per-request via metadata; see Initiating payouts and transfers.

Make sure to create an API key dedicated to Formance. Doing so will improve your auditability and security and will allow you to revoke access to Formance at any time if needed.

Installation#

curl -X POST $FORMANCE_API_URL/api/payments/connectors/routable \
  -H "Content-Type: application/json" \
  -d @config.json
POST/api/payments/connectors/routable

Configuration fields#

FieldRequiredDefaultPurpose
apiKeyyes—Routable bearer token. Sent as Authorization: Bearer <apiKey> on every request.
endpointnohttps://api.routable.comAPI root. Use https://api.sandbox.routable.com for the Routable sandbox.
actingTeamMemberno""Default Routable team member ID for payable creation. Optional at the connector level — callers can override per-request via the com.routable.spec/acting_team_member metadata key. If neither is set, payable creation fails with a clear validation error before any HTTP call.
pollingPeriodno30mSync cadence (minimum 20m).

The connector validates the API key at install time with a tiny GET /v1/settings/accounts?page=1&page_size=1 probe — a bad key surfaces as an install-time error rather than as a FETCH_ACCOUNTS failure later.

Capabilities#

The connector supports the following capabilities:

  • FETCH_ACCOUNTS — internal settings accounts, polled via GET /v1/settings/accounts
  • FETCH_BALANCES — settings-account available_amount, derived per-account via GET /v1/settings/accounts/{id}
  • FETCH_EXTERNAL_ACCOUNTS — companies (counterparties), via GET /v1/companies
  • FETCH_PAYMENTS — payables (outbound) and receivables (inbound), via GET /v1/payables and GET /v1/receivables
  • CREATE_TRANSFER and CREATE_PAYOUT — both initiate POST /v1/payables (transfers are payables with the TRANSFER payment type)

Webhooks, bank-account creation, and reversals are not yet implemented — follow-up PRs upstream will add them.

Routable caps API throughput at roughly 1.5 payouts per second. The connector declares this via the PluginWithPayoutThrottle interface, so the platform routes CreatePayout and CreateTransfer workflows through a dedicated Temporal task queue throttled to that rate. See Operations → Connector reliability for the cross-cutting behaviour.

Asset model#

Routable returns asset codes as ISO currency strings (USD, EUR, KWD). The connector formats them as Formance assets via go-libs/v3/currency.FormatAsset — USD/2, EUR/2, KWD/3, and so on. Unsupported currencies are skipped (logged) without dropping the rest of the page.

Amounts are decimal strings on Routable's side and are converted to integer minor units with half-up rounding before being written to Connectivity Payments.

Status mapping#

Routable's payable statuses collapse to the standard Connectivity Payment statuses:

Routable statusPayment status
draft, ready_to_send, pending, scheduled, initiated, processing, in_transit, awaiting_deliveryPENDING
completed, paid, externally_paid, deliveredSUCCEEDED
failed, returned, nsfFAILED
stopped, canceled, cancelled, voidedCANCELLED
expiredEXPIRED
anything else (or empty)UNKNOWN

Comparison is case-insensitive.

The payment scheme is mapped from Routable's delivery_method: ach_* → ACH, everything else → OTHER.

Metadata keys#

All Routable-specific fields are namespaced under com.routable.spec/. The full list lives in the connector's MAPPINGS.md; the highlights:

Account metadata (internal accounts)#

object, type, is_valid, currency_code, plus type_details.account_type, type_details.bank_name, type_details.account_number, type_details.routing_number.

External-account metadata (companies)#

object, type, status, country_code, is_vendor, is_customer, is_archived, external_id, business_name, display_name, plus the structured registered_address.* keys.

Payment metadata#

For payables (PAYOUT) and receivables (PAYIN): type, delivery_method, status, external_id, memo, reference. Two correlation aliases also land on every Payment we initiated:

  • com.routable.spec/payment_initiation_reference — the originating PaymentInitiation reference (only present when Formance initiated the payable; payables created in Routable's UI don't carry it).
  • com.routable.spec/payable_id — the Routable payable UUID (mirrors Payment.Reference).

See Correlating an initiation with the synced payment for how to use these.

Initiating payouts and transfers#

CreateTransfer and CreatePayout both translate the Formance PSPPaymentInitiation into a Routable POST /v1/payables. Most fields are derived from the structured initiation; a few Routable-specific knobs are exposed as initiation metadata:

Metadata keyRequiredDefaultMaps toPurpose
com.routable.spec/typenoachtypePayable rail (ach, wire, check, international, external, vendor_choice).
com.routable.spec/delivery_methodnoach_standarddelivery_methodSpecific delivery option (ach_standard, ach_same_day, wire, check, …). Must be compatible with type.
com.routable.spec/acting_team_memberconditionalconnector configacting_team_memberRoutable team member ID initiating the payable. Required at request time — from either the connector config or this key.
com.routable.spec/external_idno""external_idCaller-supplied external reference (idempotent lookup key on Routable's side).
com.routable.spec/line_item_descriptionnoPSPPaymentInitiation.Description, then "Payment <reference>"line_items[0].descriptionDescription on the auto-generated single-line item. Routable v1 requires a non-empty value.

The Formance PaymentInitiation.Reference is sent as the HTTP Idempotency-Key header — Routable returns the original payable on retries with the same key, which is the behaviour Formance's create-then-poll workflow relies on.

Async response handling#

Routable's POST /v1/payables answers in two shapes:

Routable responseBehaviour
202 Accepted (async)Platform schedules PollPayoutStatus / PollTransferStatus against GET /v1/payables/{id}. The first successful poll links the PaymentInitiation to a Payment and ends the polling loop.
201 Created with a terminal status (completed, failed, cancelled, expired)Payment returned immediately; workflow ends.
201 Created with a non-terminal status (pending, processing, …)Polling round scheduled; first poll returns the Payment.

Once linked, subsequent status transitions (PENDING → PROCESSING → SUCCEEDED) are picked up by the periodic FETCH_PAYMENTS schedule rather than by re-polling.

Correlating an initiation with the synced payment#

When you initiate a payable through Formance, two distinct rows land:

  • A PaymentInitiation keyed by the reference you supplied (e.g. payout-acmecorp-20260506-172725).
  • A PSPPayment keyed by Routable's payable UUID (e.g. 652e0807-02ed-4546-848f-56babc66ec99).

They're linked at the engine level. To resolve one from the other:

Pagination and recovery#

Routable list endpoints are 1-indexed page+page_size (capped at 100). The connector checkpoints pagination state opaquely between cycles, so a worker crash mid-cycle resumes deterministically from the last persisted checkpoint — no row is double-billed or silently dropped.

The payments fetcher walks payables, then receivables, then advances its cycle watermark. The watermark stays immutable for the full duration of a cycle to avoid the page-2-tighter-than-page-1 race that would drop rows whose status_changed_at lands between page boundaries.

Routable's status_changed_at.gte filter is inclusive, so rows on the cycle boundary get re-emitted at every cycle start. The engine dedupes by PSPPayment.Reference, so this is wasted bandwidth but never a correctness problem.

Banking BridgeExchange Connectors
On This Page
  • Prerequisites
  • Installation
  • Configuration fields
  • Capabilities
  • Asset model
  • Status mapping
  • Metadata keys
  • Account metadata (internal accounts)
  • External-account metadata (companies)
  • Payment metadata
  • Initiating payouts and transfers
  • Async response handling
  • Correlating an initiation with the synced payment
  • Pagination and recovery