Payment Links & Offline Payment
The fastest way to not get paid is to put a login screen between your client and their invoice. Every invoice now carries a payment link: whoever has it lands on that invoice, read-only, with the card form ready — no account, no password, no friction.
What a Payment Link Is
A URL for one invoice with a long random token on the end:
https://yourportal.com/invoice/inv-2026-0042/?cove_pay=e06c7241c756…
Opening it shows the invoice exactly as an assigned client would see it — details, line items, totals, status — plus the Pay Invoice button and the Stripe card drawer. The visitor never signs in and never creates an account.
The link is minted the first time it's needed — copying it, or sending the invoice email — and stays the same forever after. Re-copying it next month produces the identical URL, so the copy already sitting in a client's inbox keeps working.
Copying the Link
On the invoice list, every unpaid invoice has a link icon among its row actions. Click it and the payment link is on your clipboard, ready to paste into an email, a text, a Slack message — wherever your client actually reads.
The button appears for Draft, Sent and Overdue invoices; a Paid invoice has nothing left to pay, so it has no link button.
The Emailed Button
You usually won't need to copy anything: the invoice email's button is the payment link. The stock templates read Pay $1,827.50 Now, and clicking it:
- Opens the invoice — no login
- Opens the payment drawer automatically, card form ready
One click from inbox to card form. The overdue reminder's Pay Now button works the same way, and this holds for Email Designer templates too — both the invoice-link and pay-link variables now carry the token.
What the Link Grants
Two things, both scoped to that single invoice:
- Viewing it — the same read-only page an assigned client sees
- Paying it — the card drawer, backed by the same server-side payment flow
The amount always comes from the invoice's own balance; nothing in the link or the request can change what gets charged. Every payment is verified with Stripe server-side before the invoice's status changes — the same confirmation flow as a logged-in payment.
What It Does Not Grant
- Not the invoice list — the visitor can't browse to other invoices
- Not any other invoice — each link opens exactly one
- Not the PDF download — the PDF gateway requires a portal login. A link visitor sees "Log in to download a copy" instead of a download button, pointing at the login page and returning them to the invoice afterward. The PDF is also attached to the invoice email, which is where most clients will get it.
- Not any admin controls — no edit, no send, no mark-as-paid
A payment link is a bearer credential — anyone holding it can view and pay that one invoice, exactly like a resource share link. Don't post one anywhere public. The worst case of a leaked link is someone else paying the invoice, but the invoice's details are visible to whoever has the URL.
Offline Payment Instructions
Not every client pays by card. Settings → Invoices → Offline Payment Instructions is a free-text box for the other ways: bank transfer details, where to mail a check, a phone number for card-over-phone.
Set it once and it appears in two places:
- In invoice emails, as an "Other ways to pay" section beneath the pay button — combined with that invoice's own payment terms
- On the payment page, as "Prefer to pay another way?" directly under the card form — visible to logged-in clients and payment-link visitors alike
Leave it empty and neither section renders: card payment stays the only offer, with no empty box where instructions would go.
Offline payments still need to be recorded by hand — when the check arrives, use Mark as Paid on the invoice. See Manual Mark as Paid.
Security Model
For the record, since money is involved:
- The token is 32 random hex characters (128 bits), stored against the invoice and compared with a constant-time check. Guessing one is not a practical attack.
- A wrong, missing or malformed token behaves exactly like no token: the login wall stands.
- One invoice's token opens nothing else — not even with the same client.
- Paying is the safe direction: money moves toward you, the amount comes from the invoice, and the payment is confirmed with Stripe before any state changes.
- If a specific link must be killed, deleting the invoice's stored token invalidates it and the next copy mints a fresh one. There is no UI for this yet — ask support, or clear the
_cove_pay_tokenmeta if you're comfortable in the database.