DocsHooks and notifications
Hooks and notifications
A hook tells your team which new leads to call first. It watches every new lead, and when one has all of the hook's marks, the lead is hooked: your team is told in Jellyhook, and in Slack or a webhook if you choose.
When you would use it
Say you have a mark "Pricing reader" and another "Came back". A lead who has both is worth a call today. You make a hook with those two marks, tell your sales colleague, and send it to #sales in Slack too. The next lead who sends the form with both marks is hooked: it shows up in Hooked leads, in their notifications and in #sales a few seconds later.
The Hooks page
Hooks in the sidebar, with a yellow circle showing how many leads your hooks caught that you have not looked at yet. Two tabs:
Hooked leads
Every lead one of your hooks caught, newest first, with the hooks that caught it. Click one to open the lead. Opening this tab clears the yellow circle.
Hooks
Every hook on the site, with its marks, who it tells and where. Add hook opens the editor. Each hook has a Live / Paused button: a paused hook catches nothing until it is live again. The editor has the hook's name at the top (New hook until you change it) and these rows:
| Row | What it does |
|---|---|
| Lead marks | One or more of your marks. The lead must have all of them. Marks shared by teammates can be picked after Copy to my marks. |
| Notify | All (every member, the default) or Custom (the members you pick). Picking people is how you hand a kind of lead to someone. |
| Message | A Subject and a message. Left empty, the message reads {lead} matched {marks}. {lead} is the lead's name in Jellyhook and "a new lead" outside it. {marks} is the mark names. |
| Notification method | In app (always on) and any Slack channels and webhooks you click. A channel that is not picked is shown dimmed. |
| Slack message | Shown once a Slack channel is picked. Customize chooses what the Slack message shows, with a preview and Send a test to Slack. See The Slack message below. |
| Same visitor again | Notify once a day (default) or every time, when one visitor sends several forms that match. |
| Add lead to group (optional) | Also puts every lead this hook catches into a group. |
The Slack message
Every Slack message has the hook's subject and message. Under Slack message → Customize you choose what else it shows:
| Part | What it shows | Shown when |
|---|---|---|
| Where they came from | "Came from: Meta · Ads · Spring sale · 2026 Core Demo Video": the source, campaign and ad the lead is credited to (see Acquisition) | The lead's visits are known. A lead who only ever came directly reads "Direct" |
| The ad's thumbnail | The ad's image, large | The ad has a thumbnail in Acquisition → Ads |
| Watch the ad button | Opens the ad's video | The ad has a video link in Acquisition → Ads |
| Open the lead button | Opens the lead in Jellyhook, or its HubSpot contact when HubSpot is connected (Open the lead in: HubSpot, Jellyhook or both) | Always |
| Hook, site and time | A small line under the message | Always |
| Sent late | "Sent 54 minutes late. Jellyhook was busy when this form came in. The form was sent ...", right under the message, so nobody calls a lead believing the form was just sent | The message goes out more than 2 minutes after the form. Always on |
| Visit summary | What they did in the visit with the form, before sending it: Short, Moderate (the default) or Long, as on the lead page. A form they started and left unsent is always said, with the field they left it at | Set to anything but Off |
| Earlier visits | The visits before the one with the form: when they first saw the site, how many visits and how long, then one line per visit (the last 4) with its key events: a form left unsent and the field, or a long time on one heading. "Oct 9: 5m 50s, mostly /pricing. Spent 2m 40s on "Enterprise" on /pricing. Started the form on /contact and left it at the "phone" field." | Ticked (off by default), and the lead had earlier visits |
| Page summaries | Up to 3 pages you pick, one line each: "/pricing: 3m 10s over 2 views in 2 visits; read up to 72% of the page ...", or "Page not visited" | At least one page is picked |
- A new hook shows every part, with the Moderate visit summary and no page summaries. Hooks made before the summary existed send the Moderate summary too. The choice is saved with the hook and applies to every Slack channel it sends to.
- The preview next to the options is drawn from the exact message Slack receives. It uses your newest ad that has a thumbnail (or an example ad) and an example visit.
- Send a test to Slack sends the message, as the hook would send it now, to the Slack channels picked in it. The message says "a new lead" and the summaries are made from your site's newest lead. It works before the hook is saved.
- Webhooks always receive every field that was made for the hook, whatever is shown in Slack, including
previous_visitswhen Earlier visits is ticked. Every lead a hook catches is sent to each webhook picked in that hook, so a webhook can start an automation in Zapier, Make, n8n or your CRM.
Visit summary and page summaries
- Both are made once, when the hook catches the lead, and cover what they did before sending the form. The visit with the form is cut at the form, so time spent on the site after sending it is not included.
- The tracker sends the form page's heading times and scroll with the form, so that page is complete at that moment, before the visitor leaves it. A site still running an older copy of the tracker (cached in a visitor's browser) shows the form page's time without its headings.
- Page summaries read every visit of the lead up to the form, or only the visit with the form, as chosen in the hook. A page they did not open reads "Page not visited" (or "Page not visited in this visit"). /pricing and /pricing/ are the same page.
- The message never waits long for them: if they cannot be made within 2.5 seconds, or the visit cannot be read, the message is sent without them. If Slack refuses the full message (for example an ad image it cannot load), it is sent once more as a plain message: subject, message, where they came from and Open the lead.
The Integrations page
Integrations in the sidebar: where hooks can send outside Jellyhook, and HubSpot under CRM (see HubSpot). Channels: Slack (Connect opens Slack's own screen to pick a channel; a webhook URL can be pasted instead) or Webhook (any https address, for example Zapier, Make or your CRM). A channel that keeps failing is marked "Failing" with the last error.
The Notifications page
A red dot (never a number) on Notifications in the sidebar while anything there is unread.
- From Jellyhook: updates from us about the product. In the app only, never in Slack.
- Your inbox: one entry for every lead a hook caught for you. Click one to open the lead; Mark all as read marks them all.
What it needs
- At least one mark of your own that is switched on. Make one on the Leads page.
- A new form submission. Hooks are checked when the form is sent and again when that visit ends. Leads from before the hook existed are not caught.
- Only an owner or admin of the site can connect or remove integrations. Anyone on the site can make hooks.
How it works
- When a form is sent, the lead is queued for its site. Each site's leads are checked in order, so one busy site does not slow another.
- The lead's marks are worked out, then every live hook is compared with them. A hook catches the lead when it has all of the hook's marks.
- By default the same visitor is caught by the same hook at most once in 24 hours, so a visitor who sends three forms in a row makes one notification, not three. Each hook can change this under Same visitor again: Notify once a day (the default) or Notify every time, which is useful for testing. The lead still gets its marks and group when a notification is held back.
- Slack and webhook messages that fail are tried again later (after 30 seconds, 2 minutes, 10 minutes, 1 hour, 3 hours).
What is sent outside Jellyhook
Slack and webhook messages carry the hook's subject, the message with "a new lead" in place of the name, the mark names, the site and a link to the lead, and, unless switched off for Slack, where the lead came from: the source, campaign and ad, with the ad's tag, thumbnail and video link from Acquisition → Ads. When the hook has them, they also carry the visit summary and page summaries: page addresses, heading texts from your site and times. The link only opens for people signed in to the site. The lead's name, email, form answers and the conditions inside a mark are never sent.
Webhook requests are signed. When you add a webhook you get a signing secret once. Each request has a header X-Jellyhook-Signature: t=<seconds>,v1=<hex>, where the hex is HMAC-SHA256 of <t>.<raw body> with that secret. Check it, and reject requests whose time is old.
When it is empty or looks wrong
- "No hooks yet." Make one with Add hook.
- A mark on a hook is shown in red: it is off or was deleted, and the hook is paused until you turn it on or replace it.
- No hooked lead you expected: check that the lead has every mark of the hook, that the hook is Live, and that the same visitor was not caught by it in the last 24 hours (see Same visitor again; testing from one browser needs a new private window each time, or Notify every time).
- "Hooks are not set up on this database yet": the site's database is missing the tables.
Limits
- 10 hooks per person per site, and up to 10 marks in one hook.
- 500 Slack and webhook messages per site per day. In-app notifications are not capped.
- Marks connected to a published mark cannot be used in a hook. Use a copy.
- No email or SMS yet. A hook needs all of its marks (no "any of these").
