FF Commerce
Part of the FastFlowTech Platform

Payment Processing
Without the Complexity

Hold-capture payments, instant transfers, and settlement - with double-entry guarantees baked in.

payment-flow.sh
# Create a hold on the source account
$ curl -X POST /v1/payments \
  -d '{"source":"acc_buyer","dest":"acc_seller","amount":250.00}'
{"id":"pay_8f3k","status":"held","amount":250.00}

# Capture when the order is fulfilled
$ curl -X POST /v1/payments/pay_8f3k/capture
{"id":"pay_8f3k","status":"captured","amount":250.00}

Built for Serious Payment Flows

Every feature designed around safety, auditability, and developer experience.

Hold-Capture Payments

Reserve funds first, capture when ready. Release if the deal falls through. Two-phase commit on every payment.

Direct Transfers

Move funds between accounts instantly. No hold needed for trusted flows.

Idempotent by Design

Every operation accepts an idempotency key. Safe retries, no double-charges.

Ledger-Backed

Every payment and transfer creates a double-entry in FF Ledger. Auditable from day one.

Multi-Currency

BTC, fiat, or custom units. Currency flows through from source to destination.

Multi-Tenant

Each org gets isolated payment and transfer records. Provision via the platform SDK.

API Reference

Six endpoints. That's the entire surface area.

POST /v1/payments
GET /v1/payments/{id}
POST /v1/payments/{id}/capture
POST /v1/payments/{id}/release
POST /v1/transfers
GET /v1/transfers/{id}

How it Works

Three steps. Funds move only when you say so.

1

Hold

Funds are reserved on the source account. Nothing moves yet.

2

Deliver

Your app fulfills the order or service. Take your time.

3

Capture

Funds move to the destination account. Double-entry recorded.

Get Started in Minutes

Add the SDK, wire up two calls, and you have payments.

Program.cs
builder.AddFFCommerce();

// Hold-capture payment
var payment = await commerce.CreatePaymentAsync(
    sourceId, destId, amount);

// ... fulfill the order ...

await commerce.CapturePaymentAsync(payment.Id);

// Or skip the hold - direct transfer
await commerce.TransferAsync(fromId, toId, amount);