ClientsClient portal

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:

  1. The client enters their email address on the portal sign-in page for your business.
  2. If the address belongs to a client of that business, they receive a single-use magic link by email.
  3. Opening the link starts a portal session limited to that one client of that one business.
  4. 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.

ItemBehaviour
Magic link256-bit random, stored only as a hash, single-use, short-lived (15 minutes is the proposed default)
Portal sessionClient-scoped, expires (24 hours is the proposed default) and ends on sign-out
Requests for a linkRate 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.

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.

1

Check the client's email

Open the client under Clients and make sure the email address is the one they use.

2

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.

3

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.

ActionRESTRelease
Request a magic linkPOST /v1/public/portal/magic-linkJanuary 2027
Open a portal sessionPOST /v1/public/portal/sessionJanuary 2027
List documentsGET /v1/portal/documentsJanuary 2027
Get a document or its PDFGET /v1/portal/documents/{id} and /pdfJanuary 2027
Get the statementGET /v1/portal/statementJanuary 2027
List saved cardsGET /v1/portal/saved-payment-methodsMarch 2027
Remove a saved cardDELETE /v1/portal/saved-payment-methods/{id}March 2027
List signed contractsGET /v1/portal/contracts and /{id}/pdfMarch 2027
Sign outPOST /v1/portal/logoutJanuary 2027
Request a magic link
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:

KeyWhy it matters
clients.editNeeded to change the client's email address that the magic link is sent to
documents.sendNeeded to send the documents that later appear in the portal

Errors

CodeWhen
token_invalidThe magic link token is unknown
token_expiredThe magic link or session has expired; request a new link
token_revokedThe token was cancelled
rate_limitedToo many link requests; wait and try again (Retry-After says how long)
unauthenticatedA /v1/portal/* call without a valid portal session