Speed-to-lead for law firms: measuring and fixing response time
Almost every firm believes its lead response time is fine, and almost none of them have measured it. This is a do-it-yourself guide: how to export the data you already have from your phone system and your web forms, how to compute a median first-response time that is not flattered by your own reporting, how to segment it by hour and channel so it points at something you can fix, and what to fix first. You can do all of it in a spreadsheet, this week, without buying anything from us or anyone else.
On this page
- Why measure it yourself
- Define the metric before you pull any data
- The seven-step measurement
- Pulling the data: your phone system
- Pulling the data: web forms and chat
- Use the median, not the mean
- Segment by hour and channel
- Reading the result
- Measurement traps
- What to fix first
- Questions firms ask
- Go deeper
Why measure it yourself
There is a large body of widely repeated statistics about lead response time. Most of them trace back to a handful of studies, several of them decades old, conducted in industries with nothing in common with legal intake, and reproduced so many times that the original context has fallen off. We are not going to quote any of them at you, and we would be sceptical of any vendor who does — a number about someone else's industry is not evidence about your firm.
What is evidence about your firm is your firm's own data. You already have it. It is sitting in your phone system's call records and in the timestamps on your web form submissions, and pulling it out is an afternoon's work.
The argument for speed does not need borrowed statistics anyway. It rests on a mechanism you can verify by thinking about your own callers: someone who has just been in a collision is frequently ringing several firms from the same page of search results, in one sitting. The firm that engages first is talking to a person who has not yet spoken to anyone else. The firm that calls back on Tuesday is talking to a person who may already have signed with someone. That is not a statistic; it is a description of how a shopping process works, and it applies whether or not any published figure does.
Measuring gives you two things a statistic never will: a number that is actually about you, and a baseline against which you can tell whether anything you change afterwards worked.
Define the metric before you pull any data
Most bad measurement comes from a fuzzy definition rather than bad arithmetic. Settle these four things in writing before you export anything.
- The start event. The moment the prospective client reached out: the inbound call's start time, the form's submission timestamp, the first inbound chat message. Not the moment a record appeared in your CRM, which can lag by minutes or hours depending on how your integrations are wired.
- The stop event. The first outbound contact attempt from your firm to that person — a call placed, a text sent, an email sent. Note "attempt", not "connection". Both are worth measuring, and they answer different questions: attempts measure your process, connections measure your outcome.
- What counts as a lead. New enquiries only. Existing clients, opposing counsel, vendors, medical records requests, wrong numbers, and spam all have to come out, or your numbers will be about your switchboard rather than your intake.
- How automated touches are treated. If you already have an auto-responder, decide explicitly whether it counts as a first response. Our view: measure it separately. An instant auto-acknowledgement is genuinely useful, but letting it count as your first response will make your headline number look excellent while the caller is still waiting for a human. We sell automation, and we still think you should measure it in its own column rather than let it flatter the total.
Write these four definitions at the top of your spreadsheet. When someone questions the number in three months, the definitions are what you will need.
The seven-step measurement
This is the whole exercise. It is deliberately spreadsheet-sized — no tooling, no vendor, no integration work.
- Choose a window of at least four full weeks. Two weeks is too few: a single holiday, a courthouse closure, or one heavy advertising flight will dominate it. Four weeks gives you at least four of each weekday and four weekends, which is the minimum for the hour-of-day segmentation to mean anything. Use complete weeks, and avoid windows straddling a major holiday if you can.
- Export inbound events from every channel. Call records from your phone system, submissions from your web forms, transcripts or logs from any chat widget, and — if you use them — call records from each tracking number separately. Export them as CSV. Keep the channel as a column; you will need it in step six.
- Strip out everything that is not a new enquiry. Remove existing clients, internal calls, known vendor and courthouse numbers, calls under a few seconds, obvious spam, and duplicate submissions from the same person within a short window. Record how many rows you removed and why. This step takes the longest and it is the one that determines whether the result is trustworthy.
- Find the first outbound touch for each enquiry. Match on phone number for calls and SMS, on email address for form fills. For each enquiry, find the earliest outbound activity to that person that occurred after the start event, and record its timestamp and its channel.
- Compute the gap in minutes. One column: stop timestamp minus start timestamp, expressed in minutes. In a spreadsheet, subtracting two datetime cells gives you a fraction of a day, so multiply by 1440. Leave the cell blank rather than zero where no outbound touch was ever found — a blank and a zero mean opposite things and confusing them will wreck step seven.
- Count the never-responded rows separately. Before computing any average, count the enquiries with no outbound touch at all and express that as a share of the total. This is your no-response rate, and for most firms that have never looked, it is the most alarming number in the exercise. Do not delete these rows and do not treat them as very large gaps — report them as their own figure alongside the timing.
- Compute the median and the 90th percentile, then segment. Median first, overall, on the rows that did get a response. Then the 90th percentile. Then repeat both by channel and by hour-of-day bucket. In Google Sheets or Excel these are =MEDIAN(range) and =PERCENTILE(range,0.9).
That is it. Seven steps, one spreadsheet, and a number that is genuinely about your firm.
Pulling the data: your phone system
Every business phone system keeps call detail records, though the export lives in a different menu on every platform. Look for a section called call history, call logs, call detail records, CDR, or analytics, and find the CSV or spreadsheet export. If you cannot find it, your provider's support team can point at it in a minute — this is a routine request, not an unusual one.
The columns you need, whatever they happen to be called on your platform:
| Column | What you use it for | What to watch out for |
|---|---|---|
| Direction | Splitting inbound enquiries from your outbound responses. You need both halves in the same export to do the matching in step four. | Some systems log internal transfers as separate legs, which will produce phantom outbound calls to your own extensions. |
| From and to numbers | The join key. Everything in step four matches on these. | Formats vary within the same export — with and without country codes, with punctuation. Normalise to digits only before matching or the join will silently fail. |
| Start timestamp | The start event for inbound calls, and the stop event for your outbound attempts. | Check the timezone of the export. Many platforms export in UTC regardless of what the dashboard displays, which will destroy your hour-of-day segmentation if you miss it. |
| Duration and talk time | Separating connected calls from rings that nobody answered. | Total duration often includes ring time, so a "45 second" call may be 45 seconds of ringing. Use talk time where the export offers it. |
| Disposition or result | Identifying missed, abandoned, and voicemail calls — the rows that most often have no outbound follow-up at all. | Terminology differs wildly between platforms. Establish what each value means on yours before filtering on it. |
| Tracking number or DID | Attributing the enquiry to a campaign or source, which makes the channel segmentation far more useful. | If calls forward between numbers, the logged destination may not be the number the caller dialled. Confirm this before trusting source attribution. |
One quiet failure to look for while you are in there: abandoned calls, where the caller hung up during the ring. Depending on your platform these may not be classified as missed calls at all, and they will not have a voicemail attached, so they are invisible to a team that works from the voicemail box. They are also, arguably, your most impatient callers.
Pulling the data: web forms and chat
Form data is easier to export and harder to trust, because the timestamp you want may exist in three places with three different values.
- Start from the form tool, not the CRM. Your form builder, website platform, or landing page tool records the actual submission time. Your CRM records when a record was created, which may be later — sometimes much later if the connection between them batches, queues, or occasionally fails. If the two disagree, the form tool is closer to the truth.
- Export the raw submission list. You want the submission timestamp, the contact details, and whatever hidden fields carry source, campaign, or landing page.
- Find the first outbound touch across all channels. A form fill is often answered by email or text rather than a call, so you need outbound email and SMS activity as well as call records. Whichever came first is the stop event.
- Check your form is actually delivering. While you are here, submit your own form and confirm the notification arrives where you think it does. A meaningful share of the "slow response" problems we see on audit calls turn out to be a notification email quietly landing in a spam folder or an inbox nobody has opened since a staff change.
- Treat chat separately. A live chat handled in-session has a response time measured in seconds; a chat that becomes an offline message behaves like a form fill. Mixing them produces a meaningless average of two different processes.
Use the median, not the mean
This is the most important methodological choice in the exercise, and it is where most internal reporting goes wrong.
Response-time data is heavily right-skewed. Most responses cluster in a relatively narrow band, and then a small number of enquiries sit unanswered for many hours or several days. A mean pulls hard towards those outliers: a handful of leads that took two days can move the average of a hundred leads by a large margin, so the mean ends up describing a caller experience that almost nobody actually had. The median — the middle value when you line every enquiry up in order — describes what a typical enquiry genuinely experienced, because it is unaffected by how extreme the extremes are.
Report three numbers together, and always together:
- Median. What a typical enquiry experiences. This is your headline figure.
- 90th percentile. What your unlucky enquiries experience. This is where the fixable failures live — the median can look healthy while a tenth of your leads wait overnight.
- No-response rate. The share of enquiries that never received any outbound contact at all. This one is not a timing metric, and it must not be folded into the timing metrics, because excluding never-responded leads from a median makes a firm that ignores a fifth of its leads look faster than one that answers all of them slowly.
That last point is the trap worth restating: the more leads you drop entirely, the better your median looks. Any response-time figure quoted without a no-response rate beside it is incomplete, including any figure a vendor quotes to you.
Segment by hour and channel
An overall median tells you whether you have a problem. It does not tell you where the problem is, and a firm-wide number usually hides two or three quite different processes averaged into one.
Two segmentations do almost all the work:
- Hour-of-day, in buckets. Business hours, the evening window from close to roughly 10pm, overnight, and weekends as their own bucket. Four buckets is enough; hour-by-hour slicing produces tiny counts that bounce around meaninglessly.
- Channel. Phone, web form, and chat behave completely differently and are often handled by different people under different assumptions. Averaging them together is the most common way a real problem gets hidden.
A third cut is worth doing if your volume supports it: by source or campaign. Firms occasionally discover that their most expensive lead source has their slowest response time, because it feeds a form rather than a phone line and nobody ever noticed.
Lay the result out as a grid. Below is an illustrative example — every number in this table is invented for demonstration and is not from a real firm, ours or anyone else's. It is here to show you the shape of a useful output, not to give you a benchmark to compare yourself against. Benchmarks against invented numbers are worse than no benchmark at all.
| Segment | Enquiries | Median first response | 90th percentile | No response | What it points at |
|---|---|---|---|---|---|
| Phone, business hours | 112 | Under 1 min | 6 min | 3% | Working as intended. Nothing to fix here — resist the urge to optimise the thing that is already fine. |
| Phone, evening | 48 | 13 h | 19 h | 11% | A coverage gap, not a performance problem. Nobody is slow; nobody is there. |
| Phone, weekend | 31 | 38 h | 56 h | 16% | The longest wait in the firm and usually the highest-intent callers. Almost always the first thing to fix. |
| Web form, business hours | 67 | 2 h 40 m | 9 h | 14% | A process problem, not a coverage one. Someone is at a desk; form fills are simply not queued anywhere with urgency. |
| Web form, out of hours | 53 | 15 h | 34 h | 22% | Coverage and process compounding. The highest no-response rate in the table, and the easiest to fix cheaply. |
Reading the result
Once the grid is populated, the diagnosis is usually obvious, and it is almost always one of three shapes.
- A coverage gap. Business-hours segments look fine and out-of-hours segments are measured in hours. Nobody is underperforming — there is simply nobody there. This is a staffing or automation decision, not a management one, and it is the most common finding.
- A process gap. One channel is dramatically slower than another during the same hours. That is not about availability; it is about where enquiries land and whether anyone owns them. Form fills going to an inbox rather than a queue is the classic version.
- A tail problem. The median looks healthy and the 90th percentile is enormous. Something specific is failing for a subset — a particular tracking number that does not notify anyone, a queue that overflows at lunch, a source whose leads land somewhere nobody watches. Sort by the gap column descending and read the twenty worst rows individually. The cause is usually identifiable by row ten.
The one result that should make you stop and re-check your data is a firm-wide median under a minute across every segment including weekends. That is more likely to mean your auto-responder is being counted as a first response than that your firm is answering at 3am.
Measurement traps
Timezone drift. Exports frequently come out in UTC while the dashboard displays local time. If your evening bucket looks suspiciously busy at what should be lunchtime, this is why. Auto-responders counted as responses. Covered above, and it is the most flattering error available. Survivorship. Excluding never-responded leads from the median rewards ignoring leads. Number format mismatches. A join on inconsistently formatted phone numbers fails silently, producing "no response" rows that were actually answered promptly — always spot-check a handful of blanks by hand before reporting a no-response rate. Averaging different processes. Live chat and offline chat, or new enquiries and existing clients, mixed into one figure produce a number that describes nothing real.
What to fix first
Fix in this order, because the order is roughly cheapest-and-most-certain to most-expensive-and-least-certain. Several of these cost nothing at all.
- Fix the notification plumbing. If any form, tracking number, or chat widget is not reliably alerting a person, nothing else you do matters. Test every path yourself. This is free and it fixes the worst rows in the table more often than anyone expects.
- Give every channel an owner. Form fills that arrive in a shared inbox with no named owner are the most reliably slow enquiries in any firm. A named person and a stated target during business hours costs nothing and usually moves the web-form segment more than any technology would.
- Add a second and third contact attempt. Most intake processes make one callback attempt. If the person does not answer an unknown number — which is ordinary behaviour — the lead ages out of anyone's attention without ever being formally closed. A defined sequence with a stop rule requires no automation at all to be worth doing, though automation is what makes the fourth touch happen on a busy Tuesday. Sequence design and stop rules are covered separately.
- Shorten the ring time before voicemail. A long ring feels attentive internally and feels like abandonment to a caller. Check your abandoned-call rows and see how many hung up mid-ring.
- Cover the worst out-of-hours bucket, and only that one. Whichever segment has the longest median — usually weekends — is where coverage buys the most. Cover it narrowly, keep everything else unchanged, and re-run this measurement in a month. How that scope is configured is its own page.
- Re-measure before widening anything. Same window length, same definitions, same spreadsheet. If the segment you covered did not move, do not add more scope — find out why first.
We would rather a firm did steps one to four, found the number acceptable, and never spoke to us again than bought coverage for a problem that turned out to be a spam filter. That happens on audit calls regularly, and it is a cheaper conversation for both of us than an install that never pays back. The broader system this fits into is described on the personal injury hub page.
Questions firms ask
What is a good response time for a law firm?
We are not going to give you a number, because any number we published would be a made-up benchmark and you would be right to distrust it. The useful comparison is not against an industry figure — it is against your own segments. If your business-hours phone median is under a minute and your weekend median is thirty hours, the gap between those two is the finding, and it is entirely actionable without knowing what anyone else does.
How long does this measurement actually take?
Pulling the exports is usually under an hour. Cleaning out non-enquiry rows in step three is the bulk of the work and depends on how messy your call log is — call it half a day in total for a firm doing moderate volume. The follow-up runs are much faster, because the definitions and the spreadsheet already exist.
Should an automated acknowledgement count as our first response?
Measure it in its own column. An instant acknowledgement is genuinely useful — it tells the person they reached a real firm — but counting it as your first response will make your headline number look excellent while the caller is still waiting for a human. We build these systems and we still think the honest measurement keeps the two separate.
Our phone system will not export call records. What now?
Ask your provider's support team directly — the export usually exists but is buried, and this is a routine request. If it genuinely does not exist, you can run a manual version: log every new enquiry and every first outbound touch by hand for two weeks. It is tedious and the sample is small, but a hand-kept log with honest definitions beats a confident guess.
Can you run this measurement for us?
Yes, that is what the audit is. You bring the exports and we go through them with you and produce the segmented grid. But this page exists so that you can do it without us, and if you do it yourself and the numbers look fine, that is a completely legitimate outcome — tell us and we will not chase you.