Automate Client Intake With Zapier
If you already run your agency on Zapier, client intake shouldn't be the one step that still happens by hand. This is a how-to companion to BriefGate for Zapier — four Zaps you can build today, each with the exact trigger, action, and field mapping, so a project starts with the logo, the copy, and the login already sitting in your stack instead of in a stalled email thread.
Read BriefGate for Zapier first if you haven't connected the integration yet — it covers the invite link, connecting your account, and what each trigger, action, and search does. This page assumes that part is done and gets straight to building.
Before you build
- Use a
bg_test_…API key while you build. A test key never emails or texts a real client — invitations and reminders are recorded asskipped— so you can run a Zap end to end without a client actually seeing anything. Switch tobg_live_…once the Zap is live. See API key scopes. - Triggers need the
adminscope. Each of the four triggers below registers a webhook on your BriefGate account when you turn the Zap on, and BriefGate requiresadminfor that —intakes:read/intakes:writealone isn't enough for a trigger step, only for actions and searches. - One key per Zap is fine. Scopes are set per API key, so if you want an actions-only Zap on a narrower key, create a second key with just
intakes:readandintakes:write.
Zap 1: Deal won → intake sent
The goal: the moment a deal closes in your CRM, the client already has a portal link waiting, without you opening BriefGate at all.
| Step | App | Event |
|---|---|---|
| Trigger | Your CRM (Pipedrive, HubSpot, Copper, …) | Deal Won / Stage Changed |
| Action | BriefGate | Create Intake |
Map the Create Intake fields from the deal:
| Create Intake field | Maps from |
|---|---|
| Project Name | Deal or company name |
| Client Email | Primary contact's email |
| Client Name | Primary contact's name |
| Client Language | Static, or a CRM field if you track it |
| Items | The items you always ask for at kickoff — see below |
| Due Date | Deal close date + your standard turnaround, or leave blank |
| Chase Schedule | default (Free plan) or gentle/aggressive on Solo and up |
Items are entered as a repeating block — one row per thing you need, each with a Key (stable identifier, e.g. logo), a Label (what the client sees, e.g. "Restaurant logo"), a Type (text, longtext, file, image, file_list, url, boolean, select, multiselect, color_list, structured, or secret), and whether it's Required. For a website kickoff that's typically something like:
logo— Image, requiredhero_copy— Long Text, requiredwp_admin— Secret, required (if you need a WordPress login — see the gotcha below)
Set Send Immediately to false if you'd rather review the intake before it emails the client — it's created as a draft, and you send it later from the BriefGate dashboard (the Zapier integration doesn't have a separate send action; only Create Intake and Send Reminder are actions today).
Zap 2: Completed intake → files in Drive
The goal: the moment a client finishes, every file they uploaded lands in the right Drive folder without anyone downloading and re-uploading it by hand.
| Step | App | Event |
|---|---|---|
| Trigger | BriefGate | Intake Completed |
| Search | BriefGate | Get Intake Results |
| Action | Google Drive | Upload File |
Intake Completed fires with intake_id, project_name, and a timestamp — no file content, just the signal that it's time to collect. Feed its intake_id into Get Intake Results' Intake field.
Get Intake Results always sends exclude_secrets=true under the hood — see the gotcha below — and returns a results object keyed by item key. A single file or image item (like logo) comes back as one object with a signed url (valid 24 hours), filename, mime, size, and checksum_sha256. Map Results Logo Url into the Google Drive step's File field; Zapier downloads the file from that URL automatically before uploading it.
A file_list item (like photos) comes back as an array of the same shape, so one Drive step can't consume it directly. Insert Looping by Zapier between the search and the Drive step, feed it Results Photos[]Url (and Results Photos[]Filename for the file name), and put the Drive upload inside the loop — one upload per photo.
Because the signed URL only lasts 24 hours, keep this Zap instant (Intake Completed already is) rather than batching it — don't add a Delay step in front of the Drive upload.
Zap 3: Client opened the portal → heads-up in Slack
The goal: know the moment a request actually reached the client, instead of wondering whether the email landed in spam.
| Step | App | Event |
|---|---|---|
| Trigger | BriefGate | Client Viewed Portal |
| Action | Slack | Send Channel Message |
Client Viewed Portal fires once, the first time the client opens their link — refreshing the page doesn't fire it again — with intake_id, project_name, and slug. It deliberately does not carry the portal link or the client's email; see the gotcha below. A simple message template:
👀 {{project_name}} — client just opened their intake portal.
Intake: {{intake_id}}If the team needs more than that (progress, due date, item statuses), chain in a Find Intake search on the same intake_id before the Slack step and pull in whatever fields you want from its result.
Zap 4: Overdue intake → one more nudge
The goal: a reminder goes out the moment a deadline slips, without you tracking due dates in a spreadsheet.
| Step | App | Event |
|---|---|---|
| Trigger | BriefGate | Intake Overdue |
| Action | BriefGate | Send Reminder |
Intake Overdue fires once per intake, the first time a periodic sweep notices the due date has passed with required items still outstanding — it carries intake_id, project_name, due_date, and outstanding_items. This is independent of the automatic reminder schedule; it exists to tell you, not the client, so pairing it with Send Reminder is what actually gets a message out.
Map the Send Reminder action's Intake field from the trigger's intake_id, and choose the Channel — Email (default) or SMS, if your plan has the SMS feature and credit. Send Reminder is capped at one manual reminder per intake per hour, and returns "Nothing to chase" if the intake was already completed between the trigger firing and the Zap running — both are worth a Filter step or an error path if you chain more steps after it.
Gotchas
- Secrets never reach Zap history. Get Intake Results always sends
exclude_secrets=true— asecretitem (a password or API key the client entered) is left out of the response entirely, withmetareportingsecret_unavailable: true, rather than being revealed and logged in a Zap run you can't un-log. Secret values are encrypted on the server with a libsodium sealed box before they're ever written to the database — never plaintext, and never "end-to-end" or "zero-knowledge," since BriefGate itself holds the decryption key. Read a secret from the BriefGate dashboard, where the one-time reveal is spent deliberately, not automatically. portal_urlalone doesn't open the portal. Create Intake's response includesportal_url, but the magic sign-in token that actually authenticates the client is never returned by the API — it only ever goes out in the invitation email. Don't build a Zap step that tries to construct a working client link fromportal_url; there isn't one to construct.- Triggers need
admin, actions and searches don't. If a Zap fails to turn on with a scope error, it's almost always this — the API key needs theadminscope for the webhook registration a trigger performs, not justintakes:read/intakes:write. - Free plan caps at one active intake and ten items. If you're testing this on a Free BriefGate account, Create Intake fails once you already have an active intake, and an intake with more than ten items is rejected — both return a
plan_requiredor validation error you'll see in the Zap's run history.
Related docs
- BriefGate for Zapier — connecting your account, full trigger/action/search reference
- Webhooks — event payloads, signing, retries (what's under the hood of every trigger here)
- REST API reference — the endpoints each Zapier step calls