FREE TOOL AdRails 0.8.0

Direct mail response & cost calculator

The calculator turns your last postcard drop into a response rate with a 95% Wilson interval, cost per response, cost per lead, cost per client, revenue, ROI and the break-even lead rate. Enter pieces mailed, cost per piece, responses, leads, clients and client value; everything is computed in your browser and nothing is uploaded.

Last reviewed 2026-11-06 with AdRails 0.8.0

FREE TOOL

Campaign results: response rate, cost per lead, ROI

Enter what the drop cost and what came back. The response rate arrives with a 95% Wilson interval, so you can see how much of the number is signal.

What was actually posted, not what was printed.
Print + postage + list + addressing, per piece.
Calls, scans or forms you counted as a reply.
Responses that became a real enquiry.
Signed or paid.
Gross margin, or first-year revenue if you prefer.

Runs entirely in your browser. Nothing you enter is sent anywhere.

FREE TOOL

Compare two versions

Two postcard designs, or a mailed cell against a no-mail holdout. You get the difference with a 95% interval and a p-value, not just a winner.

Pieces mailed in the A cell.
Unique, human, attributable replies.
Pieces mailed in the B cell.
Same definition of a response as A.

Runs entirely in your browser. Nothing you enter is sent anywhere.

METHOD

How are the numbers calculated?

Six inputs go in; spend, unit costs, return and a break-even threshold come out. Every figure is arithmetic you can redo on a pocket calculator, plus one interval.

01

Spend

Pieces mailed × cost per piece. Cost per piece covers everything that scaled with the drop: print, postage, the list, addressing and data prep. A designer's fixed fee does not belong in the per-piece number.

02

Response rate with an interval

Responses ÷ pieces, then a 95% Wilson score interval on the same counts. Wilson behaves sensibly at small numbers and near zero, where the textbook normal approximation produces intervals that run below 0%.

03

Unit costs

Spend ÷ responses, ÷ leads, ÷ clients. Each answers a different question: did the offer pull, did the enquiry qualify, did the sale happen. A cheap lead that never closes is the most expensive line on the sheet.

04

Return and break-even

Revenue is clients × client value; return on spend is (revenue − spend) ÷ spend. The break-even lead rate is the lead rate the drop needs to cover itself at your observed lead-to-client rate.

The same calculations run inside AdRails: mail_response returns rates by any column with 95% intervals and a verdict, mail_breakeven returns the break-even rate for a per-piece cost. selftest: mail.response selftest: mail.cac

BENCHMARKS

What is a good direct mail response rate?

There is no universal number worth quoting, so this page does not ship one. It ships the interval that says how much of your own result is signal.

A response rate is a property of a list, an offer, a format, a geography and a month — not of the medium. Swap a bought file for your own past clients and the number moves by an order of magnitude. Swap a vague flyer for a dated, specific offer and it moves again. Response varies widely across all of those dimensions, so the only defensible benchmark is one you measured on your own list.

The useful question is therefore not "is 0.8% good?" but "how much do I actually know?". Four responses from 500 pieces is a point estimate of 0.8% and a 95% interval of roughly 0.3% to 2.0%. Forty responses from the same 500 is 8% with an interval of about 5.9% to 10.8% — identical arithmetic, far more information. Read the interval before you reprint.

A number you can act on

  • One code per piece. A tracking code ties a reply to a specific mailing instead of a hunch. selftest: mail.codes
  • Bots removed. Scans from Slack, Facebook and WhatsApp link previewers are dropped, along with your own IPs and CIDRs. selftest: mail.scans
  • A verdict, not a bare percentage. Small counts come back as "too early" or "no signal yet: could still be up to X%". selftest: mail.response

Numbers that mislead

  • Counting your own test scans. The postcard program this toolkit was generalised from once counted its own test scans as responses. selftest: mail.scans
  • A list that looks clean. Foreign addresses, institutional owners and a stale suppression list all distort the denominator or the numerator. selftest: mail.hygiene
  • One drop, one decimal place, no interval. Four responses and forty get quoted with the same confidence in most spreadsheets.
UNIT ECONOMICS

How do I calculate cost per lead for postcards?

Spend divided by leads, where spend includes everything that scaled with the drop and leads counts only enquiries you can attribute.

Take pieces mailed, multiply by the all-in cost of one piece, divide by the leads the drop produced. Five hundred pieces at $0.79 is $395 of spend; three leads is $131.67 per lead. The two failure modes are almost never in the division. They are leaving list rental or data prep out of the per-piece cost, which makes the drop look a fifth cheaper than it was, and counting every phone enquiry as a lead, which flatters the numerator.

On the lead side, attribution is the whole game. A tracking code a caller reads back is the strongest signal print can produce, because nothing else survives the gap between a postcard in a mailbox and a phone call three days later. selftest: mail.codes AdRails' direct-mail codes skip 0, 1, I, L, O and U and carry a check character proven to catch every single wrong character and every swapped adjacent pair — zero misses across 4,060,000 substitutions, where standard Luhn mod 30 missed 47 adjacent swaps on the same test.

The calculator also reports cost per client, which is the figure that survives a budget meeting. Cost per lead is a marketing metric; cost per client is the one you can line up against every other channel you buy.

STATISTICS

Why show a confidence interval?

Because a rate built on a handful of responses is mostly noise, and the interval states how much.

Seven responses from 1,000 pieces is 0.7%. If the true rate were 0.4% you would often see seven; if it were 1.1% you would also often see seven. The point estimate hides that. A 95% interval puts the plausible range next to the number, so a decision to reprint 10,000 pieces rests on the range rather than the decimal point.

The zero-response case matters most. Zero out of 500 is not evidence that the rate is zero — it is evidence that the rate is low enough to be consistent with no observed replies. The verdict above quotes the upper bound instead of a point estimate, because "could still be up to 0.8%" is true and "0%" is not.

Two postcard versions need the same treatment. Comparing 1.6% against 0.7% by eye ignores that both numbers carry intervals which may overlap. The comparison tool runs a two-proportion test and reports the difference with its own interval and a p-value; AdRails' mail_compare does the same, and its mail_holdout_plan returns the sample size needed to detect a given lift at 95% confidence and 80% power, within 3% of the textbook formula. selftest: mail.response

CHANNEL COMPARISON

How do I compare direct mail with Google Ads cost per lead?

Same ruler, same window, same definition of a lead. Anything else compares two accounting systems rather than two channels.

Divide total spend by leads for each channel over the same period, counting a lead the same way in both. Google Ads spend is exact and reported by the platform; direct mail spend is the printer's invoice plus postage plus the list. Compare platform-reported ad spend against all-in mail cost and you have handicapped mail by design.

The second difference is time. Paid search produces a lead in the session; a postcard produces one anywhere from two days to six weeks later, and a drop that looks dead in week one is often simply early. Give each channel the same attribution window before ranking them.

AdRails' channel_cac tool puts cost per lead and cost per client across Google Ads, ChatGPT Ads, direct mail, lead vendors and referrals on one ruler, attributing in the order tracking code, then UTM, then what the lead said, then referrer. It can pull live Google Ads spend for a campaign, and it labels small samples "too few to judge" instead of ranking them. selftest: mail.cac

ChatGPT Ads appears as one of the channels in channel_cac; ChatGPT Ads spend can be pulled once the account is configured (AdRails 0.5.0).

LIMITS

What can't this calculator tell me?

It does arithmetic on the numbers you type. It does not check them, clean your list, count your scans or send anything.

Out of scope, on purpose

  • Whether the list was mailable. Address hygiene, institutional owners, foreign addresses and suppression lists are a separate step. selftest: mail.hygiene
  • Whether a human or a bot replied. Scan counting from your own server logs drops link previewers, unknown codes and hits before the mail date; this page does not read logs. selftest: mail.scans
  • How many pieces you need. Holdout and sample-size planning lives in mail_holdout_plan, not here. selftest: mail.response

What it does not do at all

  • No sending, no postage, no contact. Nothing in AdRails' direct-mail tools sends mail, buys postage or contacts anyone.
  • No data leaves the page. Everything is computed in your browser from the values you type.
  • No account access. The MCP tools read your own files and, for Google Ads, use your own credentials on your own machine.
MCP TOOL

Can an agent run this without a browser?

Yes. The same arithmetic ships as MCP tools in AdRails, the open-source server that runs on your machine with your credentials.

Four tools cover this page. mail_response returns response rates by any column with 95% Wilson intervals and a verdict that says "too early" or "no signal yet: could still be up to X%" instead of a misleading point estimate. mail_compare runs the two-proportion test with a difference interval. mail_breakeven takes a per-piece cost and returns the break-even response rate. channel_cac puts cost per lead and per client across channels on one ruler. selftest: mail.response selftest: mail.cac

AdRails is Apache-2.0, Python 3.11+ on the standard library, and speaks MCP to Claude Code, Claude Desktop, Cursor, Grok CLI and other clients. The current build has 82 tools with the self-test at 2,704 checks, all passing. The direct-mail category holds ten tools; they read your list, your logs and your CSV and write files you review — no mail leaves the machine.

FAQ

Straight answers.

What is a good direct mail response rate?

There is no universal figure, and a number quoted without your list, offer, format and market is a guess about someone else's business. Response varies widely by list quality, offer and season, so measure your own drop. Four responses from 500 pieces is 0.8% with a 95% interval of roughly 0.3% to 2.0% — the range is the honest answer, not the point estimate.

How do I calculate cost per lead for postcards?

Multiply pieces mailed by the all-in cost of one piece — print, postage, list, addressing, prep — to get spend, then divide by attributable leads. Five hundred pieces at $0.79 is $395; three leads is $131.67 per lead. Count a lead only when a tracking code, a dedicated number or a form ties it to the mailing, otherwise the numerator is guesswork.

Why does the calculator show a confidence interval?

Small counts are noisy. Four responses from 500 pieces looks like 0.8%, but the same underlying rate would sometimes produce two replies and sometimes eight. The 95% Wilson interval shows the range still consistent with what you observed, so you can tell a real improvement from ordinary variation before reprinting thousands of postcards.

How do I compare postcard cost per lead with Google Ads?

Put both channels on one ruler: total spend divided by leads, over the same period, with the same definition of a lead. AdRails' channel_cac tool does this across Google Ads, ChatGPT Ads, direct mail, lead vendors and referrals, attributing in the order tracking code, then UTM, then what the lead said, then referrer, and labelling small samples too few to judge.

What if the drop produced zero responses?

Zero observed responses does not mean the true rate is zero. With 500 pieces mailed and nothing back, the 95% upper bound in the calculator sits near 0.8%, so the honest statement is that the rate could still be up to 0.8%. Check address quality, the offer and that the tracking code works before changing the creative.

Can an AI agent run these calculations?

Yes. AdRails is an open-source MCP server that runs on your machine, and the same arithmetic ships as MCP tools: mail_response returns rates by column with 95% intervals and a verdict, mail_compare runs the two-proportion test, mail_breakeven returns the break-even rate, and channel_cac compares cost per lead across channels.