The Contact Decay Playbook: Dated Sample to Per-Segment Refresh Interval
Draw a dated, stratified sample, grade employer, title, email and phone against public evidence, and set a per-segment refresh interval with a confidence bound.
Key takeaways
- Much of the threefold spread in published contact decay rates comes from arithmetic: a 3.6% monthly email rate quoted as 43% a year compounds to 35.6%, and a 5.5% monthly title rate quoted as 65.8% compounds to 49.3%.
- BLS median tenure of 4.1 years implies a 15.5% annual employer-change rate and a 7.5-month refresh interval at a 90% accuracy floor, but this is only a prior because observed one-year churn (20.6%) is 1.33 times what a constant hazard predicts.
- A 100-record sample with 30 stale records gives a Wilson 95% interval of 21.9% to 39.6%, too wide to set a refresh interval; a 30% stale stratum needs about 323 records for a margin of plus or minus 5 points.
- In Refolk's index, 25-profile samples of Account Executives gave Wilson intervals of 44.5% to 79.8% (US) and 60.9% to 91.1% (UK), which overlap by about 19 points, so samples that small cannot tell two markets apart.
- A single re-check is current-status data, so fit a constant hazard with lambda = -ln(1 - p)/t per age band and reserve Kaplan-Meier for evidence that dates the change itself.
- Set each refresh interval as T = -ln(A)/lambda using the upper confidence bound of lambda, then test it every quarter on records sitting exactly at their interval.
This playbook is for recruiting operations, revenue operations, and anyone who has to defend how often person records get re-checked. It takes you from a dated, stratified sample of your own CRM or ATS records to a measured monthly decay rate for each field and segment, with a confidence interval, and then to a written refresh interval for each segment plus a quarterly test that shows whether the interval still holds. Planned well, the fieldwork fits in about a week.
Why do published contact decay rates disagree by a factor of three?
Mostly because of arithmetic and definitions, not because the underlying data disagrees. Vendor pages quote anywhere from about 22% to 70% a year, but two of the high figures are monthly rates multiplied by 12, and the highest is a union of every field rather than any one field's rate.
Here is what the most-quoted figures actually are once you trace them:
| Published claim | What it actually is | Corrected reading |
|---|---|---|
| Email ~3.6%/mo, "~43%/yr" | Monthly rate x 12 | 35.6%/yr compounded |
| Title 5.5%/mo, "65.8%/yr" | Monthly rate x 12 | 49.3%/yr compounded |
| 70.8% "some change" in 12 mo | Union of all fields | Not a per-field rate |
| 2.1%/mo, 22.5%/yr | Compounded correctly | Method not public |
| "70.3%/yr, per Gartner" | Traced by a vendor | No Gartner source found |
Even after cleanup, the per-field ranges stay wide. Published annual figures run from 15% to 65.8% for title and from 15% to 42.9% for phone, and most pages give no methodology at all. The email side has bigger studies behind it: one verification vendor analysed more than 11 billion addresses and reported at least 23% decay a year, down from 28%, and another studied 826,000 addresses verified two or more times. Both measure deliverability only. Neither tells you whether the person still works where your record says they do.
The deeper problem: even a perfectly computed vendor rate describes the vendor's list, not yours. Your segment mix, your record ages, and the way your team defines "changed" all move the number. That is why you measure.
What does the tenure prior predict, and why is it only a prior?
US Bureau of Labor Statistics (BLS) tenure data gives a sanity check for the employer field: a median tenure of 4.1 years converts to about a 15.5% annual chance of employer change and a 7.5-month refresh interval at a 90% accuracy floor. It is a prior to compare against, never the answer, because real job-change risk is front-loaded.
A prior here means an outside estimate you hold before measuring, used to catch results that are implausible. The conversion assumes a constant hazard, the monthly rate at which a still-true field turns false:
- lambda = ln 2 / median tenure (in months)
- monthly change probability = 1 - e^(-lambda)
- annual change probability = 1 - 0.5^(1 / median in years)
- refresh interval at accuracy floor A: T = -ln(A) / lambda
Applied to BLS Employee Tenure Table 5:
| Segment | Median tenure (yrs) | Implied annual change | Refresh at 90% floor |
|---|---|---|---|
| All workers | 4.1 | 15.5% | 7.5 mo |
| Private sector | 3.9 | 16.3% | 7.1 mo |
| Management occupations | 6.1 | 10.7% | 11.1 mo |
| Ages 25 to 34 | 3.0 | 20.6% | 5.5 mo |
| Leisure and hospitality | 2.4 | 25.1% | 4.4 mo |
The medians are from BLS; every other column is derived. Three limits apply. The table covers the employer field only. BLS measures time elapsed in the current job, not completed job spells. And it describes US workers, so it is a weak prior for other markets.
The biggest limit is the constant-hazard assumption itself. At a 4.1-year median, a constant hazard predicts that 15.5% of workers have been in their job a year or less. BLS observed 20.6%.
One more use of the prior: it absorbs much of the most-cited vendor total. If employer change alone accounts for about 15.5% a year, a 22.5% all-field figure leaves roughly 7 points for email, phone, and title drift among people who stayed put. That decomposition is derived and unverified, but it is a useful check on your own per-field results. To keep the prior current, pull the latest release of BLS Table 5 and recompute the columns above with the same formulas.
What counts as stale? The per-field evidence standard
A field is stale when dated public evidence, newer than the record's last verification, shows the stored value no longer describes the person. It is current when dated evidence confirms it, and unresolvable when no adequately dated evidence exists. No public framework sets this standard per field for contact records, so you write it yourself, before fieldwork starts.
The vocabulary comes from data quality practice. DAMA defines accuracy as "the degree to which data correctly describes the 'real world' object or event being described", and classes currency, latency, and volatility under timeliness. What you are measuring is volatility: how fast a once-accurate value stops describing the person.
| Field | Graded stale when | How it lies |
|---|---|---|
| Employer | Dated evidence of a different employer | Profile lag shows a false "current" |
| Title | A change the rubric calls material | Formatting variance ("Sr. AE") looks like change |
| Was deliverable, now undeliverable | Catch-all domains return a false "valid" | |
| Phone | Rubric-defined evidence it no longer reaches the person | No published standard exists |
Email is the only field with a published definition: an address verified Deliverable that later verifies as Undeliverable, Accept-All, or Unknown. I recommend departing from it on one point. Grade Accept-All and Unknown as unresolvable, keep them out of the denominator, and report their share separately. Whichever convention you choose, write it into the policy, because it moves the measured email rate.
Copy this rubric and log schema into the measurement workbook before anyone opens a record:
GRADES (one per field, per record)
CURRENT dated evidence after last-verified date confirms the stored value
STALE dated evidence after last-verified date shows a different value
UNRESOLVABLE no evidence, undated evidence, evidence older than last-verified, or catch-all / unknown email result
FIELD RULES
Employer stale = different legal employer; acquisitions and renames graded current if the person did not move
Title stale = material change only (e.g. Account Executive -> VP of Sales, Founder, COO)
not stale = seniority prefixes, abbreviations, punctuation ("Sr. AE" vs "Account Executive")
Email stale = previously deliverable, now undeliverable
unresolvable = accept-all or unknown verification result
Phone stale = [write your evidence rule here before fieldwork]
LOG ROW (one row per field checked)
record_id | segment | age_band | field | prior_value | observed_value | grade | evidence_url | evidence_date | grader | check_date | second_grader | second_gradeReplace the example material-change list with your own, and freeze it before fieldwork starts.
How many records do you need per stratum?
Between about 35 and 369 per stratum at 95% confidence, depending on the stale share you expect and the margin you need. The familiar "pick 100 records" method, with 30 found stale, gives a Wilson 95% interval of 21.9% to 39.6%, which is too wide to set an interval anyone should defend.
A stratum is a subgroup sampled separately: here, segment crossed with record age band (0 to 6, 6 to 12, 12 to 24, and 24+ months since verification). The planning formula is n = z^2 p(1 - p) / E^2 with z = 1.96, where p is the expected stale share and E the margin. For small strata, apply the finite population correction (FPC), n / (1 + (n - 1)/N), which shrinks the requirement when the stratum itself is small.
| Expected stale share | n for +/-5 pp | n for +/-10 pp | +/-5 pp, stratum of 1,000 |
|---|---|---|---|
| 10% | 139 | 35 | 123 |
| 20% | 246 | 62 | 198 |
| 30% | 323 | 81 | 245 |
| 40% | 369 | 93 | 270 |
For the interval itself, use Wilson, not the textbook Wald interval. Brown, Cai and DasGupta found that the Wald interval "suffers from particularly erratic coverage properties, and cannot be recommended for general use". Wilson keeps coverage close to nominal even for small samples, while Wald stays below target even for large ones.
To show what undersized strata cost, I drew 25-profile samples from Refolk's index of professional profiles and checked how many people's current title is literally the searched title:
| Segment | Population in index | Title matches search | Wilson 95% CI |
|---|---|---|---|
| US Account Executive | 248,476 | 16/25 (64%) | 44.5% to 79.8% |
| UK Account Executive | 17,905 | 20/25 (80%) | 60.9% to 91.1% |
| US Software Engineer | 353,257 | 23/25 (92%) | 75.0% to 97.8% |
The US and UK Account Executive intervals overlap by about 19 points, so at n = 25 no difference between the markets can be claimed, even though the point estimates differ by 16 points. The non-matches matter too: the 9 US records that differed included VP of Sales, President, COO, and Founder, which are real moves, alongside variants that may be formatting only. That is exactly the distinction the rubric has to settle in advance.
The per-stratum n is the real cost driver. My rule of thumb: buy plus or minus 5 points for the strata that carry most of your volume or your budget argument, and accept plus or minus 10 points for the rest. FPC only helps when a stratum is genuinely small. A segment of 17,905 records gets almost nothing from it.
The decay measurement procedure, step by step
Eight steps, roughly one week of elapsed work for an ops lead, an admin, a DPO, two researchers, and an analyst. All durations are planning estimates; no source publishes timings, so track your own and adjust next time.
From dated sample to written refresh interval
- Write the per-field grading rubricWith the data steward, define current, stale, and unresolvable for employer, title, email, and phone, and list which evidence counts. About half a day; done when two reviewers would grade the same record the same way.
- Inventory verification dates into three binsThe CRM or ATS admin sorts every record into true last-verified date, created date only, or no date. About half a day; done when the count in each bin is recorded.
- Stratify and size the sampleBuild strata as segment by age band, set n per stratum from the sample-size table, and draw with a recorded random seed. About half a day; done when the sample file and seed are frozen.
- Clear the legal basis and freeze the log schemaWith the DPO, confirm lawful basis and the Article 14 position, and fix the log fields. Half a day to a day; done when the DPO has signed off.
- Re-check fields blind against public evidenceResearchers grade every sampled field without seeing the stored value where possible, and a second grader re-checks about 10% of records. Two to three days; done when every field has a grade and evidence and the agreement rate is reported.
- Estimate stale share and hazard per stratumCompute the stale proportion per field and stratum with a Wilson interval, then lambda and half-life, and compare employer results with the BLS prior. About half a day; done when there is a table of lambda with confidence bounds.
- Convert each rate into a refresh intervalApply T = -ln(A)/lambda using the upper confidence bound of lambda. About two hours; done when the written policy lists an interval per segment.
- Re-measure at the interval every quarterSample records sitting exactly at their interval and test whether the observed stale share is consistent with the predicted 1 - A. About a day per quarter; done when a pass or fail is recorded.
On step order. Sources disagree on where the legal check belongs. Compliance-led teams run step 4 first, and if your DPO prefers that, do it; nothing in steps 1 to 3 touches external data.
On the legal check. Article 5(1)(d) requires personal data to be "accurate and, where necessary, kept up to date", and what counts as a reasonable step depends on the nature of the data and its use, which is a decent argument that measuring decay is part of meeting the principle. Article 14 applies to data obtained from publicly available sources, with notice due within a reasonable period and no later than one month, or at first communication if that is earlier. Whether a re-check that finds a new employer counts as newly obtained data that restarts that clock is not established. Put the question to counsel in writing. No public source sets a logging schema for a measurement exercise either. The nearest precedent is the ICO checklist instruction to "record the source of all such information", which comes from law-enforcement guidance but is the right instinct: every grade carries an evidence URL and an evidence date.
On fieldwork. Step 5 is where the week goes. Hand-checking employer and title for several hundred records means searching LinkedIn, GitHub, and the open web one name at a time, and it is easy to drift into grading whatever turns up first. Refolk cuts that search time: a researcher asks in plain English for the population a stratum covers and gets back profiles with current employer and title to compare against the stored values, while still logging the evidence URL and date per field as the schema requires.
On the alternative you will be offered. Vendor pages suggest you "verify your list at two points six months apart and use the difference". That works for email deliverability if you can afford to verify the whole list twice. It gives no per-segment interval, says nothing about employer or title, and invites the linear annualisation error from the first section.
How do you estimate decay when records have different ages?
Treat each re-check as current-status data: you learn whether the field changed by the time the record reached age t, not when it changed. Fit a constant hazard per stratum, using lambda = -ln(1 - p)/t when ages in the stratum are similar, and keep Kaplan-Meier for cases where the evidence dates the change itself.
Current-status data, also called case-1 interval censoring, is what you get from a single look at each record: a yes or no at a known age. For interval-censored data, the Kaplan-Meier estimate cannot be computed, and forcing it produces biased curves. The Turnbull estimator generalises Kaplan-Meier to censored and truncated data if you want a nonparametric curve. For a refresh policy, a one-number hazard per stratum is usually enough.
Choosing the decay estimator
The math, all derived rather than sourced:
- Closed form, similar ages. lambda = -ln(1 - p) / t, with p the stale share among resolvable fields and t the band's typical age in months.
- Likelihood, spread ages. Choose lambda to maximise the sum over records of y_i ln(1 - e^(-lambda t_i)) - (1 - y_i) lambda t_i, where y_i is 1 if stale and t_i is that record's age. It is a one-parameter solve; a spreadsheet solver handles it.
- Half-life. ln 2 / lambda, the age at which half of records in the stratum have that field stale.
- Confidence bound. Within an age band, convert the Wilson bounds on p through the closed form. The upper Wilson bound gives the upper bound on lambda.
Stratifying by age band also tests the constant-hazard assumption. If the 0 to 6 month band shows a clearly higher lambda than the 24+ band, with non-overlapping intervals, the hazard is front-loaded, as the BLS comparison suggests it will be. In that case set the interval from the band your refreshed records will actually sit in, which after a refresh is the youngest one.
Records with no verification date. No public source describes how to handle these, so this is a derived convention. Use the created date as the earliest possible verification date. Since the true verification happened on or after creation, this overstates exposure, and the hazard you estimate is a lower bound. Report these records as their own stratum and never pool them with dated records.
Finally, compare every employer-field lambda with the BLS prior for the closest segment. A measured rate far below the prior usually means profile lag is producing false currents, not that your contacts are unusually loyal.
How do you convert a decay rate into a refresh interval?
Use T = -ln(A) / lambda, where A is the accuracy floor you commit to (for example 0.9, meaning at least 90% of a field still current at refresh time) and lambda is the upper confidence bound of the stratum's hazard. Using the upper bound is what makes the interval defensible: it is the shortest interval the data plausibly requires.
From measured stale share to written interval
- Stale shareResolvable stale fields over resolvable fields, per stratum, with a Wilson interval
- Hazardlambda = -ln(1 - p)/t, or the likelihood fit across ages
- Upper boundConvert the upper Wilson bound into the upper bound on lambda
- IntervalT = -ln(A)/lambda at the chosen accuracy floor
- Policy and testWrite T per segment and re-test it quarterly at that age
A worked example using the "pick 100" numbers. Suppose the 100 records were all about 12 months past verification and 30 were stale. The point estimate is lambda = -ln(0.7)/12, about 0.030 a month, a half-life of about 23 months, and an interval at a 90% floor of about 3.5 months. The upper Wilson bound is 39.6%, which gives lambda of about 0.042 and an interval of about 2.5 months. That one-month gap is the price of an undersized sample, and finance should see it stated plainly.
Record the result in a form someone else can audit:
Segment: [e.g. US Account Executives] Field: [employer / title / email / phone] Sample: n = [ ], drawn [date], seed [ ], age band [ ] Resolvable fields: [ ] Unresolvable: [ ] ([ ]%), reported separately Stale share p: [ ]% (Wilson 95%: [ ]% to [ ]%) Hazard lambda (per month): point [ ] upper bound [ ] Half-life (months): ln(2) / lambda = [ ] Accuracy floor A: [0.90] Refresh interval T (months): -ln(A) / lambda_upper = [ ] BLS prior for comparison: [ ] months at 90% (employer field only) Email convention: accept-all and unknown graded unresolvable Grader agreement (10% check): [ ]% Next re-measurement: [quarter] Approved by: [ops lead] / [DPO]
One block per segment; attach the stratum table and the evidence log as appendices.
A refresh interval you cannot re-test is a guess with a spreadsheet attached.
How decay measurement goes wrong
Most bad decay numbers fail in one of eight predictable ways, and each one has a cheap check. Read this section before step 5 and again before step 6.
- Linear annualisation. Monthly rates multiplied by 12 turn 3.6% into "43%" and 5.5% into "65.8%"; compounded, they are 35.6% and 49.3%. What it looks like: an annual figure that is exactly twelve times a monthly one. Check: annual = 1 - (1 - m)^12.
- Catch-all graded as valid. A catch-all domain accepts every address, so an SMTP "valid" result is a false current. One large verification study found over 1 billion catch-all addresses, so this is not an edge case. Check: grade them unresolvable and report them separately.
- Title variance graded as decay. "Sr. AE" versus "Account Executive" is formatting, not change. In Refolk's index, 9 of 25 US Account Executive profiles differed from the searched title, and some of those differences may be normalisation rather than moves. Check: the rubric's material-change list, frozen before fieldwork.
- Wald intervals on small strata. Wald coverage is erratic, and at n = 25 even Wilson intervals are too wide to separate markets. Check: Wilson intervals and the per-stratum sizes in the sample-size table.
- Kaplan-Meier on current-status data. When the change date is unknown, Kaplan-Meier gives biased curves. Check: use it only when the evidence dates the change, such as a start date for the new role.
- Unknown-date records pooled in. Treating creation as verification inflates exposure and deflates lambda across the whole estimate. Check: keep them as a separate stratum labelled as a lower bound.
- Public profile lag treated as truth. People update profiles late, which produces false current grades and a hazard that is too low. How common this lag is remains unverified, so do not assume a correction factor. Check: require evidence dated after the stored verification date, and treat a measured employer rate well below the BLS prior as a warning.
- The BLS prior used as the answer. A constant hazard at a 4.1-year median predicts 15.5% of workers at a year or less of tenure; BLS observed 20.6%. Check: use the prior only to flag implausible results, never to set the interval.
Keeping the interval current: the quarterly re-measurement
Once a quarter, spend about a day sampling records that sit exactly at their refresh interval and test whether the observed stale share is consistent with the predicted 1 - A. If the Wilson interval of the observed share contains 1 - A, the interval passes; if the whole interval sits above it, shorten the refresh; if it sits below, you have room to lengthen it.
This sample can be smaller than the original, because you are testing one prediction per segment rather than estimating from scratch. Use the plus or minus 10 point column of the sample-size table as a floor. The same rubric, log schema, and email convention apply, or the comparison means nothing. Refolk speeds the quarterly re-check the same way it speeds the first one: ask for the segment in plain English and compare current employer and title against the stored values, logging evidence dates as you go.
Re-run the full measurement, not just the quarterly test, when any of these happen: a segment fails two quarters running, your segment mix shifts materially, you change the rubric, or BLS publishes a new tenure release that moves the prior for a segment you rely on.
Before you call the interval done
- The rubric defines current, stale, and unresolvable for all four fields, and was frozen before fieldwork.
- Every record is assigned to a verification-date bin, and the bin counts are recorded.
- The sample was drawn with a recorded seed, and each stratum meets its planned n.
- Unknown-date records are reported as their own stratum and labelled as a lower bound.
- The DPO has signed off on the lawful basis, the Article 14 position, and the log schema.
- Every graded field has an evidence URL and an evidence date later than its last-verified date.
- A second grader re-checked about 10% of records, and the agreement rate is reported.
- Catch-all and unknown email results are excluded from the denominator and reported separately.
- All annual figures are compounded from monthly rates, never multiplied by 12.
- Every interval uses the upper confidence bound of lambda, and the policy states the accuracy floor.
- The first quarterly re-measurement is scheduled, and the pass or fail rule is written down.
Questions practitioners ask
How often should I re-verify contact data in my CRM?
Re-verify each segment at T = -ln(A)/lambda, where lambda is your measured monthly decay hazard for that segment and A is the accuracy floor you commit to. Until you have measured, the BLS tenure prior gives a sanity check for the employer field at a 90% floor: about 7.5 months for all workers, 4.4 months for leisure and hospitality, and 11.1 months for management occupations. Treat those as starting points to test, not as the policy.
How many records do I need to sample to measure data decay?
Per stratum, between about 35 and 369 records at 95% confidence, depending on the stale share you expect and the margin you need. A stratum expected to be 30% stale needs 323 records for plus or minus 5 points, or 81 for plus or minus 10. If a stratum holds only 1,000 records, the finite population correction cuts 323 to 245. The total cost is per-stratum n multiplied by the number of strata.
What do I do with records that have no last-verified date?
Use the created date as the earliest possible verification date and put these records in their own stratum. Because the true verification happened on or after creation, this overstates how long the record has been exposed, so the hazard you estimate is a lower bound. Never pool these records with dated ones. Going forward, add a last-verified date field and write to it every time a field is confirmed.
Why not just use a published vendor decay rate?
Published annual figures disagree too much to defend: from 15% to 65.8% for title and 15% to 42.9% for phone, mostly with no methodology. Some are monthly rates multiplied by 12, one is a union of all fields, and one widely repeated figure attributed to Gartner could not be traced to any Gartner source. None reflects your segment mix or how old your records are.
Should catch-all email addresses count as decayed?
No. Grade them unresolvable, keep them out of the denominator, and report their share separately. A catch-all domain accepts every address, so a valid result proves nothing, and one large verification study counted over 1 billion catch-all addresses. The one published email decay definition counts Accept-All as decayed, so state in your policy which convention you used, because it moves the measured rate.
Does re-checking records against public profiles create GDPR obligations?
It can, and you should clear it with your DPO before fieldwork. Article 5(1)(d) requires personal data to be accurate and, where necessary, kept up to date, and Article 14 applies to data obtained from publicly available sources, with notice due within a reasonable period and no later than one month. Whether finding a new employer counts as newly obtained data that restarts that clock is not established and needs counsel.
Try it on the search you came here for
Stop building boolean strings. Just describe the person.
Type one sentence. I plan the search, read GitHub, public LinkedIn and Crunchbase records, and the open web as it is right now, and hand back a ranked list with the reason next to every name.
01Describe them
One plain sentence. Role, city, stack, stage, whatever matters to you.
02I read the web live
GitHub, public LinkedIn and Crunchbase records, the open web. Not a database that went stale last quarter.
03You read the shortlist
Ranked, with the reasoning under every name. Open a profile, ask a follow-up, narrow it down.
- Staff backend engineers in NYC who shipped Rust in production
- Series A fintechs in SF under 50 people, growing headcount this year
- Maintainers of fast-growing Rust web frameworks on GitHub
- No boolean, no filters, no seat to buy. One box.
- Read at search time, so a profile updated yesterday counts today.
- Every step visible as it runs, every name with its reason.
500 free credits on sign-up. No card, no demo call. See real searches.