Indie Hackers FAQ: Webhook Payload Size Limits & Duplicates

Common Questions for Indie Hackers

What is a webhook payload size limit?

A webhook payload size limit is the maximum number of bytes a webhook provider allows in the body of an HTTP POST. If a payload exceeds this cap, the provider will reject or truncate the event, often returning a 4xx status code. Indie hackers rarely think of this until a payment webhook, for example, gets cut in half, and the downstream services never receive the full data.

How does a payload size limit affect my webhook flow?

When a payload is cut, the receiving endpoint receives incomplete data. If you rely on that data for business logic—like updating a CRM or invoicing an accounting tool—the logic fails. Moreover, many services will automatically retry the request, leading to duplicate entries or race conditions. The net result is data loss and increased debugging time.

What can I do when I hit the limit?

First, check the provider’s documentation for the exact limit. If you consistently hit it, consider:

  • Compressing the JSON before sending (gzip headers).
  • Splitting the data into smaller chunks, then reassembling them on the receiver.
  • Sending a reference ID instead of the full payload, then fetching the rest from the provider’s API.
  • Using a fan‑out service that stores the payload in a fail‑safe buffer before delivering to downstream apps.

Can I see why my webhook was rejected due to the size limit?

Many providers expose an error message in the response body, e.g., “payload exceeds allowed size of 1 MB”. However, most logs on the provider side are not publicly visible. Without an intermediary logging layer, you’ll have no trail of the original event. That’s why a tool that captures every event before delivery can save a lot of headache.

Why Do I Hit the Webhook Payload Size Limit?

Are there platform-specific limits?

Yes. Stripe caps its webhooks at 1 MB for the body, Shopify has a 2 MB limit, GitHub 10 MB, and custom APIs may set arbitrary caps. If you’re building an app that aggregates multiple services, each with its own threshold, you’ll quickly run into a situation where a single event is valid for one provider but too large for another.

Can a single field blow the limit?

Absolutely. A single field—say a base64-encoded image—can push an otherwise innocuous event past the limit. It’s a common mistake to think the rest of the JSON is small and overlook the impact of large payloads in a single key.

What’s a quick way to test size?

Scripting a quick curl or Node.js snippet that prints the length of the JSON string can save hours of guesswork. Remember to account for headers and encoding overhead when calculating the total request size.

Debugging Failed or Duplicate Webhooks

What are common causes for duplicates?

Duplicate webhooks usually arise from:

  • Retries after an initial 4xx or network error.
  • Multiple event sources pushing the same update (e.g., a sync service and a webhook).
  • Misconfigured Idempotency keys that don’t match across providers.
  • Manual replays during development when testing against production.

How can I track where the failure happened?

Without visibility, you’ll need to rely on timestamps and the raw payloads. A fan‑out layer that records each event with an ID and status (queued, delivered, failed) gives you an audit trail. From that trail you can map a failed delivery to its original provider, the retry count, and even the payload size that triggered the failure.

How to prevent retries from causing duplicates?

Most providers support Idempotency‑or‑Replay‑Token headers. Use them consistently across all downstream endpoints. Additionally, design your downstream logic to be idempotent: if the same data arrives twice, treat the second arrival as a no‑op. If you’re already using a fan‑out service with storage, you can deduplicate on read.

Example: Payment Provider to CRM & Accounting Tool

Imagine a Stripe checkout that needs to create a customer record in HubSpot and a journal entry in QuickBooks. When Stripe pushes the “invoice.payment_succeeded” event, both HubSpot and QuickBooks must act on the same data. If the payload is larger than Stripe’s 1 MB limit, the event is truncated before it reaches HubSpot, but QuickBooks might still get a valid request. Because there’s no shared log, you’ll later discover a missing customer in HubSpot and a duplicate invoice in QuickBooks. A fan‑out solution that stores the full webhook, retries with exponential backoff, and provides a searchable log eliminates this mismatch—so both downstream services either get the full data or you see why they didn’t.

Conclusion

As an indie hacker, you want to ship fast, not chase down mysterious webhook failures. Understanding the limits of each provider, capturing every payload for audit, and building idempotent downstream logic are the keys to a resilient system. If you’re still struggling to keep your webhook flow reliable, try NodeTrigger to add visibility and fail‑safe routing.