search
Tutorials

Fix: Stripe webhook not triggering error

Quick fix for 'Stripe webhook not triggering' error. Learn how to properly configure and debug Stripe webhook endpoints.

person By Gautam Sharma
calendar_today January 8, 2026
schedule 3 min read
Stripe Webhooks API Error Fix Payment Processing

The ‘Stripe webhook not triggering’ error occurs when Stripe cannot successfully send webhook events to your endpoint due to configuration, network, or implementation issues.


How the Error Happens

❌ Error Scenario:

// ❌ This won't trigger webhooks properly
app.post('/stripe-webhook', (req, res) => {
  // ❌ Missing express.raw() - body will be parsed incorrectly
  console.log(req.body); // ❌ Will be empty or malformed
  res.status(200).send('OK'); // ❌ Stripe may retry due to parsing issues
});

✅ Quick Fix - Proper Webhook Configuration

Solution 1: Correct Body Parsing

// ✅ Proper body parsing for Stripe webhooks
const express = require('express');
const stripe = require('stripe')('sk_test_...');

const app = express();

// ✅ Use express.raw() for Stripe webhooks
app.post('/webhook', express.raw({type: 'application/json'}), (req, res) => {
  const sig = req.headers['stripe-signature'];
  const endpointSecret = 'whsec_...'; // ✅ Your webhook signing secret

  let event;

  try {
    // ✅ Verify signature and construct event
    event = stripe.webhooks.constructEvent(req.body, sig, endpointSecret);
  } catch (err) {
    console.log(`Webhook signature verification failed: ${err.message}`);
    return res.status(400).send(`Webhook Error: ${err.message}`);
  }

  // ✅ Process the event
  switch (event.type) {
    case 'payment_intent.succeeded':
      const paymentIntent = event.data.object;
      console.log('Payment succeeded!', paymentIntent.id);
      break;
    case 'customer.subscription.created':
      const subscription = event.data.object;
      console.log('Subscription created!', subscription.id);
      break;
    default:
      console.log(`Unhandled event type ${event.type}`);
  }

  // ✅ Return 200 to acknowledge receipt
  res.status(200).send('OK');
});

Solution 2: HTTPS and Public Endpoint

// ✅ Ensure your endpoint is accessible via HTTPS
// For development, use ngrok:
// ngrok http 3000
// Then use the HTTPS URL: https://xxxx-xx-xxx-xxx-xx.ngrok.io/webhook

const app = express();
app.use(express.raw({type: 'application/json'}));

app.post('/webhook', (req, res) => {
  // ✅ Process webhook event
  const sig = req.headers['stripe-signature'];
  const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET;

  try {
    const event = stripe.webhooks.constructEvent(req.body, sig, endpointSecret);
    
    // ✅ Handle event
    handleStripeEvent(event);
    
    // ✅ Always respond with 200
    res.status(200).send('OK');
  } catch (err) {
    console.error('Webhook error:', err.message);
    res.status(400).send(`Webhook Error: ${err.message}`);
  }
});

function handleStripeEvent(event) {
  // ✅ Process different event types
  console.log(`Processing event: ${event.type}`);
}

Solution 3: Stripe Dashboard Configuration

// ✅ Example webhook endpoint registration
// In your deployment script or setup:
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);

// ✅ Create webhook endpoint in Stripe (one-time setup)
async function createWebhookEndpoint() {
  try {
    const webhookEndpoint = await stripe.webhooks.create({
      url: 'https://yourdomain.com/webhook', // ✅ HTTPS URL
      enabled_events: [
        'payment_intent.succeeded',
        'payment_intent.payment_failed',
        'customer.subscription.created',
        'customer.subscription.deleted'
      ],
      api_version: '2023-10-16', // ✅ Use latest API version
    });
    
    console.log('Webhook endpoint created:', webhookEndpoint.id);
    // ✅ Save webhookEndpoint.secret to environment variables
  } catch (error) {
    console.error('Error creating webhook endpoint:', error);
  }
}

Solution 4: Testing and Debugging

// ✅ Stripe CLI for local testing
// Install: stripe login
// Listen: stripe listen --forward-to localhost:3000/webhook

// ✅ Add logging for debugging
app.post('/webhook', express.raw({type: 'application/json'}), (req, res) => {
  console.log('Webhook received:', {
    headers: req.headers,
    bodyLength: req.body.length,
    signature: req.headers['stripe-signature']
  });

  const sig = req.headers['stripe-signature'];
  const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET;

  try {
    const event = stripe.webhooks.constructEvent(req.body, sig, endpointSecret);
    console.log('Webhook verified successfully:', event.type);
    
    // ✅ Process event
    handleStripeEvent(event);
    
    res.status(200).send('OK');
  } catch (err) {
    console.error('Webhook verification failed:', err.message);
    res.status(400).send(`Webhook Error: ${err.message}`);
  }
});
Gautam Sharma

About Gautam Sharma

Full-stack developer and tech blogger sharing coding tutorials and best practices

Related Articles

Tutorials

Fix: Error: Failed to verify webhook signature error

Quick fix for 'Failed to verify webhook signature' error. Learn how to properly implement webhook signature verification in your applications.

January 8, 2026
Tutorials

Fix: PayPal Payment Success but Order Not Created Error

Learn how to fix the 'PayPal payment success but order not created' error in e-commerce applications. This comprehensive guide covers PayPal integration, webhook configuration, and order processing solutions.

January 8, 2026
Tutorials

Fix: Stripe Webhook Signature Verification Failed Error - Complete Guide

Complete guide to fix Stripe webhook signature verification failed errors. Learn how to resolve webhook authentication issues with practical solutions, security best practices, and proper implementation for secure payment processing.

January 8, 2026