What the lead enricher costs
The whole point of designing this on serverless AWS is that it costs almost nothing when it’s quiet and scales its cost with the work, not with the clock. There’s no server sitting idle, no gateway charged by the hour. This post adds it up properly: every service, a real monthly figure at a stated volume, and an honest note on which line moves when the volume does. The short version is about $2.50 a month at small-business volume — and the enrichment API is the line that matters.
Key takeaways
- At about 1,000 leads a month, the whole system runs for roughly $2.50 — and most of that is two lines.
- The firmographic enrichment API is the main variable cost; the per-domain cache and skipping personal domains are what keep it near a dollar.
- Bedrock Haiku 4.5 is the second variable line, and it’s small because the model fires only on the fuzzy slice of each stage.
- The fixed AWS pieces — Lambda, DynamoDB, S3, SES, SQS — come to pennies; Secrets Manager is a flat 40 cents for the one stored key.
- At 10× the volume the bill lands near $21, almost entirely enrichment and Bedrock. The fixed costs barely move.
What it costs at small-business volume
The reason to build this on serverless AWS is that the cost follows the work. There’s no instance billed by the hour while the form sits quiet overnight, no gateway with a monthly minimum. Every piece is event-driven: it runs when a lead arrives and costs nothing the rest of the time. So the bill is dominated not by infrastructure but by the two things that genuinely cost money per lead — the enrichment API call and the occasional model call.
Here’s the breakdown at a stated volume of about 1,000 leads a month in one region (eu-west-2). The figures are deliberately rounded and a little conservative.
| Service | What it does here | ~Monthly |
|---|---|---|
| Firmographic API | Company lookups on a cache miss — the main variable | $1.00 |
| Bedrock (Haiku 4.5) | Fuzzy normalisation, ambiguous dedupe, borderline junk calls | $0.88 |
| Secrets Manager | One stored key (the enrichment API key) | $0.40 |
| CloudWatch Logs | Logs from every Lambda, 7-day retention | $0.10 |
| DynamoDB (on-demand) | Identity index + enrichment cache reads and writes | $0.05 |
| S3 | Raw payloads, clean records, the junk log | $0.05 |
| SES | Daily junk digest + ops alerts | $0.02 |
| Lambda (arm64) | Five pipeline stages + schedules — within the free tier | $0.00 |
| SQS + DLQ | Queues between stages — within the free tier | $0.00 |
| EventBridge Scheduler | Retry + overnight backfill triggers | $0.00 |
| AWS Budgets | Cost alarm (first two budgets free) | $0.00 |
| Total | ~$2.50 |
The line that matters: enrichment
The firmographic lookup is the only line that scales straight with new traffic, so the design works hard to keep it small. Two decisions from Part 3 do most of that work. First, personal and free email domains are skipped entirely — a gmail or outlook lead is never looked up, because there’s no company behind it, and for many small businesses that’s a meaningful slice of inbound. Second, every successful lookup is cached per domain, so the repeated companies — several enquiries from the same firm over a month — are paid for once, not each time. At 1,000 leads, after skips and cache hits, you might pay for a few hundred genuine lookups, which at typical per-lookup pricing lands around a dollar. The exact figure depends on your provider; if yours is dearer, this is the line to watch, and the cache is the lever.
Bedrock is the second variable line, and it stays small for the same structural reason the whole system stays cheap: the model only fires on the fuzzy slice. Most leads are normalised by plain Python with no model call, deduped by an exact key with no model call, and passed by the junk filter on deterministic signals alone. Only the awkward names, the ambiguous near-matches, and the borderline junk reach Haiku 4.5 — a fraction of leads, each a small, cheap call. That’s why the model line is cents-to-a-dollar, not the headline cost.
At ten times the volume
Push to about 10,000 leads a month and the bill lands near $21 — and the shape is the point. The enrichment API and Bedrock scale roughly with traffic, so those two lines do most of the growing (toward ~$9 and ~$9 respectively, before any volume discount your provider might offer). DynamoDB, S3, SES, and CloudWatch tick up modestly into the low dollars combined. Lambda and SQS may finally edge past the free tier into pennies. And Secrets Manager stays at exactly 40 cents, because it’s one key whether you process ten leads or ten thousand.
That’s the serverless dividend in one sentence: the fixed pieces barely move, and the bill you grow into is almost entirely the two services that genuinely do per-lead work. There’s no step-change where you suddenly need a bigger instance, and an AWS Budgets alarm sits on top of the whole thing so that if a runaway loop or a provider pricing change ever pushes the bill past a threshold you set, you hear about it the same day rather than at the end of the month.
Why this shape
- Cost follows work. Event-driven and serverless throughout, so an idle form costs nothing.
- Two lines, watched closely. The enrichment API and Bedrock are the only things that scale with traffic — everything else is rounding.
- The cache is the cost lever. Per-domain caching and skipping personal domains turn a per-lead enrichment cost into a per-new-company one.
- The model is rationed. Bedrock fires only on the fuzzy slice, which is exactly why it’s a small line and not the headline.
- A Budgets alarm guards the edges. If a loop or a price change spikes the bill, you find out the same day.