Client Portal
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.
Magic link flow
- Client receives an email with a one-time magic link containing a short-lived token
- Client clicks the link; the browser sends
POST /portal/:slug/redeemto exchange the token for a session cookie - The cookie grants access to that specific intake only (not other intakes), and is valid for 14 days
- If the client loses the email, trigger a re-send:
POST /v1/intakes/:id/send(or usesend_chasefrom MCP)
The magic link itself is single-use — it is invalidated after redeem. The session cookie that results is multi-use for 14 days.
What the client sees
- Your branding: logo, accent color, sender name (on paid plans)
- Project name and a personalized greeting ("Hi Michaela, Radim needs a few things to get started...")
- A progress bar ("5 of 8 items complete")
- All items listed with their labels, help text, and current status
- A "Submit all" button that marks the intake complete and fires the
intake.completedwebhook
On the Free plan, "Powered by BriefGate" is shown at the bottom of the portal. This is removed on Solo and Agency plans. Custom portal domain (e.g. intake.yourcompany.com) is available on Agency.
Item interactions
Each item type renders a specific UI:
- text / longtext — standard input or textarea with live character count
- file / file_list / image — drag-and-drop upload area or camera/gallery picker on mobile, progress bar during upload
- color / color_list — visual color picker (eyedropper and hex input)
- select — dropdown or radio group depending on number of options
- boolean — toggle switch
- url — URL input with format validation on blur
- secret — masked input with lock icon; value is encrypted before leaving the browser
- structured — a simple form auto-generated from JSON Schema; key/value pairs for objects, repeated rows for arrays
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:
- File inputs trigger the camera or photo gallery on iOS and Android
- HEIC images from iPhone cameras are converted to JPEG server-side automatically — clients do not need to convert files themselves
- Progress is preserved across page reloads and browser restarts
- The portal is fully functional on slow connections (files upload in chunks with resume support)
In-portal validation
Clients see validation errors immediately — before they click Submit. For example:
- "Logo is 200px wide, minimum required is 512px. Please upload a larger version."
- "URL does not appear to be valid — check for missing
https://." - "File is 28 MB, maximum allowed is 20 MB."
This validation runs server-side and is returned to the portal in real time. Catching problems before the client hits Submit reduces the number of revision cycles.
Languages
The portal UI is available in:
| Code | Language |
|---|---|
en |
English (default) |
cs |
Czech |
de |
German |
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 a language.
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 revision_requested. 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 and Agency.
"Powered by BriefGate"
On the Free plan, a small "Powered by BriefGate" notice appears at the bottom of the portal. It links to https://briefgate.dev.
This notice is removed entirely on Solo and Agency plans. On 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).