← Spec Hub | Category: Payments & Billing
Comprehensive specification for handling incoming Baserow ➔ Stripe Webhook Pipeline Specification webhook events. This reference covers cryptographic payload verification, request headers, and retry protocols.
Supported Events: charge.succeeded payment_intent.created invoice.payment_failed customer.subscription.deleted
Security validation specs for Baserow ➔ Stripe Webhook Pipeline Specification endpoints:
X-Baserow➔StripeWebhookPipelineSpecification-Signature: t=1789764045,v1=072b8b8fe02ac8f2d524e4a6
const crypto = require('crypto');
const expected = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
const isValid = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
import hmac, hashlib
expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
is_valid = hmac.compare_digest(expected, incoming_sig)
{
"id": "evt_baserow-to-stripe.html_98081",
"event": "charge.succeeded",
"created_at": 1789764045,
"data": {
"resource_id": "res_800",
"status": "active"
}
}
curl -X POST https://your-domain.com/webhook/baserow-to-stripe.html \
-H "Content-Type: application/json" \
-H "X-Baserow➔StripeWebhookPipelineSpecification-Signature: t=1789764045,v1=072b8b8fe02ac8f2d524e4a6" \
-d '{"id": "evt_baserow-to-stripe.html_98081", "event": "charge.succeeded", "created_at": 1789764045, "data": {"resource_id": "res_800", "status": "active"}}'
| Status Code | Status Meaning | Integration Action |
|---|---|---|
200 OK | Success | Event payload validated and queued. |
400 Bad Request | Malformed Payload | Check payload structure and JSON formatting. |
401 Unauthorized | Signature Mismatch | Verify secret key and digest computation. |
500 Error | Server Error | Triggers provider automated retry backoff. |
Always process incoming events asynchronously using a message queue. Never perform long-running DB queries or external API calls synchronously within the HTTP response handler.
Compute the HMAC SHA-256 hash on the raw request body using your shared secret and compare it against the incoming signature header using time-constant comparison.
Your endpoint must return an HTTP 2xx response within 2000ms. Offload heavy processing (email, DB writes) to an asynchronous task queue.
Store processed event IDs in an atomic storage like Redis with a set expiration. If an incoming ID exists, acknowledge with 200 OK immediately without re-triggering logic.