Skip to content
Ask Otto AI
Help

What is this page?

Payment webhooks

Role aware

This page proves Stripe webhook signature verification, tenant-scoped event idempotency, duplicate skip behavior, and the successful-payment receipt plus ledger posting plan.

Audience
Administrator
Current limits
It uses local invented proof data only. It does not persist webhook mutations, deliver receipts, reconcile payouts, process refunds or disputes, accept live-mode events, or move production money.

Support request boundary

Use Sev2 if webhook idempotency or ledger posting would duplicate money records, Sev3 if signature, event table, or receipt behavior is unclear, and Sev4 for labels or proof-copy feedback. This panel does not submit a support case.

Sev1: Critical outage or data-risk emergency

Target: 1-hour response, 24/7 paging during pilot

Sev2: Major workflow blocked

Target: 4 business hours

Sev3: Standard product question or non-urgent issue

Target: 1 business day

Sev4: How-to, cosmetic, or future enhancement

Target: 2 business days

These preview controls are placeholders. Real AI answers, search, walkthroughs, and support submission come in later tickets.

Notifications5

Static proof preview

Real notification feeds, delivery, and preferences arrive in a later ticket.

Sam Director

Sam Director

sam.director@otto-fixture.test

Switch local proof role

This changes only the local shell proof. Production role changes remain server-validated future work.

Search is a keyboard-focusable skeleton. No real index or permissioned search results are implemented in this ticket.

Settings - Money

Payment webhooks

Review Stripe webhook signature verification, event idempotency, receipt planning, and ledger posting for successful student payments.

Otto Fixture BPPE Career School - Stripe webhook proof

School Administrator ยท Sam Director

Stripe webhook intake

Signature, idempotency, receipt, and ledger proof

This page proves the server-side webhook contract for one successful test PaymentIntent. It verifies raw-body signatures, writes one tenant-scoped event row, skips duplicates, and plans the payment receipt plus balanced ledger journal.

payment_intent.succeeded

$325.00

Event: evt_test_payment_intent_succeeded_001

Local gate blocked

Local activation guard

Blocked until local webhook settings exist

Blocked

Set OTTO_ENABLE_STRIPE_WEBHOOK_PROOF=true before accepting local Stripe webhook events.

STRIPE_WEBHOOK_SIGNING_SECRET is required.

Raw-body signature check

POST /api/v1/payments/stripe-webhooks

Raw body required

Header

Stripe-Signature

Secret

STRIPE_WEBHOOK_SIGNING_SECRET

Tolerance

300 seconds

Success event

payment_intent.succeeded

Signature header preview

t=1791826200,v1=21d6628135efe8fcef779bf76b048d30a0c2dcefe4ee90cdb1eda590c4ff8fb4

Raw payload sample
{"id":"evt_test_payment_intent_succeeded_001","object":"event","account":"acct_test_bppe_career_001","api_version":"2025-06-30.basil","created":1791826200,"livemode":false,"type":"payment_intent.succeeded","data":{"object":{"id":"pi_test_maya_october_installment","object":"payment_intent","amount":32500,"currency":"usd","status":"succeeded","latest_charge":"ch_test_maya_october_installment","payment_method_types":["card","us_bank_account"],"metadata":{"tenant_id":"tenant_bppe_career","student_id":"student_maya_rivera","enrollment_id":"enrollment_maya_mbc_2026","payment_option_id":"october-installment","installment_id":"installment-1","otto_fee_cents":"0","blocked_funds":"no_title_iv_credit_balance_or_loan_proceeds"}}}}

Tenant event table

stripe_webhook_events

RLS tenant-owned

tenant_id

stripe_event_id

stripe_account_id

event_type

signature_verified

processing_status

idempotency_key

payment_id

ledger_journal_id

receipt_number

Stripe event ID

evt_test_payment_intent_succeeded_001

Connected account

acct_test_bppe_career_001

Processing status

processed

Idempotency key

stripe:event:evt_test_payment_intent_succeeded_001

Payment link

11111111-1111-4111-8111-111111111115

Ledger journal

00000000-0000-4000-8000-000000000001

Receipt and ledger

One payment, one balanced journal

Balanced

Payment number

PAY-2026-0002

Receipt

RCT-2026-0002

Amount

$325.00

PaymentIntent

pi_test_maya_october_installment

No.AccountDebitCredit
11015 - Stripe clearingStudent payment received by Stripe$325.00-
21100 - Student receivableStudent balance reduced by payment-$325.00
Total$325.00$325.00