Kit new subscriber notifications on your phone.

Get a low-priority push notification when someone subscribes to your Kit newsletter, with a single summary push for bulk imports.

How it works

Three steps to your first push

STEP 01

Install the recipe

One click in Studio gives you a personal webhook URL.

STEP 02

Paste your URL into Kit

Add it as a webhook for Subscriber activated.

STEP 03

Get a push on your phone

With the text, sound and buttons from the recipe.

Setup

How to set up the Kit subscriber activated webhook

  1. Click Install in Studio and sign in. The recipe is added to your account and you get a personal webhook URL.
  2. In Kit, open app.kit.com/webhooks and create a webhook endpoint.
  3. Paste your webhook URL as the URL.https://••••••••/•••••••• your personal URL, shown after install
  4. Subscribe it to Subscriber activated only and save.
  5. Subscribe the endpoint to **one** of these, not several, or you'll get two pushes for the same person:
  6. `subscriber.activated` (recommended): fires once the subscriber is active, so after they confirm when double opt-in is on.
  7. `subscriber.subscribed_to_form`: fires when someone joins a form, and the push names the form. Handy if you only care about one signup form's traffic.
  8. `subscriber.created`: fires as soon as a subscriber is added, before any confirmation; the push says "(not confirmed yet)" when they aren't active.
  9. You can also create the endpoint through the API:
  10. ```bash
  11. curl -X POST https://api.kit.com/v4/webhook_endpoints \
  12. -H "X-Kit-Api-Key: <your-api-key>" \
  13. -H "Content-Type: application/json" \
  14. -d '{ "url": "your webhook URL", "events": ["subscriber.activated"] }'
  15. ```
  16. Kit signs each delivery (`X-Kit-Signature`), but JustPush doesn't check that signature yet, so keep your endpoint URL private. Webhooks need a Kit plan with API access.
The code

What runs when the webhook arrives

Studio calls handleRequest(request) with the incoming webhook and sends the message it returns. It's yours after install; change anything.

transform.js
1// Kit → subscriber.activated (new subscriber)
2// Fires when a subscriber becomes active in Kit, i.e. they joined and (with double
3// opt-in) confirmed. Also accepts subscriber.created and subscriber.subscribed_to_form.
4// Docs: https://developers.kit.com/webhooks/event-types
5//
6// Kit's webhook endpoints send { delivery_id, events: [ … ] } with up to 100 events of
7// one type per delivery. Legacy webhooks (/v4/webhooks) send a bare { subscriber: { … } }.
8
9// Event types this recipe turns into a push.
10const TYPES = new Set(["subscriber.activated", "subscriber.created", "subscriber.subscribed_to_form"])
11
12// Kit sends plain strings; treat blanks as missing.
13function text(value) {
14 return typeof value === "string" && value.trim() ? value.trim() : null
15}
16
17// "Ada ([email protected])", or whichever half is there.
18function describe(subscriber) {
19 const name = text(subscriber?.first_name)
20 const email = text(subscriber?.email_address)
21 return name && email ? `${name} (${email})` : name || email || "Someone"
22}
23
24function handleRequest(request) {
25 const body = request.body && typeof request.body === "object" ? request.body : {}
26
27 let events
28 if (Array.isArray(body.events)) {
29 // Webhook endpoints: every event in a delivery has the same type.
30 events = body.events.filter((e) => TYPES.has(e?.type) && e.data?.subscriber)
31 } else if (body.subscriber && typeof body.subscriber === "object" && body.subscriber.state === "active") {
32 // Legacy webhooks carry no event name; an active subscriber is the best signal.
33 events = [{ type: "legacy", data: { subscriber: body.subscriber } }]
34 } else {
35 events = []
36 }
37
38 // Guard: nothing this recipe handles, e.g. an unsubscribe or a tag event.
39 if (!events.length) {
40 console.log(`Ignoring Kit "${body.events?.[0]?.type ?? "unknown"}" delivery`)
41 return null
42 }
43
44 // A bulk import arrives batched: one push that sums it up.
45 if (events.length > 1) {
46 const names = events.slice(0, 3).map((e) => text(e.data.subscriber.email_address) ?? "someone")
47 const more = events.length - names.length
48 return {
49 title: `📬 ${events.length} new subscribers`,
50 message: names.join(", ") + (more > 0 ? ` and ${more} more` : ""),
51 topic: "Kit",
52 priority: -1, // Low — good news, nothing to do
53 }
54 }
55
56 const { type, data } = events[0]
57 const form = text(data.form?.name)
58 // subscriber.created can fire before a double opt-in confirmation.
59 const pending = type === "subscriber.created" && data.subscriber.state && data.subscriber.state !== "active"
60
61 return {
62 title: "📬 New subscriber",
63 message: describe(data.subscriber) + (form ? ` joined via ${form}` : " subscribed") + (pending ? " (not confirmed yet)" : ""),
64 topic: "Kit",
65 priority: -1, // Low — good news, nothing to do
66 }
67}
Payload

The Kit subscriber.activated webhook

This is what Kit sends to your URL for subscriber activated. It is a sample, trimmed to the fields recipes use.

subscriber.activated · sample.json
1{
2 "events": [
3 {
4 "id": "9c2e1f3a-6b7d-4e8f-a1b2-c3d4e5f60718",
5 "data": {
6 "subscriber": {
7 "id": 987654,
8 "state": "active",
9 "fields": {
10 "company": "Example Ltd"
11 },
12 "created_at": "2026-09-29T09:30:02Z",
13 "first_name": "Ada",
14 "email_address": "[email protected]"
15 }
16 },
17 "type": "subscriber.activated",
18 "created": "2026-09-29T09:32:10Z"
19 }
20 ],
21 "delivery_id": 123456
22}
FAQ

Kit new subscriber notifications: questions

Does this work on iPhone and Android?

Yes. Install the JustPush app from the App Store or Google Play and sign in. Every phone signed in to your account gets the notification.

Do I need to write code?

No. Install the recipe in Studio, paste your webhook URL into Kit and you are done. The code is there if you want to change the text, the sound or the buttons.

Can I change what the notification says?

Yes. After install the recipe's code is yours. Edit it in Studio and test it against the sample payload before you save.

What does it cost?

JustPush is free for 30 days. After that it's $19.99 a year, or $39.99 once. There is no extra charge for recipes.

Ready when you are

Kit on your phone in two minutes.

Install the recipe, paste one URL, done. Free for 30 days, no credit card required.