Polar integration
Reliable Polar webhooks with edit-and-replay
Polar's webhook events drive subscription lifecycle in modern indie SaaS — order creation, plan upgrades, customer churn. Like all webhook senders, Polar will retry on 5xx responses, but only within a fixed window. If your app is mid-deploy when a subscription.created arrives, you risk a paying customer with no entitlements record.
Last updated: 2026-05-01
TL;DR
Point Polar at your Zalapier endpoint URL. Zalapier persists every payload, verifies the Standard Webhooks signature, and forwards to your handler with retries. If a payload errors, edit the JSON and replay — no need to ask Polar to resend.
Why a Polar buffer is worth setting up
Polar follows the Standard Webhooks spec — HMAC signing, retry on 5xx, idempotency keys. This is good. But the failure mode it doesn't solve is your downstream stack: a Phoenix release rolling, a Postgres failover, a sidekiq worker that crashed mid-loop. Polar will dutifully retry; if your unavailability outlasts Polar's retry window, the event is gone.
For subscription events that gate access to paid features, a missed subscription.created means a paying customer with no entitlements row. The customer notices, files a ticket, and your support team has to manually reconstruct the upgrade. A buffer prevents that entire class of incident.
What Zalapier does for Polar specifically
Zalapier verifies the Standard Webhooks signature using your Polar webhook secret. Verified events are persisted to Postgres before delivery — your endpoint returns 200 to Polar even when your downstream is restarting. The buffered events then flow to your real handler with exponential backoff retries.
If a payload eventually errors out (your handler returns 4xx forever because of a bad code path you've since fixed), open the Payload Sandbox in the Zalapier dashboard, inspect the body, optionally edit it to match your fixed schema, and re-queue the delivery. No Polar resends needed.
Pairs naturally with Polar billing
If you're using Polar for billing, you're likely already comfortable with their webhook payload format. Zalapier doesn't transform the payload — it just durably stores and forwards. Your handler logic stays the same; the buffer is transparent.
Set up Polar webhook buffering in 3 minutes
-
1
Create a Zalapier endpoint
Sign up free at zalapier.com and create a webhook endpoint. You'll get a URL like https://zalapier.com/api/in/polar-prod-9k4m.
-
2
Add your destination
In Zalapier, add your real Polar webhook handler as a destination (e.g., https://api.yourapp.com/webhooks/polar).
-
3
Configure Polar to use the new endpoint
In your Polar dashboard, edit your webhook endpoint to point at the Zalapier URL. Paste your Polar webhook secret into Zalapier's endpoint settings so signature verification works on inbound.
-
4
Watch the live event log
Trigger a test event from Polar (or wait for the next real one). Confirm Zalapier shows it as received → delivered. You're now durable against your own deploys.
Frequently asked questions
Does Zalapier verify Polar's Standard Webhooks signature? ⌄
Yes. Paste your Polar webhook secret into your Zalapier endpoint settings and Zalapier will verify the webhook-signature header before persisting.
What if Polar sends a duplicate event? ⌄
Polar uses idempotency keys for deduplication. Zalapier preserves the headers, so your downstream handler can dedupe normally — same as if Polar were calling it directly.
Can I edit a Polar payload before forwarding? ⌄
On replay, yes. The Payload Sandbox lets you modify the JSON body before re-queueing. On first delivery, Zalapier passes the payload through unchanged.
How does this differ from just retrying inside my app? ⌄
Retrying inside your app requires your app to be running. The whole point of a buffer is to absorb events when your app isn't running — during deploys, restarts, or incidents. Postgres-backed durability is the difference.
Buffer Polar webhooks before your next deploy
Free plan covers 1,000 events/month. No credit card required. Set up in under 3 minutes.
Start free — no credit card →