Retries & Idempotency
Delivery and retries
Section titled “Delivery and retries”A delivery is considered successful when your endpoint responds with HTTP 2xx within 10 seconds. Anything else (timeout, 4xx, 5xx, network error) triggers retry.
Retry schedule
Section titled “Retry schedule”ParaSta retries up to 24 times over 3 days with exponential backoff. The full schedule:
| Attempt | After |
|---|---|
| 1 | 1 minute |
| 2 | 5 minutes |
| 3 | 30 minutes |
| 4 | 1 hour |
| 5 | 6 hours |
| 6 | 12 hours |
| 7+ | 24 hours each (until 24 attempts total) |
After the final attempt, the event is marked delivery_failed and stops retrying. You can manually re-deliver from the dashboard.
Idempotency on your side
Section titled “Idempotency on your side”Because retries can deliver the same event multiple times, always dedupe by event.id:
const seen = await db.webhookEvents.findUnique({ where: { id: event.id } });if (seen) return res.json({ received: true });await db.webhookEvents.create({ data: { id: event.id, ... } });// ...processTreat event.id as a unique constraint in your storage. Idempotency window is at least the 3-day retry window — keep records for at least 7 days for safety.
Idempotency on the request side (Idempotency-Key)
Section titled “Idempotency on the request side (Idempotency-Key)”For your outbound POST requests to ParaSta (creating Payments, Checkout Sessions, Refunds), include an Idempotency-Key header. ParaSta caches the response for 24 hours; subsequent requests with the same key + same body return the cached response. Different bodies with the same key return 409 idempotency_error.
Idempotency-Key: order_4567_create_paymentUse a stable key (your internal order ID) so retries from your side don’t create duplicate Payments.