How to Automate Stripe Renewal Due in 30 Days → Auto Email Sequence + Slack with n8n

If you run a subscription business on Stripe, the renewal that hurts most is the one nobody saw coming. A card silently fails, a customer forgets they were even paying, or a big annual plan lapses bec

How to Automate Stripe Renewal Due in 30 Days → Auto Email Sequence + Slack with n8n

If you run a subscription business on Stripe, the renewal that hurts most is the one nobody saw coming. A card silently fails, a customer forgets they were even paying, or a big annual plan lapses because no human flagged it in time. Involuntary churn and surprise cancellations aren't a pricing problem — they're a timing problem. This article shows you how to build an automated 30-day renewal pipeline in n8n that catches every upcoming Stripe renewal, warms the customer with an email sequence, and drops a clean summary into Slack so your team is never blindsided.

The problem: renewals happen in silence

Stripe is excellent at charging cards. It is not designed to prepare anyone — customer or team — for the charge that's coming. By default, the first time most people learn about a renewal is the receipt email after money has moved. For monthly plans that's tolerable. For annual plans at $500, $2,000, or $20,000 it's a support ticket, a chargeback, or a lost account waiting to happen.

The 30-day window matters because it's the last point where you can still influence the outcome. Thirty days out, you can confirm the card on file is valid, remind the customer of the value they've received, and give your success team time to reach out to strategic accounts before an auto-charge turns into an angry email. Miss that window and you're doing damage control instead of retention.

Doing this manually means someone exports Stripe subscriptions into a spreadsheet, sorts by renewal date, and pings customers one by one. It works until you have more than a handful of accounts — then it silently stops happening. Automation is the only version of this that survives contact with a growing customer base.

The solution: a 30-day renewal radar in n8n

The workflow does one job on a schedule: find every subscription whose renewal lands roughly 30 days from now, and act on each one. Conceptually it runs like this:

  • Trigger daily — check for subscriptions crossing the 30-day mark today.
  • Pull subscriptions from Stripe — filter to active plans renewing in the target window.
  • Branch per customer — send a heads-up notice now, schedule a reminder closer to the date.
  • Notify the team in Slack — one consolidated summary of everything renewing, with amounts and dates.

Because n8n runs it every day, "30 days out" is a rolling window — each customer gets caught exactly once, on the day they first enter the 30-day zone. No spreadsheet, no cron script to babysit, no missed accounts.

Step-by-step setup in n8n

Here's how the nodes wire together. You'll need your Stripe API key, an email sender (SMTP, SendGrid, or the native Gmail node), and a Slack app with a bot token.

1. Schedule Trigger. Add a Schedule Trigger node set to run once daily, ideally early morning (e.g. 07:00) so the Slack summary lands before your team starts. Interval: every day at a fixed hour.

2. Get subscriptions from Stripe. Use the HTTP Request node (Stripe's n8n node doesn't expose every subscription filter cleanly). Configure:

  • Method: GET, URL: https://api.stripe.com/v1/subscriptions
  • Authentication: Predefined Credential Type → Stripe API, or a Header Auth credential with Authorization: Bearer sk_live_...
  • Query parameters: status=active, limit=100, and enable pagination so you pull every page. Add expand[]=data.customer to get the customer email and name in the same call.

Stripe returns each subscription's current_period_end as a Unix timestamp — this is the renewal date you'll filter on.

3. Filter to the 30-day window. Add a Code node (or a Filter node) to keep only subscriptions renewing in the target window. In a Code node:

const now = Math.floor(Date.now() / 1000);
const target = now + 30 * 24 * 60 * 60;      // 30 days ahead
const lo = target - 12 * 60 * 60;            // ±12h band = "today's" cohort
const hi = target + 12 * 60 * 60;
return items.filter(i =>
  i.json.current_period_end >= lo &&
  i.json.current_period_end <= hi &&
  !i.json.cancel_at_period_end               // skip already-cancelling subs
);

The ±12-hour band ensures each subscription is caught exactly once, on the single day it's 30 days out — not every day for a month.

4. Send the renewal notice. Add your email node (Send Email / Gmail / SendGrid). Map the recipient from {{$json.customer.email}}. Write a plain, value-first message: what plan renews, the amount ({{$json.items.data[0].price.unit_amount / 100}}), the date, and a one-click link to update their card or manage the subscription (a Stripe Billing Portal link is ideal). Keep it human — this is a courtesy, not a dunning notice.

5. Schedule the reminder. For the second touch closer to the renewal, add a Wait node set to resume at a specific date — e.g. current_period_end minus 3 days. n8n will hold each item and release it at the right moment, then flow into a second email node with a tighter "renews in 3 days" message. If you prefer to keep the workflow stateless, skip the Wait node and instead add a second filter branch for the 3-day cohort that the same daily run catches.

6. Post the Slack summary. After the email branch, collect all filtered items and add a Slack node (Send Message). Aggregate the day's renewals into one message with an Item Lists or Code node that builds a block of lines like • Acme Corp — Pro Annual — $2,400 — renews May 14. Post it to a #revenue or #renewals channel. Include the total dollar value renewing so the team sees the stakes at a glance.

Configuration details that matter

A few settings separate a demo from something you'll actually trust with revenue:

  • Pagination is not optional. Stripe caps limit at 100. Once you cross 100 active subscriptions, an unpaginated call silently misses accounts. Use n8n's built-in pagination on the HTTP Request node, following has_more and starting_after.
  • Expand the customer object. Without expand[]=data.customer you only get a customer ID and have to make a second API call per subscription. Expanding inline keeps the workflow fast and cheap.
  • Handle multi-item subscriptions. A subscription can contain several line items. Sum items.data[].price.unit_amount * quantity rather than reading the first item, or your amounts will be wrong for bundled plans.
  • Use idempotency where you write. If you later add a step that tags the subscription in Stripe or your CRM, guard it so a re-run doesn't double-process.
  • Time zones. Stripe timestamps are UTC. Set your Schedule Trigger and any date math with that in mind so "30 days" means the same thing every day.

The payoff: retention on autopilot

Once this is live, three things change immediately. First, involuntary churn drops — customers with an expiring or failing card get a nudge while there's still time to fix it, instead of discovering the problem via a declined charge. Second, your success team gets lead time — the daily Slack summary turns renewals from a surprise into a plannable pipeline, so high-value accounts get a personal touch before the auto-charge. Third, the whole process becomes invisible infrastructure — it runs every morning whether or not anyone remembers it exists.

For a busy founder or ops lead, the real win is leverage: you built the renewal-handling capacity of a dedicated coordinator in an afternoon, and it scales from 10 customers to 10,000 without a single extra hour of work.

Common pitfalls to avoid

  • Sending on every daily run. The number one bug: forgetting the ±12h band and emailing the same customer for 30 straight days. Filter to a single day's cohort.
  • Ignoring cancel_at_period_end. Subscriptions already set to cancel shouldn't get a "your renewal is coming" email — it reads as either tone-deaf or a mistake. Filter them out.
  • Trusting the first page of results. As covered above, no pagination = silently missed renewals, and you won't notice until a big account churns.
  • Hardcoding amounts. Read the live unit_amount and currency from Stripe. Plans change; a hardcoded "$29" in the email eventually becomes wrong.
  • No error path. Add an Error Trigger workflow or a Slack alert on failure. A renewal radar that silently breaks is worse than none, because you'll assume it's running.
  • Skipping a test in Stripe test mode. Use a test key and a fake subscription with a near-term period end to confirm the emails and Slack message fire correctly before pointing it at live data.

Get those six things right and you have a renewal system that quietly protects revenue every single day — no spreadsheet, no missed accounts, no surprises.

Stripe Renewal Due in 30 Days → Auto Email Sequence + Slack
PRONTO PARA USAR

Ja construimos isso pra voce

Nao comece do zero. O Stripe Renewal Due in 30 Days → Auto Email Sequence + Slack e um workflow n8n pronto para instalar — conecta suas ferramentas em minutos, sem codigo.

Instalar por $29 →