customer.subscription.created webhook hits an n8n Stripe Trigger when a trial starts. n8n creates the subscriber in Kit, adds them to a behaviour-tagged sequence, and upserts a HubSpot contact. A second Stripe Trigger on customer.subscription.trial_will_end (fires 3 days out) flips a HubSpot deal stage and pings the AE. Activation events from the product API short-circuit the drip. Total infra: ₹430/month.
## Why This Matters Now (August 2025)
Stripe and Kit both shipped changes that made this cleaner. The Kit API v4 (the rebrand from ConvertKit) settled the subscriber-and-sequence endpoints we rely on. And n8n's Stripe Trigger now auto-registers the webhook with your Stripe account when you activate the workflow — no manual endpoint pasting in the Stripe dashboard. We tested this on n8n v1.62, self-hosted on a ₹740/month Hetzner CX22, in late July 2025.
The activation gap is the real problem, though. A trial that converts on day 11 of a 14-day window is a coin flip. Pull activation forward and the conversion math changes on its own.
## What You'll Need (Prerequisites)
- n8n v1.6x or newer (self-hosted or Cloud) with a public HTTPS URL for webhooks
- A Stripe account with at least one trialing subscription product
- A Kit (ConvertKit) account on a plan with API access and one sequence created
- A HubSpot account (free CRM tier works) with a private app token
- Your product's own "activation" event available via webhook or a polled API
- About 90 minutes, and a test customer you can push through Stripe test mode
X-Kit-Api-Key header. There's no official Kit node for every action, so we use the HTTP Request node with a Header Auth credential. Create a Header Auth credential named "Kit v4", header name X-Kit-Api-Key, value your key.
HubSpot: Create a private app in HubSpot (Settings → Integrations → Private Apps) with scopes crm.objects.contacts.write and crm.objects.deals.write. n8n's HubSpot node takes that token as an App Token credential.
customer.subscription.created. We filter inside n8n for subscriptions where status === 'trialing' so paid signups skip the drip.
Trigger B — trial about to end. A second Stripe Trigger on customer.subscription.trial_will_end. Per Stripe's webhook docs, this event fires three days before the trial period ends, which is exactly the window where a human nudge converts.
Here's Trigger A as exported node JSON:
{
"parameters": {
"events": ["customer.subscription.created"]
},
"id": "stripe-trigger-trial-start",
"name": "Stripe — Trial Started",
"type": "n8n-nodes-base.stripeTrigger",
"typeVersion": 1,
"position": [240, 300],
"credentials": {
"stripeApi": { "id": "1", "name": "Stripe account" }
}
}
The first node after the trigger is an IF node that drops anything not actually trialing:
{
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.data.object.status }}",
"operation": "equals",
"value2": "trialing"
}
]
}
},
"name": "IF — Is Trialing",
"type": "n8n-nodes-base.if",
"typeVersion": 1,
"position": [460, 300]
}
## How Do You Add a Trial User to a Kit Sequence in n8n?
Kit v4 has a rule: the subscriber must exist before you can add them to a sequence. So it's two HTTP Request calls — create, then enrol. Per the Kit sequences API, the enrol endpoint is POST /v4/sequences/{sequence_id}/subscribers.
The create-subscriber HTTP Request node, with the behaviour tag set from the Stripe plan:
{
"parameters": {
"method": "POST",
"url": "https://api.kit.com/v4/subscribers",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"email_address\": \"{{ $json.data.object.customer_email }}\",\n \"fields\": { \"plan\": \"{{ $json.data.object.items.data[0].price.nickname }}\", \"trial_start\": \"{{ $now.toISO() }}\" }\n}"
},
"name": "Kit — Create Subscriber",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [680, 220],
"credentials": {
"httpHeaderAuth": { "id": "2", "name": "Kit v4" }
}
}
Then the enrol call uses the sequence ID for the trial drip. We keyed three sequences off the plan tier so a ₹4,000/month trial gets a different cadence than a ₹40,000/month one. Behaviour beats the calendar, though — see the short-circuit below.
## What Drip Cadence Actually Converted?
The cadence matters less than people expect, but a few choices moved the needle. Here's the self-serve sequence we shipped, with the reasoning per email.
lifecyclestage of opportunity and stamp the trial end date as a custom property the AE can sort on.
{
"parameters": {
"resource": "contact",
"operation": "upsert",
"email": "={{ $json.data.object.customer_email }}",
"additionalFields": {
"lifecycleStage": "opportunity",
"customProperties": {
"customProperty": [
{ "property": "trial_plan", "value": "={{ $json.data.object.items.data[0].price.nickname }}" },
{ "property": "trial_end_date", "value": "={{ $json.data.object.trial_end }}" }
]
}
}
},
"name": "HubSpot — Upsert Contact",
"type": "n8n-nodes-base.hubspot",
"typeVersion": 2,
"position": [900, 220],
"credentials": {
"hubspotAppToken": { "id": "3", "name": "HubSpot App" }
}
}
## The Activation Short-Circuit (The Part That Actually Moved the Number)
Here's the unintuitive bit. The drip isn't the thing that cut activation to 3 days. The short-circuit is.
When the product fires its own "first workflow run" event, a small n8n webhook catches it, removes the subscriber from the nurture sequence in Kit, and moves the HubSpot deal straight to "activated." The drip stops nagging an activated user, and the AE sees a hot, self-served account a week earlier than before. Activated trials converted at 31% versus 11% for the calendar-only cohort.
{
"parameters": {
"method": "POST",
"url": "https://api.kit.com/v4/sequences/{{ $json.sequence_id }}/subscribers",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"jsonBody": "={ \"email_address\": \"{{ $json.email }}\" }"
},
"name": "Kit — Enrol in Sequence",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 5000,
"position": [1120, 220]
}
"We thought we had a conversion problem. We had a speed problem. Trials that touched real value in 3 days closed themselves."
trial_end=now. We use it as the trigger for the human sales handoff at T-minus-3.
### Why use Kit's HTTP Request node instead of a dedicated node?
Kit v4 endpoints (the rebrand from ConvertKit) move faster than n8n's bundled node updates. The HTTP Request node with a Header Auth credential using X-Kit-Api-Key hits any v4 endpoint directly, so you're never blocked waiting for node support.
### How do I stop the drip when a user activates?
Add a separate n8n webhook that your product calls on the activation event. It removes the subscriber from the Kit sequence and advances the HubSpot deal stage. This short-circuit is what cut median activation from 11 days to under 3 — the drip alone didn't.
### Is ₹430 a month really the full cost?
That's the incremental infra cost — a shared slice of one Hetzner CX22 running several workflows. Stripe webhooks are free, and Kit and HubSpot are subscriptions the client already paid for. n8n Cloud Starter is an alternative at roughly ₹2,000/month if you don't want to self-host.
### Can this work with Razorpay instead of Stripe?
Yes, with one change: Razorpay's subscription webhooks differ from Stripe's, so you swap the Stripe Trigger for a generic Webhook node and parse Razorpay's payload. We cover the Razorpay side in our payment-failed recovery workflow.
Want this trial-to-paid flow built on your stack?
We ship a working, self-hosted n8n onboarding workflow — Stripe or Razorpay, your email tool, your CRM — for Indian SaaS teams in 7 working days. Typical project: ₹55k–₹95k. Suitable if you sign 10+ trials a week and convert under 15%. No slides — just your funnel and our honest take.
Book a 20-min CallWritten by Hrishikesh Baidya, CTO at Softechinfra. Questions about your onboarding stack? Email contact@softechinfra.com.

