Clients
Client portal
A passwordless portal where a client sees, pays and downloads every document one business has sent them.
Coming the week of 11 January 2027
This feature ships in the week of 11 January 2027. This page describes how it will work; details can change before release.
The client portal gives each client one place for everything a business has sent them: their documents, credit notes and a statement. Clients open it with a magic link sent to their email, so they never create an account or remember a password. It saves them from searching their inbox, and saves you from resending old invoices.
How the portal works
The portal lives at https://freeinvoiceautomation.com/portal and is themed with the business's branding. A portal session is always for one business and one client:
- The client enters their email address on the portal sign-in page for your business.
- If the address belongs to a client of that business, they receive a single-use magic link by email.
- Opening the link starts a portal session limited to that one client of that one business.
- The client browses, pays and downloads. They can sign out at any time, and the session also ends on its own after a while.
The sign-in page always gives the same answer, whether or not the email matches a client. This stops anyone from using the portal to find out who your clients are.
If the same person is a client of two businesses, they get two separate portals. One session never shows documents from another business or another client, even inside the same account. This is enforced by the database itself, not just by the page.
Links and sessions
| Item | Behaviour |
|---|---|
| Magic link | 256-bit random, stored only as a hash, single-use, short-lived (15 minutes is the proposed default) |
| Portal session | Client-scoped, expires (24 hours is the proposed default) and ends on sign-out |
| Requests for a link | Rate limited per email address and per IP address |
Exact link and session lifetimes are platform settings and may change; nothing about them is hardcoded.
What the client sees
Every document the business has sent the client, with its status (for example sent, partly paid, paid, overdue or void). Each document can be opened, paid through its pay page and downloaded as a PDF. Voided invoices show a clear "VOID" stamp and cannot be paid.
Credit notes issued to the client, each linked to the invoice it credits. Clients can see when a balance was reduced and why.
A statement of the client's account with this business: what was invoiced, paid and credited.
From March 2027, if the client saved a card for auto-charge, the portal shows it by brand and last 4 digits only, with a Remove button. Removing it detaches the card at Stripe and future automatic charges fall back to a normal pay link.
From March 2027, contracts the client signed can be downloaded from the portal as sealed PDFs. See Contracts and e-signature.
The portal is clean by design:
- No analytics, ads, affiliates or sponsors, ever.
- "Powered by Free Invoice Automation" is shown only for businesses on the Free plan. Team businesses show only their own brand.
- Paying from the portal uses the same pay page as a pay link, so the same payment methods, partial payments and rules apply. An invoice is marked paid only when the payment is confirmed (a verified Stripe webhook or a payment you record), never because the client was redirected back.
Give a client access
You do not need to invite clients or switch anything on per client. Any client with an email address on their record can request a magic link.
Check the client's email
Open the client under Clients and make sure the email address is the one they use.
Send them to the portal
Share the portal sign-in page for your business with the client. They enter their email and receive the link.
The client opens the link
The link opens their portal straight away. It works once; a new visit later needs a new link.
Pay links in your invoice emails keep working on their own. The portal is an extra place for clients who want to see everything together, not a replacement for pay links.
Through the API
The portal is built on public and client-scoped API routes, the same API the pages use. You would call these only if you build your own client-facing pages.
| Action | REST | Release |
|---|---|---|
| Request a magic link | POST /v1/public/portal/magic-link | January 2027 |
| Open a portal session | POST /v1/public/portal/session | January 2027 |
| List documents | GET /v1/portal/documents | January 2027 |
| Get a document or its PDF | GET /v1/portal/documents/{id} and /pdf | January 2027 |
| Get the statement | GET /v1/portal/statement | January 2027 |
| List saved cards | GET /v1/portal/saved-payment-methods | March 2027 |
| Remove a saved card | DELETE /v1/portal/saved-payment-methods/{id} | March 2027 |
| List signed contracts | GET /v1/portal/contracts and /{id}/pdf | March 2027 |
| Sign out | POST /v1/portal/logout | January 2027 |
curl -X POST "https://api.freeinvoiceautomation.com/v1/public/portal/magic-link" \
-H "Content-Type: application/json" \
-d '{ "business_slug": "acme-studio", "email": "[email protected]" }'The magic-link route always answers 202 Accepted with no body details, whether or not the email matches. The session route exchanges the token from the email for a client-scoped session cookie; the /v1/portal/* routes then read only that client's data. Portal routes are not on the MCP tool list. They authenticate with the client's portal session rather than an API key, because they act as the client, not as you.
Rules and edge cases
- No passwords anywhere. Clients never have a password. Losing a link only means asking for a new one.
- Used or expired links show that the link is no longer valid and reveal no document data.
- Changed email. Magic links go to the email address on the client record, so keep it current.
- Voided and credited invoices show their state clearly, the same way the pay page does: "VOID" with no payment button, or the credit note and the reduced balance.
- Reminder opt-out is separate from the portal. Clients opt out of reminders through the link in reminder emails. See Reminders.
Permissions
Clients do not use permission keys; their access comes from the portal session. On your side:
| Key | Why it matters |
|---|---|
clients.edit | Needed to change the client's email address that the magic link is sent to |
documents.send | Needed to send the documents that later appear in the portal |
Errors
| Code | When |
|---|---|
token_invalid | The magic link token is unknown |
token_expired | The magic link or session has expired; request a new link |
token_revoked | The token was cancelled |
rate_limited | Too many link requests; wait and try again (Retry-After says how long) |
unauthenticated | A /v1/portal/* call without a valid portal session |