Every SaaS company eventually faces the same decision: build webhook infrastructure in-house or use a managed service?
The gut reaction is often "we'll build it ourselves — how hard can it be?" After working with dozens of engineering teams, we've found that the answer is almost always: harder and more expensive than you think.
This post breaks down the real costs — engineering time, infrastructure, operations, and opportunity cost — so you can make an informed decision.
The "Simple" Webhook Receiver
A basic webhook receiver looks easy on paper:
http.HandleFunc("/webhook", func(w http.ResponseWriter, r *http.Request) {
body, _ := io.ReadAll(r.Body)
go processWebhook(body)
w.WriteHeader(200)
})
That's 6 lines of code. Ship it, right?
Not quite. Production webhook infrastructure requires:
- ›Durable queuing — if your DB is down, you still need to accept events
- ›Signature verification — HMAC-SHA256 with timing-safe comparison
- ›Retry logic — exponential backoff with dead-letter queues
- ›Idempotency — handling duplicate deliveries from providers
- ›Observability — per-event delivery logs and failure alerts
- ›Fan-out — routing one event to multiple destinations
- ›Replay — re-delivering past events when a consumer was down
Engineering Cost Breakdown
Here's a realistic estimate for building this from scratch with a mid-level Go or Node.js engineer:
| Component | Engineering Estimate | Notes |
|---|---|---|
| Basic HTTP receiver + queue | 2–3 days | Schema, queue table, basic worker |
| HMAC signature verification | 1 day | Stripe, GitHub, Shopify formats differ |
| Retry + exponential backoff | 2 days | Dead-letter, max attempts, backoff calc |
| Fan-out routing engine | 3–4 days | Pattern matching, per-route config |
| Event replay | 2 days | UI + API surface + state machine |
| Delivery logs + observability | 3 days | Per-attempt logs, dashboard views |
| Idempotency (dedup) | 1–2 days | Dedup key tracking, TTL cleanup |
| Provider signature presets | 2 days | Stripe/GitHub/Shopify/Twilio formats |
| Multi-tenant isolation | 3–5 days | Per-tenant keys, data partitioning |
| Custom domain support | 3–5 days | TLS provisioning, DNS verification |
| Testing + QA | 5–8 days | Integration tests are critical here |
| Total | 27–42 days | ~6–9 engineer-weeks |
At a fully-loaded cost of $150/hour for a senior engineer, that's:
| Scenario | Hours | Cost |
|---|---|---|
| Optimistic (27 days × 6h effective) | 162 h | $24,300 |
| Realistic (35 days × 6h effective) | 210 h | $31,500 |
| Conservative (42 days × 6h effective) | 252 h | $37,800 |
And that's just the initial build — not counting ongoing maintenance.
Infrastructure Cost Breakdown
Once built, you need to run it. Here's a typical production setup:
| Resource | Monthly Cost | Notes |
|---|---|---|
| Application servers (2× HA) | $80–$160 | 2 vCPU / 4GB each |
| PostgreSQL (primary + replica) | $120–$300 | 16GB RAM, 500GB SSD |
| Additional DB storage (events) | $50–$200 | Depends on event volume |
| Load balancer | $20–$40 | Cloud provider LB |
| Monitoring / APM | $40–$100 | Datadog / Grafana Cloud |
| Log aggregation | $30–$80 | Logtail / Papertrail |
| Alerting (PagerDuty) | $20–$40 | On-call rotation |
| Bandwidth | $10–$100 | Depends on event payload sizes |
| Monthly total | $370–$1,020 | |
| Annual total | $4,440–$12,240 |
Bandwidth Cost Reality Check
Let's model bandwidth costs for a typical B2B SaaS at different scales:
| Events / Month | Avg Payload | Inbound GB | Outbound GB | AWS Bandwidth Cost |
|---|---|---|---|---|
| 100,000 | 2 KB | 0.2 GB | 0.4 GB | ~$0.05 |
| 1,000,000 | 2 KB | 2 GB | 4 GB | ~$0.40 |
| 10,000,000 | 2 KB | 20 GB | 40 GB | ~$4.00 |
| 100,000,000 | 2 KB | 200 GB | 400 GB | ~$40.00 |
Bandwidth is rarely a major cost driver — compute and engineering time dominate.
The Hidden Ongoing Cost: Maintenance
This is where in-house builds get expensive in the long run.
| Activity | Hours / Month | Monthly Cost (@$150/hr) |
|---|---|---|
| Bug fixes and incidents | 4–8 h | $600–$1,200 |
| Dependency updates + security patches | 2–4 h | $300–$600 |
| Scaling work (query optimization, indexing) | 2–4 h | $300–$600 |
| Provider signature format changes | 1–2 h | $150–$300 |
| On-call rotations (3 engineers) | 8–16 h | $1,200–$2,400 |
| Monitoring + alerting tuning | 1–2 h | $150–$300 |
| Monthly total | 18–36 h | $2,700–$5,400 |
| Annual total | $32,400–$64,800 |
3-Year Total Cost of Ownership
Let's put it all together for a startup processing 1M events/month:
| Cost Item | Year 1 | Year 2 | Year 3 |
|---|---|---|---|
| Initial build | $31,500 | $0 | $0 |
| Infrastructure | $6,000 | $8,400 | $12,000 |
| Maintenance (ongoing eng) | $32,400 | $38,880 | $46,656 |
| Incidents + RCA time | $4,800 | $4,800 | $4,800 |
| Total | $74,700 | $52,080 | $63,456 |
| 3-year total | $190,236 |
Compare that to GetHook pricing, which starts at a fraction of that cost — and includes everything listed above, battle-tested and maintained by a dedicated team.
What You Actually Give Up Building In-House
Beyond pure cost, there are capability gaps that are painful to close:
- ›No provider presets — you'll hand-code Stripe's
t=...,v1=...format, GitHub'ssha256=...format, etc. - ›No built-in replay UI — debugging "why didn't this event arrive?" takes hours
- ›No fan-out — you'll add it when a customer asks, scrambling
- ›No white-labeling — per-customer HMAC secrets and custom domains are months of work
- ›No SDK — your customers get raw HTTP docs
The Decision Framework
Build in-house makes sense if:
- ›You process fewer than 10K events/month and have simple delivery needs
- ›You have a specific regulatory requirement to keep all processing on-prem
- ›Webhook infrastructure is core IP (you're building a competitor)
Use GetHook if:
- ›Webhooks are infrastructure, not your product
- ›You want to ship features instead of maintaining queue workers
- ›You need multi-tenant isolation, white-labeling, or replay out of the box
- ›Your team's time is worth more than the subscription cost
Conclusion
The "we'll build it ourselves" choice makes sense on day one. By month six, when you're fixing a replay bug on a Saturday night, or you find out that your HMAC verification has a timing vulnerability, or a customer asks for per-tenant custom domains — the managed service looks very different.
GetHook exists precisely because webhook infrastructure is solved infrastructure. You shouldn't need to solve it again.