Payments
Stripe
Take card payments on your own Stripe account through Stripe Connect, with hosted Checkout and refunds from the app.
Stripe lets your clients pay invoices by card. You connect your own Stripe account to a business through Stripe Connect (Standard accounts), and each invoice gets a hosted Stripe Checkout page. Money goes straight from your client to your Stripe account and then to your bank on Stripe's normal schedule. We never hold the money and never take a percentage of it.
How it works
- Your account, your money. Stripe Connect with Standard accounts means the Stripe account is yours: you sign in to Stripe directly, see your payments there, and Stripe pays out to you. Free Invoice Automation is connected to it so it can create checkouts and read payment events.
- Hosted Checkout only. Card details are typed only on Stripe's own Checkout page. They never reach our servers, which keeps your business within the simplest card-security scope (PCI SAQ-A).
- Webhooks mark invoices paid. When a payment succeeds, Stripe sends a signed event. We verify it, store it, process it, and then mark the invoice paid or partially paid. A client being redirected back to us does not mark anything paid.
- Reconciliation as a safety net. If an event is ever lost, a reconciliation run asks Stripe for the true state and corrects the invoice.
- Fees. Stripe charges its own fees on your Stripe account. We record the fee on the payment where Stripe reports it, so you can see it, but we add nothing.
Connect Stripe
Open Settings > Payment methods
Pick the business that should take card payments. Each business connects its own Stripe account.
Connect Stripe
Choose to connect Stripe. You are asked to sign in again first, because this decides where money is paid.
Finish on Stripe
Stripe opens its own onboarding. Sign in to your existing Stripe account or create one, then return to the app.
Check the connection
The connection shows as active once it is verified. Stripe now appears as a payment method on new invoices for this business.
Connections are checked every night. If a connection breaks (for example you disconnected the app inside Stripe), the business shows a warning and the connection status becomes failing or disconnected until you fix it.
| Connection status | Meaning |
|---|---|
pending | Onboarding started but not finished |
active | Ready to take payments |
failing | The last check failed; see the error shown on the connection |
disconnected | The connection was removed or Stripe revoked access |
What the client sees
- On the pay page, the client clicks Pay by card.
- They are sent to Stripe Checkout for the amount due (or, when partial payments are allowed, the amount they chose).
- After paying they return to a page that says the payment is being confirmed.
- As soon as Stripe's webhook is verified, the invoice is marked paid and the pay page shows the new balance.
From March 2027, Checkout can also offer Save this card for future invoices from your business name. See Saved cards and auto-charge.
Through the API
| Action | REST | Permission |
|---|---|---|
| Start Stripe Connect onboarding | POST /v1/connections/stripe/onboarding | rails.manage (fresh sign-in) |
| List connections | GET /v1/connections | rails.manage |
| Verify a connection | POST /v1/connections/{id}/verify | rails.manage |
| Delete a connection | DELETE /v1/connections/{id} | rails.manage |
| Start a checkout (pay page) | POST /v1/public/pay/{token}/checkout | pay token |
| Refund a payment | POST /v1/payments/{id}/refunds | payments.refund |
Starting onboarding needs a fresh sign-in, so it is done from a web session rather than with an API key. The pay page calls the checkout route with the pay token; it returns a hosted Stripe Checkout URL and never marks anything paid.
{
"connection_id": "0193f2a9-3c4d-7e5f-8a6b-7c8d9e0f1a2b",
"amount_minor": "50000"
}To check whether an invoice is paid, read its payment status or listen for webhooks:
curl "https://api.freeinvoiceautomation.com/v1/documents/0193f2b4-5a6b-7c8d-9e0f-1a2b3c4d5e6f/payment-status" \
-H "Authorization: Bearer $FIA_API_KEY"Over MCP, ask your assistant with get_payment_status. Outgoing webhook events include payment.succeeded, document.paid, document.partially_paid and payment.refunded.
Stripe events we act on
Stripe sends events for all connected accounts to one endpoint, and each event is matched to your connection by its Stripe account id. Each event is processed once, even if Stripe sends it again. The planned list covers completed, expired and failed Checkout sessions, succeeded and failed payment intents, refunds (charge.refunded), disputes (charge.dispute.created), account updates and deauthorisation, and, from March 2027, saved-card events.
Refunds
You can refund a Stripe payment from the app, without opening Stripe. Refunds usually start from a credit note with the refund settlement, or directly on the payment. The refund is created on your connected account and recorded when Stripe confirms it. See Refunds.
Rules and edge cases
- One Stripe account per business connection. Different businesses can connect different Stripe accounts.
- Currency. Stripe takes payments in the currencies Stripe supports for your account.
- Partial payments are allowed by default; the pay page lets the client pay less than the balance.
- Voided invoices have their open payment links cancelled; a client cannot start a new checkout.
- Disconnecting. Deleting the connection is destructive and asks for confirmation. Invoices already paid keep their payments.
- Not our billing. This Stripe connection is for your clients paying you. Your own Team plan is billed separately.
Permissions
| Key | Needed for | Default roles |
|---|---|---|
rails.manage | Connecting, verifying and removing Stripe | Owner, Admin |
payments.view | Seeing Stripe payments | Owner, Admin, Editor, Viewer, Accountant |
payments.refund | Refunding Stripe payments | Owner, Admin |
Errors
| Code | When |
|---|---|
fresh_signin_required | Connecting Stripe without a recent sign-in |
rail_not_connected | The invoice offers Stripe but the connection is not active |
connection_failed | Verifying the connection failed |
upstream_error | Stripe returned an error; try again |
not_configured | Card payments are temporarily unavailable on the platform |
token_revoked | The pay link was cancelled, for example because the invoice was voided |