Transaction

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.

Payload

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;
reference_title: string | null;
external_id: string | null;
psp: "stripe" | "adyen" | "swish" | "bankgirot" | null;
currency: string | null;
metadata: Record<string, string>;
payer_id: PayerID;
receivable_id: ReceivableID;
subscription_id: SubscriptionID | null;
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. psp names the payment provider that processed the attempt. It is null for invoice payments and for older transactions whose provider is unknown. reference_title is the readable name of reference, taken from the transaction's receivable, and null when the receivable has none. receivable_id links the transaction to the receivable it is attempting to satisfy. subscription_id is that receivable's subscription, or null when it has none. A one-time gift can carry one too, so type is the field that tells a monthly charge from a one-time payment.

For an Adyen payment, external_id is Adyen's pspReference (for example "8836183819713204"), so an organisation reading Adyen's own notifications can match them to this transaction on that value.

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.