All docs

FAQ & Troubleshooting

General

How precise is the fire time? Second-level, on a best-effort basis, with Early Firing correction that compensates for network round-trip time so the request arrives close to your scheduled instant. We don't promise an exact arrival moment. See Scheduling → Early Firing.

What happens if my endpoint is down when it fires? We retry up to 5 times with exponential backoff. If all attempts fail, the schedule moves to dead and is parked in the dead-letter queue. See Reliability.

Can the same webhook be delivered twice? Yes, rarely — delivery is at-least-once. Make your handler idempotent by keying off the schedule id or your own idempotencyKey.

Do you follow redirects? No. A 3xx is treated as a non-success. Target the final URL directly. This is an SSRF safeguard — see Security.

Can I schedule plain http:// URLs, or an internal/localhost address? No. Targets must be https:// on port 80/443, and must not resolve to private, loopback, or reserved addresses. See Security.

Integrating

The signature check keeps failing. Why? Almost always because the body bytes don't match. Verify against the raw request body, not a re-serialized parsed object — re-encoding JSON changes the bytes. Also confirm you're signing "{t}.{rawBody}" and using the right secret. See Verifying Webhooks.

How do I send a JSON body over the REST API? payload is a string over REST. JSON-encode your object into that string and add a Content-Type: application/json header entry. The SDK does this automatically when you pass an object. See Scheduling.

Why can't I create or revoke API keys with my API key? Key management and billing are session-only, on purpose — so a leaked key can't mint more keys. Do those in the dashboard. See Authentication.

How do I retry a dead schedule? Fix the cause, then replay(id) to re-send the same payload, or clone(id, …) to send with a new one. Each creates a fresh schedule.

Can I retrieve a payload after scheduling? No. Payloads are encrypted at rest and never returned — responses only report the size and whether one exists.

Account & billing

The login button is stuck "pending." That usually means the dashboard can't reach the backend. If you're running locally, check the API is up and CORS_ORIGIN includes your local origin. In production, check service status.

How do I upgrade or cancel? From billing settings. Billing is handled by Lemon Squeezy as Merchant of Record. See Plans & Limits.

Sign-up returns 429. New-account creation is rate-limited per origin IP (up to 5 accounts per 24 hours) to deter abuse. Shared IPs — an office or CGNAT network — can hit this even with legitimate sign-ups. Try again later or from a different network; if you're blocked and shouldn't be, email support.

Still stuck?

Email support@sendit-whenever.com.