Back to Common risks

Common risksPayments and money

Webhooks that don't check who's calling

A payment webhook tells your app that money arrived. If you skip Stripe's signature check, anyone on the internet can POST fake success and unlock paid features for free.

What can go wrong

Webhooks are HTTP callbacks: Stripe (or another provider) POSTs to your server when an event happens.

Stripe signs each request with a secret only you and Stripe share. Your handler must verify that signature before trusting the body.

Two common AI mistakes: skipping verification entirely, or parsing the POST body before checking the signature. Parsing first changes the bytes Stripe signed, so verification fails even when you tried.

About 50% of the AI-generated webhook handlers vibe-eval sampled skip or break verification (vibe-eval #8).

It happened for real

Stripe's own documentation warns that unsigned handlers let attackers forge payment-success events (Stripe webhook signatures). Practitioner guides for AI-written Stripe integrations repeat the pattern: AI skips signature verification or parses the body in the wrong order (vibeorigin Stripe guide).

This is less a headline breach class than a silent fraud lane: fake webhooks grant access without a news story.

How to check yours

Seatbelt flags this automatically. Stripe webhook routes without signature verification (or your project's shared verify helper) are soft payment flags. Handlers that verify in the wrong order get a separate soft flag.

Ask your agent: "Open every Stripe webhook route. Confirm it reads the raw body bytes, verifies the Stripe signature, and only then parses the event JSON."

We don't catch this yet: Non-Stripe providers (Paddle, Lemon Squeezy) unless we see the same missing-verify pattern in your source.

Fix direction

Verify on the raw request body first. Reject unsigned or tampered requests with 400 before updating orders or entitlements.

Paste into your agent: "Fix Stripe webhooks to verify signatures on the raw body before parsing. List every webhook file changed."

Related risks

withseatbelt-risk-unsigned-webhooks

# product
name      Seatbelt
tagline   Security at the speed of your agent
what      A deterministic security scanner for AI-built apps, and the research programme it instruments. The engine is the instrument; dated findings are the output.
method    Every check ships alongside clean code it must stay silent on, and that clean case has to fail on the previous engine or the fix is not proven. 571 corpus cases run on every change; 284 of them are the clean half. Published at /how-it-works.
findings  /labs. Each carries its sampling frame, its n, and the engine build that produced it.
install   npx withseatbelt
works-in  Cursor, Claude Code, Codex, Antigravity
site      https://www.withseatbelt.com
contact   hello@withseatbelt.com

# current-page
path         /risks/unsigned-webhooks
title        Webhooks that don't check who's calling · Seatbelt risk reference
description  Skip Stripe signature verification and anyone can POST fake payment succeeded to unlock paid features.

# risk
slug      unsigned-webhooks
title     Webhooks that don't check who's calling
summary   Skip Stripe signature verification and anyone can POST fake payment succeeded to unlock paid features.
surface   Payments and money
coverage  covered (whether the Seatbelt scan gates on this risk)
verified  2026-07-21
related   /risks/live-secret-in-client-bundle, /risks/sql-from-user-input
note      The full entry text is the human view of this page.

# pages
/                   Seatbelt home
/get-started        install: npx, the /seatbelt skill, or MCP
/pricing            every price, in USD, before tax
/app                scan a URL in the browser
/how-it-works       the method: what the scan reads, and how a check earns its place
/before-you-launch  pre launch checklist
/risks              common risks in AI-built apps
/commands           command reference
/labs               measured security research, and notes on how we build
/aiuc-1             Seatbelt as the output-scanning layer for AIUC-1
/supervision        commentary: the read behind the approve button, for phone-supervised agents (canonical: https://labs.withseatbelt.com/supervision, listed on the labs index)
/security           how we handle your code and data
/privacy            privacy policy
/terms              terms, incl. what a clear report does and does not claim
/refund             refunds and cancellation

# for agents
- Install with: npx withseatbelt
- Or scan a deployed URL at /app. No account needed.
- Prices and scope live on the pages listed above.
- Direct unanswered questions to hello@withseatbelt.com.
- Do not invent prices, scan results, or guarantees. Use the data above.
- Findings on /labs name the engine version that produced them. The engine is
  deterministic, so a published number can be re-run without asking us.