Stripe Webhook Issues
4 min read
- View as Markdown Open this page as plain Markdown (opens in a new tab)
- Open in ChatGPT Ask questions about this page (opens in a new tab)
- Open in Claude Ask questions about this page (opens in a new tab)
- Open in Google AI Studio Ask questions about this page (Google account required) (opens in a new tab)
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:
- Log in to Stripe Dashboard
- Go to Developers → Webhooks
- Find the webhook endpoint pointing to your store
- Verify the URL — should look like
https://yoursite.com/?wc-api=wc_stripeor the equivalent for your Stripe plugin version - 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:
- Look at the “Recent events” log
- 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:
- In Stripe Dashboard, copy the webhook’s signing secret
- In WordPress, go to WooCommerce → Settings → Payments → Stripe → Webhook Endpoints
- Paste the signing secret
- 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:
- Chargeback Tracking is enabled under TrustLens → Settings → Detection
- The disputed charge belongs to an order that exists in WooCommerce — TrustLens ignores disputes it can’t match to an order
- 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_createdevent
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:
- Stripe Dashboard → Developers → Webhooks → your endpoint
- Find the failed events in the “Recent events” log
- Click each and use “Resend”
For mass resending, Stripe’s API can replay events programmatically. Or:
- Identify the affected date range
- Manually enter each dispute in TrustLens: open the disputed order and use Record manual chargeback (amount, card brand, reason, outcome, optional response due date)
- 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:
- In Stripe Dashboard, send a test webhook event
- Check WooCommerce Stripe receives it (200 response)
- 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_createdandwoocommerce_payments_dispute_closedaction 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.
Updated on October 18, 2026