Client Portal

Try it yourself. Open a demo portal — no account, no sign-up. It is a real intake on the real portal, so what you see is exactly what your client sees. It deletes itself within a day.

Overview

When you call define_intake, BriefGate generates a unique branded portal URL (e.g. https://p.briefgate.dev/8f3k) and emails it to your client with a magic link. The client does not need to create an account. They click the link, land directly in their portal, and start submitting assets.

On paid plans, the portal shows your branding — not BriefGate's. From the client's perspective, this is a tool you built for them.

Once the client starts submitting, review what came in from the intake detail page in the dashboard, or pull everything at once as a ZIP — see Download Everything as a ZIP.

  1. Client receives an email with a magic link containing a token
  2. Client clicks the link; the browser sends POST /portal/:slug/redeem to exchange the token for a session cookie
  3. The cookie grants access to that specific intake only (not other intakes), and is valid for 14 days
  4. If the client loses the email, trigger a re-send: POST /v1/intakes/:id/send (or use send_chase from MCP)

The magic link is not single-use, and it's also not one-per-email: an intake has one stable link for its whole life, and every email about it — the invitation, each reminder, a manual chase — carries that same link. It stays valid for the account's portal link validity setting (portal_link_ttl_days, default 30 days, configurable 1–365 in the dashboard), counted from the most recent email sent for that intake, so every send extends the window instead of replacing the link. The token itself is derived server-side from the intake and a server secret, and only its hash is stored — never the token, never in plaintext.

The practical consequence: whoever holds the link holds access to that intake for as long as the intake keeps getting emails (or until portal_link_ttl_days passes since the last one). Treat a forwarded invitation email the way you would treat a forwarded document. Deleting or anonymising an intake stops its link from working, regardless of the TTL.

What the client sees

On the Free plan, "Powered by BriefGate" is shown at the bottom of the portal. This is removed on Solo, Studio, and Agency plans. Custom portal domain (e.g. intake.yourcompany.com) is available on Studio and Agency — see Custom Domains for setup.

Client brief

Sometimes the information needs to flow the other way first — a contract offer to sign, a scope document, a few paragraphs of context before the client fills anything in. Set client_brief on define_intake (or PATCH /v1/intakes/:id afterwards) and attach files with POST /v1/intakes/:id/brief/files; both are documented under POST /v1/intakes and Client brief in the REST API reference.

When either is set, it appears above the requested items as "Information from <your name>" — the same sender name the invitation e-mail signs with. Attachments go through the identical pipeline a client's own upload does: real content-type sniffing, HEIC-to-JPEG conversion, and an antivirus scan before the file is ever shown as downloadable. A file still being scanned, or one the scanner flagged, shows in the portal without a working link until it clears — the client is never handed a file BriefGate has not vetted.

The invitation and reminder e-mails add one line pointing the client at the portal when a brief is present, but never attach the files themselves — email attachments bypass the antivirus/quota accounting this whole product is built around, so the client always has to open the portal to see them.

Thank-you e-mail

The moment an intake completes — whether the client clicked "Send assets" or you marked the last item as received outside BriefGate — the client gets one short thank-you e-mail in the intake's language, confirming that everything arrived and you can continue. It is on by default, sent once per intake and never for intakes created with a test-mode key. Switch it off with Send a thank-you e-mail to the client when everything has arrived in Settings (or send_client_thank_you: false on PATCH /v1/account) if you prefer to close the loop yourself; the intake.completed webhook and your own notification are unaffected.

Item interactions

Each item type renders a specific UI:

All items autosave on every field change. If the client closes the browser mid-way through, their progress is saved and they can return via the same portal link without re-entering anything.

Mobile-first

The portal is designed for clients submitting from a phone. Key mobile behaviors:

In-portal validation

Clients see validation errors in two layers, before and after anything is sent:

The browser-side check is a courtesy that catches the obvious cases before the client hits Send assets, reducing revision cycles; the server-side check is authoritative and cannot be bypassed by a client that skips the browser check.

Languages

The portal UI is available in:

Code Language
en English
cs Czech
sk Slovak
pl Polish
de German
es Spanish

Omit client.language and the account's default_language applies; with neither set, the portal falls back to English.

Set at define_intake time via client.language. All labels, help text, buttons, and system messages are shown in the chosen language. The item label and help fields you define are shown as-is — translate them yourself when using a non-English language.

Additional languages are planned. Contact support to request one.

Revision flow

When the agent calls request_revision(intake_id, item_key, note), the portal flags that item with a banner showing your note:

"This logo is too small. Please upload at least 512px wide. The SVG version would be ideal if you have it."

The item's status changes to needs_revision. The client receives an email notification, clicks back to the portal, and re-uploads or re-enters the item. When they submit, item.submitted fires again and the item status returns to submitted.

On Free plan, revision requests are not available (plan_required error). Available on Solo, Studio, and Agency.

"Powered by BriefGate"

On the Free plan, a small "Powered by BriefGate" notice appears at the bottom of the portal, and again on the "Done!" screen once the client submits everything. Both link to https://briefgate.dev. Right next to each one is a second, smaller line — "Collecting files from your own clients? Try BriefGate →" — pointed at other people running an intake of their own, not at your client. Client-facing emails (invite, reminder, revision request, completion notice) carry the same line in their footer.

Both notices are removed entirely on Solo, Studio, and Agency plans — there is no separate toggle for the referral line; it disappears together with the branding it sits next to. On Studio and Agency, you can also configure a custom portal domain so the URL itself shows your brand (e.g. intake.yourcompany.com instead of p.briefgate.dev/8f3k) — see Custom Domains.