Notify docs
Limits
Limits and retention.
What the preview allows, what happens at the limit, and how long Notify keeps each record.
1
Preview limits
Per workspace unless stated. Need more for a real workload? Write to hello@productcraft.co with the workspace and the limit: most of these are raised per workspace.
| What | Limit |
|---|---|
| Recipients per send call | 1,000 |
| data payload | 16 KB as JSON (413 DATA_TOO_LARGE) |
| Accepted recipients | 3,000 per minute per workspace (429 RATE_LIMITED with Retry-After); raisable on request |
| Bulk recipient import | 1,000 recipients per call, 20 calls per minute |
| Recipient-token mints | 3,000 per minute per workspace: cache a token per user for most of its lifetime |
| Sends per recipient | 30 per minute for non-critical types and a separate 30 for critical ones (the excess is skipped as rate_limited) |
| Client (recipient-token) calls | 60 per minute per recipient |
| Real-time streams | 5 per recipient, 500 per workspace during the preview (429 STREAM_LIMIT) |
| Notification types / categories | 200 / 50 per workspace |
| Devices per recipient | 20 active (registering a 21st prunes the least recently seen) |
| Device registrations | 10 per recipient per hour; a token can move to another recipient at most 3 times a day (429 DEVICE_MOVE_LIMIT) |
| Template size | 32 KB per channel and locale |
| Push payload | APNs 4 KB, FCM 4 KB, web push about 3.9 KB of JSON (checked before sending; payload_too_large) |
| Notification TTL | 24 hours by default (ttl_seconds on the type); retries stop at the TTL |
| Scheduled send | send_at or delay_seconds within the type TTL |
| Mail’s limits apply (60 a minute, 600 an hour, 10,000 a day per workspace). Notify keeps to them: the excess waits for the next window (email_budget), up to 10,000 waiting emails per workspace. Email pauses automatically above 0.1 % complaints or 5 % hard bounces over the last 500 sends. | |
| Recipient token lifetime | 1 hour by default, at most 24 hours |
| Webhook endpoints | the shared per-workspace limit of every ProductCraft product |
2
What happens at a limit
- Request limits answer
429 RATE_LIMITEDwithRetry-After. The Node SDK waits and retries with the same Idempotency-Key. - Per-recipient budgets and type throttles never fail your call: the excess delivery is
skippedasrate_limitedorthrottled, so a noisy type cannot flood a user, and a critical type has its own budget. - Sizes and counts answer
413or422 LIMIT_EXCEEDEDbefore anything is stored. - Every workspace also shares the per-IP limit of the API edge (20 requests a second, 600 a minute per client IP).
3
Retention
| Record | Kept for |
|---|---|
| Notifications, deliveries and attempts (including the rendered push text) | 30 days |
| Inbox items | 90 days, or 30 days after the recipient archives them |
| Devices | until pruned (removed 7 days later), or after 270 days without a registration |
| Daily statistics | 13 months |
| Recipients, preferences and preference history | until you erase the recipient or delete the workspace |
| Push credentials | until you delete or replace them; a replaced key’s ciphertext is wiped after 24 hours |
Erasing a recipient removes their data sooner; see Erasure and retention, which also says what ProductCraft Mail keeps for emails. Deleting the workspace deletes everything.
4
Preview terms
Notify is free during the preview and has no SLA. It is hosted in the EU (DigitalOcean, Frankfurt, fra1). Pricing after the preview will be announced before it ends.