HookDeploy offers four plans. Every account starts on Free. Upgrade when your team or volume grows.
Plan comparison
| Free | Starter | Team | Enterprise | |
|---|---|---|---|---|
| Price (monthly) | $0 | $9 | $19 | Custom |
| Price (yearly) | $0 | $90 | $190 | Custom |
| Members | 1 | 2 | Unlimited | Unlimited |
| Endpoints | 5 | 25 | 50 | Unlimited |
| Requests/month | 500 | 25,000 | 500,000 | Unlimited |
| Max payload | 256 KB | 1 MB | 25 MB | 100 MB |
| Retention | 7 days | 30 days | 90 days | 365 days |
| Header injection | — | ✓ | ✓ | ✓ |
| Storage/month | 1 GB | 5 GB | 50 GB | Unlimited |
Yearly billing saves $18/year on Starter and $38/year on Team compared to monthly.
What counts toward limits
Requests per month
Each incoming webhook to https://hookdeploy.dev/h/{slug} counts as one request. Counted per organization, across all endpoints, per calendar month (UTC).
Does count:
- POST, GET, PUT, PATCH, DELETE, etc. to your HookDeploy URL
- Requests to paused endpoints (they’re rejected with
423but still counted — actually wait, let me check project.md… When paused, requests return 423 - do they count? The worker says “If endpoint paused → 423 JSON” - likely before storage. I’ll say paused endpoint requests are NOT stored and likely not counted since they’re rejected early. Let me check worker behavior…
From project.md worker behavior: 4. If endpoint paused → 423 JSON
This happens before rate limit check and storage in step order… Actually order is:
- Extract slug
- Look up endpoint
- If not found → 404
- If paused → 423
- Check rate limit
- Check plan payload …
So paused requests return 423 before counting usage. Good - I’ll note that paused endpoints reject before counting.
Does not count:
- API calls to
api.hookdeploy.dev(separate API rate limits apply) - Replay actions (manual or via API)
- Requests rejected with
413(payload too large — rejected before storage) - Requests to paused endpoints (
423— rejected before storage)
Endpoints
Each active endpoint counts toward the limit, including paused endpoints. Deleted endpoints free up a slot immediately.
Members
Each organization member counts, including the owner. Pending invitations do not count until accepted.
Payload size
Checked at ingestion. Bodies exceeding max_payload_bytes are rejected with 413. Nothing is stored.
Retention
Not a usage limit — captured requests are automatically deleted after the retention period. No manual action needed.
Storage
Monthly storage counts request body size only — headers, query parameters, and metadata do not count toward the cap.
Storage resets on the first of each month (UTC), alongside your request quota.
| Plan | Storage/month |
|---|---|
| Free | 1 GB |
| Starter | 5 GB |
| Team | 50 GB |
| Enterprise | Unlimited |
When your organization reaches its storage cap:
- The webhook is still accepted (senders receive
200) - Request metadata appears in the dashboard (method, headers, timing, etc.)
- The body is not stored in R2
- The body tab shows an upgrade prompt instead of the payload
Upgrade your plan anytime from the Billing page to restore body storage for new requests.
Header injection
Inject custom headers (for example Authorization or X-Tenant-ID) into every auto-forwarded webhook. Available on Starter, Team, and Enterprise — not included on Free.
Configure injected headers in an endpoint’s Settings tab under Inject headers on forward. See Forwarding — Header injection.
Checking your usage
Dashboard — Billing page shows current usage vs limits with progress bars.
API:
curl -s "https://api.hookdeploy.dev/v1/usage" \
-H "Authorization: Bearer hd_live_YOUR_KEY"
{
"data": {
"requests_this_month": 42,
"endpoint_count": 3,
"member_count": 1,
"limits": {
"max_endpoints": "5",
"max_users": "1",
"max_requests_per_month": "500",
"max_payload_bytes": "262144",
"retention_days": "7"
}
}
}
Limit values of -1 mean unlimited.
Upgrading
Requires billing.change_plan permission (super admin, admin, or finance).
- Go to Billing in your organization
- Select a plan (Starter, Team, or Enterprise)
- Choose monthly or yearly billing
- Complete checkout via Stripe
On first paid upgrade, HookDeploy creates a Stripe Customer linked to your organization. One customer per org.
After checkout, your plan updates immediately. New limits apply to the current billing period.
Downgrading
- Go to Billing
- Click Manage subscription (opens Stripe Customer Portal)
- Change plan or cancel in Stripe
Downgrades take effect at the end of the current billing period. You keep current limits until then.
If you’re over the new plan’s limits at downgrade time (e.g. 10 endpoints on a plan that allows 5), you’ll need to delete excess endpoints before the downgrade applies.
Enterprise
Enterprise uses custom pricing. Contact us via support to discuss your needs. It includes:
- Unlimited team members and endpoints
- Unlimited requests per month
- 100 MB payloads
- 365-day retention
- Dedicated support
What happens at limits
| Limit hit | Behavior |
|---|---|
| Max requests/month | Incoming webhooks return 429. Dashboard notification. No overage charges. |
| Max endpoints | Cannot create new endpoints (dashboard error or API 429 plan_limit) |
| Max members | Cannot send new invitations |
| Max payload | Incoming webhooks return 413. Body not stored. |
| Storage/month | Request captured; body not stored. Upgrade prompt in body tab. |
No surprise charges. Self-serve plans never auto-upgrade you.
Next steps
- Billing FAQ — Payment methods, cancellation, refunds
- Usage API — Programmatic usage checks
- Members — Member limits per plan