---
title: Stripe Webhook Issues
description: "TrustLens depends on Stripe webhooks to auto-ingest dispute and refund events: the WooCommerce Stripe plugin receives the webhook, and TrustLens listens for the dispute and refund events that plugin passes on. If webhooks aren't delivering, TrustLens won't know about chargebacks…"
url: "https://webstepper.io/docs/trustlens/troubleshooting/stripe-webhook-issues/"
updated: "2026-10-18"
category: Troubleshooting
---

# Stripe Webhook Issues

TrustLens depends on Stripe webhooks to auto-ingest dispute and refund events: the WooCommerce Stripe plugin receives the webhook, and TrustLens listens for the dispute and refund events that plugin passes on. If webhooks aren't delivering, TrustLens won't know about chargebacks until you manually enter them — which means your chargeback ratio is artificially low and your customer scores aren't reflecting dispute history. This page walks through diagnosing and fixing webhook delivery issues.

---

## Common Symptoms

- A dispute was filed in Stripe but doesn't appear in TrustLens
- Dispute status updates (won/lost) aren't reflecting
- The order screen shows no dispute, and (Pro) the Chargeback Monitor's dispute worklist doesn't list it
- Refund events from Stripe aren't recorded in customers' Recent activity

---

## Step 1: Verify Stripe Webhook Configuration

The first check is on Stripe's side:

1. Log in to Stripe Dashboard
2. Go to **Developers → Webhooks**
3. Find the webhook endpoint pointing to your store
4. Verify the URL — should look like `https://yoursite.com/?wc-api=wc_stripe` or the equivalent for your Stripe plugin version
5. Check that the webhook is enabled (not paused)

If no webhook endpoint exists for your store, you need to create one. The WooCommerce Stripe plugin usually creates it automatically, but on some installations the auto-creation fails.

---

## Step 2: Check Recent Webhook Events

On the Stripe webhook detail page:

1. Look at the "Recent events" log
2. For each event, check the HTTP response code from your store

| Response | Meaning |
| --- | --- |
| 200 / 201 | Success — WooCommerce Stripe received and acknowledged |
| 400 | Bad request — usually signing key mismatch |
| 401 / 403 | Authentication failure |
| 404 | Endpoint not found — URL wrong or WooCommerce Stripe deactivated |
| 500 | WordPress error processing the webhook |
| Timeout | WordPress took too long to respond |

---

## Step 3: Fix Signing Key Mismatch

If you see 400 responses, the signing key configured in WooCommerce Stripe doesn't match Stripe's webhook secret:

1. In Stripe Dashboard, copy the webhook's signing secret
2. In WordPress, go to **WooCommerce → Settings → Payments → Stripe → Webhook Endpoints**
3. Paste the signing secret
4. Save

Test by clicking "Send test event" in Stripe — you should see a 200 response immediately after.

---

## Step 4: Fix 404 Errors

404 means the webhook URL doesn't resolve:

- **Stripe plugin deactivated:** Verify WooCommerce Stripe plugin is active
- **Wrong URL:** Compare the URL in Stripe Dashboard to what WooCommerce Stripe expects (usually shown in the plugin's settings)
- **Plugin upgraded with URL change:** Major version upgrades sometimes change the webhook URL — update Stripe accordingly

---

## Step 5: Fix 500 Errors

500 means WordPress encountered an error processing the webhook. Common causes:

- **Memory exhaustion:** Raise PHP memory limit
- **PHP fatal error:** Check WordPress debug log for the specific error
- **Plugin conflict:** Another plugin hooking into the webhook path

Enable WordPress debug logging:

```
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
```

Trigger the webhook again, then check `wp-content/debug.log` for the error.

---

## Step 6: Fix Timeouts

Stripe waits 30 seconds for a response. If your WordPress site takes longer (heavy plugins, slow database, server issues), Stripe gives up.

Diagnose:

- Use a tool like New Relic or Query Monitor to find slow queries
- Check if the slowness is webhook-specific or site-wide
- Identify plugins triggered on webhook receipt

Common fixes:

- Upgrade hosting
- Add indexes to slow queries
- Move heavy webhook processing to async (Action Scheduler)

---

## Step 7: Verify TrustLens Is Listening

Even if WooCommerce Stripe receives the webhook, TrustLens needs to hook into it. There's no ingestion-status indicator in TrustLens, so verify by hand:

1. **Chargeback Tracking** is enabled under **TrustLens → Settings → Detection**
2. The disputed charge belongs to an order that exists in WooCommerce — TrustLens ignores disputes it can't match to an order
3. After a dispute arrives, open that order: the chargeback box on the order screen should show it, and the customer's Recent activity should list a `dispute_created` event

TrustLens listens for the Stripe plugin's `wc_stripe_charge_dispute_created` and `wc_stripe_charge_dispute_closed` actions. If Stripe shows a 200 but nothing reaches TrustLens, check the WordPress error log for TrustLens-specific errors, and make sure the Stripe plugin is current enough to fire those actions.

---

## Step 8: Resend Missed Events From Stripe

If webhook delivery was broken for a period, Stripe can resend missed events:

1. Stripe Dashboard → Developers → Webhooks → your endpoint
2. Find the failed events in the "Recent events" log
3. Click each and use "Resend"

For mass resending, Stripe's API can replay events programmatically. Or:

1. Identify the affected date range
2. Manually enter each dispute in TrustLens: open the disputed order and use **Record manual chargeback** (amount, card brand, reason, outcome, optional response due date)
3. The manual form has no dispute ID field — add the Stripe dispute ID to the reason or an order note for traceability

A manual dispute saved as Pending can later be closed with the **Mark won** / **Mark lost** buttons on the order screen (1.3.23).

---

## Step 9: Verify Manually

To confirm everything is now working:

1. In Stripe Dashboard, send a test webhook event
2. Check WooCommerce Stripe receives it (200 response)
3. For a real dispute, check TrustLens reflects it (the order's chargeback box and the customer's Recent activity) — Stripe's generic test events don't carry a dispute for one of your orders

---

## WooPayments-Specific Notes

WooPayments uses Stripe under the hood but with different webhook configuration:

- WooPayments webhooks are managed automatically — you don't typically need to configure them
- If issues arise, contact WooPayments support; the diagnostic surface is different
- TrustLens picks up WooPayments disputes from the `woocommerce_payments_dispute_created` and `woocommerce_payments_dispute_closed` action hooks

---

## Preventive Practices

- Test webhook delivery after any major site change (theme, host, plugin updates)
- Monitor the Stripe webhook events log monthly for failed deliveries
- Set up Stripe's notification email for webhook failures (Developer → Webhooks → Edit endpoint)
- Keep WooCommerce Stripe plugin up to date — webhook URL or format changes occasionally

---

## When to Fall Back to Manual Entry

If webhook delivery is persistently unreliable on your infrastructure:

- Log disputes manually on the order screen as they arrive, and record the outcome with Mark won / Mark lost when the processor decides
- Establish a weekly routine of reconciling with Stripe's dispute list
- Accept the operational overhead

This isn't ideal but is workable for stores with low dispute volume.
