Payment Intents
Payment intents represent an intent to collect payment from or send a payment to a contact. A payment intent which results in payments being received from a contact are inbound payment intents with a direction of 0. A payment intent which results in payments being sent to a contact are outbound payment intents with a direction of 1.
Contacts
Every payment intent is attached to a contact. A contact has a name and email associated to it, which is used to notify contacts to send or receive payment. An optional phone number may also be added.
For inbound payment intents, contacts may have an optional secondary email with which a payment intent can be paid.
Transactions
A payment intent may have one or more related transactions. When a contact sends a payment or receives a payment, a transaction is created.
Transactions either increment or decrement the balance_paid amount on their payment intent, depending their direction. For example, for an transaction on an inbound payment intent, a direction of 0 would increment the balance_paid while a direction of 1 would decrement the balance. In this scenario, the inbound-direction transaction is a payment made by the contact towards the payment intent while the outbound-direction transaction is likely a return or refund.
Payment Intent Statuses & Lifecycle
Payment intents progress through several statuses:
| Status | Description |
|---|---|
Pending |
The initial status of newly created payment intents awaiting payment |
PartiallyPaid |
The payment intent has been partially paid (balance_paid != total) |
Paid |
The payment intent has been fully paid (balance_paid == total) |
Canceled |
The payment intent has been canceled |
Draft |
(Outbound payment intents only) The payment intent is waiting for admin approval and is not yet available for payment. This status is not achievable via API |
Failed |
(Outbound payment intents only) The payment intent has a returned transaction (the payment has failed). This state is not achievable via API |
Errored |
The payment intent has an error related to the integrated accounting system. This state is not achievable via API |
Inbound Payment Intents
Creating an inbound payment intent
In Truss, each company account is required to set up a Payment Portal link in order to create inbound payment intents and begin accepting payments from their customers. Once set up, inbound payment intents can be created by users via the Truss web client or mobile app, via an accounting integration, or via API. Newly created inbound payment intents will have a Pending status.
Accepting payment on an inbound payment intent
A Payment Portal is a unique link generated for each Truss company. Companies are able to distribute this link via their preferred channel to give their customers a platform to view and pay payment intents which the company has sent to them to be paid. All Pending, PartiallyPaid and Paid inbound payment intents related to the customer are available to view in the Payment Portal. Pending and PartiallyPaid can be selected by customers to pay via one of the available payment methods. Once a customer pays, a transaction is created and the payment intent will move to a PartiallyPaid or Paid status, depending on if there is a remaining balance on the payment intent.
For integration partners looking to integrate Truss directly into their invoicing flow, a separate checkout option will be available late February 2026
Funds availability for payments
Once a customer pays a Truss company the inbound transaction is subject to a settlement period while the funds arrive and clear in the Truss bank account. During this time, the funds are immediately available to spend to create outbound transactions in Truss or spend on Truss cards. Once sufficient inbound transactions are settled, the outgoing transactions complete processing and are sent to their destination.
Managing Payment Intents Via API
Payment intents may be created, updated, fetched and canceled via API. Please see API References for more details.
Only inbound payment intents may be managed via API at this time.

