Connect the Client Intake Webhook

Sell through your own checkout, a CRM, or a course platform? The client intake webhook lets that system hand new buyers straight to Carrot. Every valid post creates a client account under your agency and emails that person an invite — the same result as running the Add Client wizard yourself, without anyone on your team touching the agency panel.

🔒 Owner/admin-only. Enabling the webhook, viewing the secret, and regenerating it are limited to agency owners and admins.

What enabling this means

Be clear about what you're switching on:

  • Every valid post creates a client under your agency (an agency-owned client, like the wizard's "have the client set it up" path).
  • That person is emailed an invite to join their new account right away.
  • Any site they take live bills to your agency subscription like any other client site. Draft sites are free; billing starts when a site connects a domain.
  • Each webhook-created client also adds one slot to your agency's unmapped-site pool, so hands-off intake never blocks a buyer from starting their first draft site.

Find your webhook URL and secret

  1. In your agency dashboard, go to Settings → Integrations.
  2. Click Enable on the Client intake webhook card. Carrot generates your secret the first time you enable.
  3. Copy the Webhook URL and the Secret shown on the card.

Turning the integration off is instant and reversible — posts are rejected while it's off, and turning it back on keeps the same secret unless you choose Regenerate secret. Regenerating retires the old secret immediately, so update every connected system when you rotate.

What to send

Make an HTTP POST to your webhook URL with three fields (form-encoded or JSON), all required:

  • token — your webhook secret.
  • client_name — the buyer's business or personal name; becomes the client account name.
  • client_email — where the invite is sent.

Example with curl:

curl -X POST "https://<your webhook URL>" \
  -H "Content-Type: application/json" \
  -d '{"token": "<your secret>", "client_name": "Acme Real Estate", "client_email": "buyer@example.com"}'

What comes back

Success — a new client was created (HTTP 201):

{ "status": "created", "clientAccountId": 12345 }

Repeat post — that email already has a client under your agency (HTTP 200):

{ "status": "already_exists", "clientAccountId": 12345 }

Repeat posts are safe: the same buyer never gets two accounts, and no duplicate invite is sent. That means your automation can retry freely.

Rejections:

  • 401 Unauthorized — missing or wrong secret. Check the token field against Settings → Integrations (did someone regenerate it?).
  • 403 Forbidden — the integration is turned off. Re-enable it in Settings → Integrations.
  • 404 Not Found — wrong webhook URL. Re-copy the URL from Settings → Integrations.
  • 409 Conflict — another post for your agency is mid-flight (a simultaneous retry, usually). Retry in a few seconds; if that buyer was already created you'll get already_exists back.
  • 422 Unprocessable — missing or invalid client_name / client_email. Fix the field named in the error message.
  • 429 Too Many Requests — daily intake cap reached. Resumes tomorrow; contact support if you legitimately need more.

Connect from Zapier

  1. Add an action step: Webhooks by Zapier → POST.
  2. URL: paste your webhook URL.
  3. Payload Type: json.
  4. Data: add token (your secret), client_name, and client_email, mapping name and email from your trigger step (e.g. the purchase).
  5. Test the step — a 201 with "status": "created" means it worked.

Connect from Make

  1. Add an HTTP → Make a request module.
  2. URL: your webhook URL. Method: POST. Body type: Raw, content type JSON (application/json).
  3. Request content: {"token": "<secret>", "client_name": "{{name}}", "client_email": "{{email}}"} with the mapped fields from your scenario.
  4. Run once to confirm a 201 response.

Connect from n8n

  1. Add an HTTP Request node. Method: POST, URL: your webhook URL.
  2. Body Content Type: JSON, and add token, client_name, client_email parameters mapped from the incoming data.
  3. Execute the node and check for "status": "created".

What the buyer experiences

The moment your system posts, the buyer gets a Carrot invite email at the address you sent. Clicking it lets them set a password and land in their new account, which lives under your agency — you'll see them in your Clients list immediately, and they can start building their first site right away. When that site goes live on a domain, it bills to your agency like any other client site.

Frequently asked questions

Does the same buyer buying twice create two accounts? No. A repeat post for an email that already has a client under your agency returns already_exists with the existing account's id, and nothing else happens.

Does the webhook count against the daily invite limit my team sees in the wizard? No. Webhook intake has its own, much higher daily cap, so a launch day can't be blocked by your team's manual invites (or vice versa).

What happens if I regenerate the secret? The old secret stops working immediately and posts using it get a 401. Clients already created are unaffected. Update Zapier/Make/n8n (and anything else posting) with the new secret.

Can I use this to connect a client who already has their own Carrot account? No — the webhook only creates agency-owned clients. To connect a client-owned account, use the Add Client flow's invite or agency-code options.

Was this article helpful?