transaction
is a single attempt to satisfy a receivable.
A receivable can have many transactions: if an attempt fails (for example
insufficient funds or a rejected charge), a new transaction is created for the next
attempt against the same receivable. It is not
a receivable under a different name.
Draft: There are no REST endpoints for transaction. Webhook events
(transaction.created and transaction.updated)
are the integration surface that is active today.
type TransactionID = `trn_${string}`;
type TransactionPaymentMethod =
| "swish"
| "autogiro"
| "card"
| "apple_pay"
| "google_pay";
type Transaction = {
id: TransactionID;
amount: string;
status:
| "paid"
| "rejected"
| "insufficient_funds"
| "retry"
| "pending";
type: "onetime" | "recurring";
payment_method: TransactionPaymentMethod | null;
transaction_date: string;
reference: string | null;
external_id: string | null;
currency: string | null;
metadata: Record<string, string>;
payer_id: PayerID;
receivable_id: ReceivableID;
payer: Payer | null;
inserted_at: string;
updated_at: string;
};
Every field above is always present in the payload; absent values are sent as
null
(not omitted). amount
is serialised as a string to preserve precision and
transaction_date
is an ISO date. inserted_at
and updated_at
are naive timestamps without timezone (for example "2026-05-12T13:46:10").
external_id
is the id assigned by the external payment provider (for example a Stripe charge
or a Swish payment) when the attempt reaches one.
receivable_id
links the transaction to the receivable it is attempting to satisfy.
receivable.created
and receivable.updated
carry the receivable (the claim being collected).
transaction.created
and transaction.updated
carry the transaction described here. See the Receivable
page for the entity this transaction settles.