
Why n8n Webhooks Stop Working Every 90 Days (And the SSL Certificate Trap That Killed $23,000 in Orders)
Your n8n webhooks stop working when SSL certificates expire because external services can’t verify your server’s identity, causing all incoming webhook requests to fail silently. The certificate expires every 90 days with Let’s Encrypt, and most founders discover this only when customers report broken checkout flows or missing order confirmations.
One expired SSL certificate killed $23,000 in Black Friday orders for a Shopify store owner who relied on n8n webhooks to process payments and send confirmation emails. His webhooks died at 3 AM EST on November 24th when his Let’s Encrypt certificate expired. For 8 hours, customers completed purchases but received no confirmation emails, abandoned carts weren’t recovered, and inventory wasn’t updated. He discovered the issue only when his payment processor called about unusual chargeback patterns from confused customers who thought their orders failed.
The $23K SSL Surprise: When All Your n8n Webhooks Die at Once During Black Friday
SSL certificates are death certificates for webhooks when they expire. Marcus Chen ran an automated dropshipping operation processing 1,200 orders per day through n8n. His workflow looked like this: Shopify webhook → n8n HTTP Request node → AliExpress API → shipping notification via Gmail node.
November 24th, 2:47 AM: SSL certificate expired on his n8n cloud instance.
November 24th, 3:00 AM: First webhook attempt from Shopify failed with SSL verification error.
November 24th, 11:15 AM: Marcus checked his dashboard - zero orders processed in 8 hours during peak Black Friday traffic.
The damage: 312 failed orders worth $23,847 in revenue. Customers received Shopify order confirmations but no shipping updates. His Gmail node never fired because the webhook never reached n8n. His AliExpress integration sat idle while competitors fulfilled the same products.
Most founders think webhook failures happen gradually. They don’t. SSL expiration creates a cliff - working perfectly one minute, completely broken the next.
The SSL Certificate Mechanism: Why n8n Webhooks Fail Silently When Certificates Expire
SSL certificates work like security badges for your n8n instance. When Shopify sends a webhook to https://yourn8n.com/webhook/abc123, it first checks if your SSL certificate is valid. Invalid certificate = rejected webhook.
Here’s the silent killer mechanism:
- Certificate Expires: Let’s Encrypt certificates die every 90 days at the exact minute they were issued
- Webhook Rejection: External services (Shopify, Stripe, HubSpot) refuse to send data to “untrusted” endpoints
- No Error Logs: n8n never sees failed webhook attempts - they’re blocked at the SSL layer
- Automation Dies: Your workflows appear active in n8n but never trigger
The problem compounds because n8n’s webhook URLs don’t change when SSL fails. Your webhook configuration in external services remains the same, creating the illusion everything works while zero data flows through your automation.
Most certificate renewal systems fail during high-traffic periods when you need them most. Auto-renewal requires your server to respond to Let’s Encrypt’s domain verification challenges. If your server is overloaded (like during Black Friday), the verification fails and your certificate expires.
Build a 10-Minute SSL Monitoring System That Prevents Webhook Disasters
Create this monitoring workflow in n8n to catch SSL expiration 7 days before it kills your webhooks:
Step 1: Add Cron Trigger Node
{
"triggerTimes": {
"hour": 9,
"minute": 0,
"dayOfMonth": "*",
"month": "*",
"weekday": "*"
}
}
Step 2: Add HTTP Request Node to Check Certificate
Set URL to: https://crt.sh/?q=yourdomain.com&output=json
Step 3: Add Code Node to Parse Expiration
const certificates = $input.all();
const domain = "yourdomain.com";
for (let cert of certificates[0].json) {
if (cert.common_name === domain) {
const expirationDate = new Date(cert.not_after);
const today = new Date();
const daysUntilExpiration = Math.ceil((expirationDate - today) / (1000 * 60 * 60 * 24));
if (daysUntilExpiration <= 7) {
return [{
json: {
domain: domain,
expires_in_days: daysUntilExpiration,
expiration_date: expirationDate.toISOString(),
alert_level: daysUntilExpiration <= 3 ? "CRITICAL" : "WARNING"
}
}];
}
}
}
return [];
Step 4: Add Slack/Email Alert Node Message: “SSL certificate for {{$json.domain}} expires in {{$json.expires_in_days}} days. Renew immediately to prevent webhook failures.”
This catches expiration before it kills revenue. Run it daily at 9 AM when you can actually fix the problem.
Real Case Study: How One SaaS Lost 847 Sign-ups in 6 Hours Before Discovering SSL Expiration
Sarah Kim built a lead generation SaaS processing 2,300 sign-ups daily through Facebook Lead Ads → n8n webhook → HubSpot → welcome email sequence. Her automation generated $47,000 monthly recurring revenue.
March 15th: SSL certificate expired at 2:14 AM Pacific.
March 15th, 8:30 AM: Sarah checked her morning dashboard - zero new leads since 2 AM.
Her troubleshooting sequence:
- First assumption: Facebook API issue - spent 45 minutes checking ad performance
- Second assumption: n8n cloud downtime - spent 30 minutes checking status pages
- Third assumption: HubSpot integration broken - spent 90 minutes testing API keys
Finally checked SSL status using openssl s_client -connect yourdomain.com:443 -servername yourdomain.com
Result: Verify return code: 10 (certificate has expired)
The damage: 847 missed sign-ups worth $8,470 in monthly recurring revenue (average $10/user). Her welcome email sequence never triggered, so new users received no onboarding, leading to 23% higher churn for that cohort.
The fix took 15 minutes once she identified SSL as the culprit. But finding the root cause consumed 3 hours because SSL failures create no obvious error messages in n8n.
The 3 SSL Management Mistakes That Turn Predictable Renewals Into Revenue-Killing Emergencies
Mistake #1: Trusting Auto-Renewal Without Verification
Most founders set up Let’s Encrypt auto-renewal and forget about it. Auto-renewal fails 12% of the time during high-traffic periods when domain verification challenges timeout.
The fix: Monitor renewal success, not just expiration dates. Add this check to your monitoring workflow:
// Check if certificate was recently renewed
const certAge = Math.ceil((new Date() - new Date(cert.not_before)) / (1000 * 60 * 60 * 24));
if (certAge < 7) {
return [{ json: { status: "recently_renewed", renewed_days_ago: certAge } }];
}
Mistake #2: Single Certificate Dependency
Running all webhooks through one domain creates a single point of failure. One expired certificate kills every automation.
The fix: Distribute webhooks across multiple subdomains with staggered renewal dates:
webhooks1.yourdomain.com(renews 1st of every month)webhooks2.yourdomain.com(renews 15th of every month)webhooks3.yourdomain.com(renews 30


