Invoicing
The pay page
Every sent invoice has a pay page where your client sees the invoice, the amount due and every payment method you accept, with no ads and no analytics.
The pay page is what your client opens from the link in your email or the link you shared. It shows the invoice in your branding, the amount due, and the ways they can pay you. Money goes straight to your own Stripe account or bank, never through us, and we never take a cut.
What your client sees
The pay page at freeinvoiceautomation.com/pay/[token] shows:
- the invoice as it was sent, themed with your logo and business colour;
- the amount due, which is the invoice balance after payments and credit notes;
- every payment method you accept on this invoice;
- the void or credit note state, when there is one.
The page has no app chrome, no analytics, no ads, no affiliates and no sponsors. On Free it carries a small "Powered by Free Invoice Automation" line; on Team it does not.
Payment methods
Which methods appear depends on what your business has set up in Settings > Payment methods and which of them are accepted on this invoice.
| Method | How the client pays | When it is marked paid |
|---|---|---|
| Card by Stripe | Pay by card opens Stripe's hosted checkout on your own connected Stripe account. Card details never touch our servers. | When Stripe's verified webhook confirms the payment. |
| Bank transfer | The page shows your bank details. The client pays from their bank, then clicks I have paid and may upload proof. | When you record the payment. |
| Local QR payments (week of 25 January 2027) | UPI for INR invoices; Raast, JazzCash and Easypaisa for PKR invoices. The client scans the QR or uses the account details shown next to it, then clicks I have paid. | When you record the payment. |
| Whop (February 2027) | A Whop checkout link on your own Whop account. | When Whop's verified webhook confirms it. |
QR rails appear only when the invoice currency matches them, so a USD invoice never shows UPI or Raast.
Partial payments
Partial payments are allowed by default. The client may pay part of the amount, and the balance updates once the payment is confirmed. A business can turn partial payments off for itself, a client or one invoice.
"I have paid" and payment proof
For bank transfer and QR payments, the client clicks I have paid, optionally enters the amount and date and adds a note, and may upload a proof such as a bank screenshot or PDF. You are notified and the proof is stored privately. The invoice is not marked paid until you accept the proof or record the payment. See Payment proofs.
What changes after launch
- Payment schedules (week of 25 January 2027): when the invoice has a deposit or instalments, the page shows the schedule and asks for the next amount due; the client may also pay more. See Deposits and schedules.
- Save card (March 2027): on the first Stripe checkout, the client may tick "Save this card for future invoices from" your business, so later invoices can be charged automatically with their consent. See Saved cards and auto-charge.
Void and credited invoices
| Invoice state | Pay page shows |
|---|---|
| Voided | "VOID" and no payment button. Voiding also revokes the pay link, so new visits get "link no longer valid". |
| Credited | The credit note and the reduced balance. |
| Fully credited | A balance of 0. |
How payment is confirmed
The client pays
By card through Stripe Checkout, or outside the system by bank or QR.
The page waits for confirmation
After checkout, the client returns to a page that says the payment is being confirmed. Returning from checkout never marks the invoice paid by itself.
A trusted event confirms it
The invoice changes only on a verified webhook from the rail, a reconciliation run that catches a missed webhook, or a payment a person on your team records. Each is written to the audit log.
Through the API
The pay page is built on public routes that need only the pay token. You normally do not call them yourself, but they are documented so you can build your own page if you want:
curl "https://api.freeinvoiceautomation.com/v1/public/pay/$PAY_TOKEN"curl -X POST "https://api.freeinvoiceautomation.com/v1/public/pay/$PAY_TOKEN/checkout" \
-H "Content-Type: application/json" \
-d '{
"connection_id": "0193f2a8-6a7b-7c8d-9e0f-1a2b3c4d5e70",
"amount_minor": "60000"
}'The checkout call returns the URL of the hosted checkout. It never marks anything paid.
| Task | Endpoint |
|---|---|
| Read the pay page | Get the pay page |
| Start a checkout | Start a checkout |
| Upload a proof file | Upload a payment proof file |
| Submit "I have paid" | Submit a payment proof |
| Check status as the business | Get payment status (MCP get_payment_status) |
Rules and limits
- We never hold your money. Stripe and Whop pay into your own accounts; bank and QR payments go straight to you.
- Rate limits protect the page: token pages allow 60 requests a minute per visitor, and "I have paid" with upload is limited to 5 an hour per link.
- Uploads are limited in size and type, and images are re-encoded before they are stored.
- The link expires and can be revoked. See Share links.
Permissions
Your client needs no account; the pay link is their access. On your side:
| Action | Permission key |
|---|---|
| Share a pay link | documents.send |
| Choose payment methods | rails.manage |
| Accept or reject a payment proof, record a payment | payments.record |
| See payment status | payments.view |
Errors your client may see
| Code | Meaning |
|---|---|
token_expired | The link expired. |
token_revoked | The link was revoked or the invoice was voided. |
rail_not_connected | The chosen method has no active connection. |
rate_limited | Too many requests; wait and try again. |