Disclosure first
I sell the spreadsheet this is written into. Concretely:
-
Job-Pipeline.xlsxships in my $6 Habit + Budget Tracker Pack, and the follow-up emails below come from thefreelance-contract-template.mdandinvoice-template.htmlin my $9 Freelance Business Kit. I have no customer results to quote: the store has made $0.00, so there is not a single testimonial in this post and I am not going to imply one. - An AI assistant drafted this post from two guides I published on my own site, and I read it before publishing. The post itself carries a "fully AI generated" disclosure set on the article, not just this sentence.
- Every formula, every stage name and every email line below is copied from those pages, not paraphrased. You do not need to visit them to use this; the arithmetic and the vocabulary are all here.
- Nothing here is legal advice or career-services advice. The invoice clauses are paperwork I fill in and a process that worked for me.
Why these two sit in one post
Last month I wrote the pipeline sheet up twice: once as a job-search tracker, once as a freelance invoicing follow-up sequence. People read them as two different productivity tips. They are one idea applied twice, and the idea is not "track things". It is:
Measure only over outcomes that have been decided, and decide your vocabulary before you type anything.
That is the whole thing. The rest of this post is the arithmetic that makes it work, the emails that make it actionable, and the failure modes that kill it by week three.
Part one: the one number in a job search
The nine columns
A job-search tracker needs the same nine fields a sales pipeline needs. This is the actual header row of the file I ship:
Date added | Prospect | Source | Service | Value $ | Stage | Next action | Next date | Won/Lost
Renamed for applications, nothing else changes:
-
Date added- when you sent it. Drives "how long has this been open". -
ProspectbecomesCompany. -
Source- where you found the role. This is the column that later tells you which channel converts, and it is the one people skip. -
ServicebecomesRole(the exact posted title, because that is what you get searched for). -
Value $- for a salaried role, the midpoint of the posted band, or blank. It keeps the open-pipeline total honest about what is actually live. -
Stage- a dropdown, not free text. More on this in a second, this is where trackers die. -
Next actionandNext date- the pair that stops the sheet becoming a graveyard. -
Won/Lost- the outcome, filled when the stage reaches a decision.
The stage vocabulary
The list in the shipped file is eight values, in this order:
Lead, Contacted, Replied, Call booked, Proposal sent, Follow-up, Won, Lost
Mapped one-for-one onto searching, all eight:
Lead -> Applied
Contacted -> Reached out to them
Replied -> Recruiter replied
Call booked -> Screen call
Proposal sent -> Interview or assessment
Follow-up -> Chasing them
Won -> Offer
Lost -> Rejected or no response
The dropdown is not decoration. It is what makes the percentages possible: COUNTIF matches text, so if "Stage" can be typed as anything ("phone screen??", "hearing back soon", "nope") the summary block reads zero and you conclude the method does not work. It does; your vocabulary just drifted.
The win rate, and why the denominator is the whole design
The formula in cell E107 of that sheet:
=IFERROR(COUNTIF(F4:F103,"Won")/(COUNTIF(F4:F103,"Won")+COUNTIF(F4:F103,"Lost")),0)
Read the denominator: Won plus Lost only. Open applications are deliberately excluded. That is the difference between a number you can act on and a number that just makes you feel bad.
If you divide offers by everything you ever sent, your rate falls every single day for reasons outside your control, because the applications you sent this morning are sitting in the pile with no outcome yet. That version punishes you for starting a search. By week three it is unfalsifiable, no result can improve it, and people abandon the sheet.
Counting only decided outcomes fixes the horizon. Made-up numbers to show the arithmetic, not a real dataset: 1 offer out of 12 decided outcomes is 8%, and it stays 8% whether you have 3 more applications in flight or 30.
The two summary cells above it are the rest of the engine:
E105 =SUMIF(F4:F103,"Proposal sent",E4:E103)+SUMIF(F4:F103,"Call booked",E4:E103)+SUMIF(F4:F103,"Replied",E4:E103)+SUMIF(F4:F103,"Contacted",E4:E103)+SUMIF(F4:F103,"Lead",E4:E103)+SUMIF(F4:F103,"Follow-up",E4:E103)
E106 =SUMIF(F4:F103,"Won",E4:E103)
E105 is open pipeline value, E106 is won value. Both match on the same eight words.
IFERROR exists because on day one the denominator is zero. Without it the cell shows #DIV/0!, which is the exact moment a personal tracker dies, because a wall of spreadsheet errors reads as "you are doing it wrong" rather than "nothing has concluded yet".
The number that tells you what to fix
Win rate alone is too coarse to act on. Break it into transitions. Each is a ratio of counts off the same Stage column:
- Applied to screen call. Your resume and your targeting. If 40 applications produce fewer than a couple of callbacks, more interviews will not fix it; either the document fails the first gate or the role set is wrong.
- Screen call to onsite or interview. How you talk about your work in three minutes, not the document.
- Interview to offer. The interview itself, or your rate at salary negotiation.
- Source, then applied, then screen. Which channel actually converts. Two weeks of this column usually kills a platform habit that was never working.
Two rules that keep this from becoming noise: only compute a transition once that stage has double-digit counts, and remember that a 1-in-1 conversion rate is not a rate. The failure mode of a personal pipeline is not the arithmetic. It is acting on three data points.
Three things that keep it alive past week two
- Every open row has a
Next actionand aNext date, or it is closed. A blank next-date is the honest signal for "I am pretending this is still going". Mark itLostand move on; your win rate gets more informative, not less. An unanswered application after 30 days is aLost, not an eternal "in progress". - Ten minutes a week, not daily. Stages move on the employer's clock, so daily updates just make the numbers twitchy.
- Enter rows inside the range the sheet is wired for: rows 4 to 103. The dropdown and all three formulas start at row 4 and stop at row 103, so an application logged in row 2 or row 104 is invisible to the maths and nothing warns you.
One trap I should flag because it is my own product's fault: do not rename the eight values inside the Stage column when you adapt the file for applications. The summary formulas match those words as text, and because the win rate is wrapped in IFERROR, renaming them makes it quietly read 0 instead of telling you it broke. The file is documented as a freelance and sales pipeline, not as a job-search product; the adaptation is three header labels and one habit. It is also a desktop Excel file, and I have not tested it in Google Sheets, LibreOffice or Numbers.
Part two: the freelance version
The same denominator logic shows up in invoice chasing, in a place nobody expects: the dates are the metric, and the paperwork defines the vocabulary.
Three numbers have to exist before you send anything
In the contract I use, the payment section says this, brackets being what a seller fills in:
Late payments accrue [1.5]% per month. Provider may pause work
on invoices more than [10] days overdue after written notice.
And one line on the invoice itself, under the total:
Late payments: Invoices unpaid after [NET] days accrue
[X]%/month late fee.
Three things must be numbers before anything goes out: the deposit (I use 50% before work begins), the net terms (15 days is my default; "net 30" is a month of free financing you did not agree to give), and the late-fee percentage. If those are filled in, every message below is just a reminder of something already agreed. If they are blank, your first follow-up turns into a negotiation you are not prepared for.
The one-line test: look at your last invoice. If a stranger could read it and tell you the exact date the late fee starts and the exact rate, it is ready. Otherwise fix the template before chasing anyone.
Four dated messages, each with one job
A sequence beats one angry email because each message has exactly one job and each one cites something the client already signed.
Day 1, the reminder. Short, friendly, re-attaches the invoice so nobody searches for it. Subject: Invoice #[n] - [Project], due [date]. Body in essence: quick note that invoice #[n] for [amount] was due [date] and has not come through, re-attached in case it got buried, payment details are on the invoice, if it is already in process ignore me. Do not apologise for asking, do not explain what you did, do not add a deadline. There is nothing to escalate yet; you are confirming a fact.
Day 7, the accrual notice, with the arithmetic. This one does one new thing: it states the number the contract already promised, in dollars, so waiting stops being abstract. Subject: Invoice #[n] - now 7 days overdue. Body in essence: following up on invoice #[n], due [date], now 7 days outstanding; under section [x], late payments accrue [1.5]% per month, so on [amount] that is about $[amount x 0.015] for a full month past due; I would rather not add it, tell me if this is being processed this week and I will leave it at the invoice total; happy to re-send payment details or split the invoice if that is the blocker.
The math on my defaults: 1.5% per month on a $2,000 invoice is $30. That is a low, ordinary rate rather than a punishment rate, and a client or a court may still read it differently, which is exactly why it has to be written down before there is a dispute. The "offer to split" line matters more than it looks: a client who cannot pay the whole thing is the client most likely to pay nothing, and a partial payment is still a payment.
Day 11, the written pause notice. The clause says work may pause on invoices more than 10 days overdue after written notice, which means the notice has to exist in writing before the pause is legitimate. This email is that notice. It is not a threat, it is a schedule change. Subject: Work paused on [Project] pending payment. Body in essence: invoice #[n] is now 11 days overdue; per section [x] I am giving written notice that I am pausing work as of today; nothing here is personal and nothing is cancelled, as soon as payment lands work resumes the same day, and the milestone dates in Exhibit A shift by the number of paused days (day-for-day extension for client-dependent delays); if there is a problem with the invoice itself, tell me what it is and I will fix it today.
Three details do the work: it states the date, so the pause is a fact rather than a mood; it says resumes the same day, so the client's incentive is to pay rather than argue; it names the day-for-day extension, so the record shows why dates moved. Then actually stop. Pausing work while quietly continuing is the one move that makes every future notice in this sequence worthless.
Day 30, final notice, and get a date in writing. A month overdue is no longer a payment problem, it is a relationship decision. This message asks for one thing: a date, in writing. Subject: Final notice - invoice #[n], [amount], 30 days overdue. Body in essence: work has been paused since [date] under section [x]; please reply with either (1) a payment date within the next 7 days, or (2) the reason you are withholding payment so I can address it; if I do not hear by [date] I will treat this as a termination under section z, invoice for all work performed to date plus any non-cancellable expenses, and hand the file to [small-claims / collections]. Either answer is fine; silence is the only outcome I cannot work with.
Get one distinction right or the whole thing reads as a bluff: the cancellation (kill) fee only applies if they end it. If you terminate for non-payment, you invoice for work done, not the fee.
The part that is the same idea as the denominator
Send it on the 7th, not the 20th. The value of the pause lever depends on the invoice being only slightly overdue. Wait too long and you have already conceded the deadline by silence.
That is the job-search point wearing a different hat. In the tracker, an application that has been "in progress" for four months makes your numbers meaningless because you never wrote down its outcome. On an invoice, silence for four weeks makes your position meaningless because you never wrote down the date. In both cases the item is not "still open", it is unmeasured, and the fix is the same: put a threshold in the paperwork in advance, then let the date do the deciding.
Build either one in five minutes
For the job search, in a blank workbook:
- Row 3 headers:
Date added,Company,Source,Role,Value $,Stage,Next action,Next date,Won/Lost. - Data validation list on
Stagefor rows 4 to 203 with exactly:Applied,Reached out,Recruiter replied,Screen call,Interview,Chasing,Offer,Rejected/no response. - Win rate:
=IFERROR(COUNTIF(F4:F203,"Offer")/(COUNTIF(F4:F203,"Offer")+COUNTIF(F4:F203,"Rejected/no response")),0), formatted as a percentage. - Undecided count, so you can see what the rate is actually built on:
=COUNTIFS(F4:F203,"<>Offer",F4:F203,"<>Rejected/no response"). Then as the honesty check, filter for rows with a blankNext date- those are the ones you are pretending are still live. - Set a recurring 10-minute weekly sweep. Enter the row at the moment you apply, not later from your sent folder.
The three formulas above are the entire engine. A blank workbook with a dropdown gives identical output to my paid file, and I would rather you did that than bought something you do not need.
For the invoice: fill in deposit, net terms and late-fee rate in your template, then save the four messages above as snippets with the day numbers in their filenames. That is the whole system. It takes twenty minutes and it means you rarely have to invent a tone in the moment you are most annoyed.
What neither one can tell you
- A personal win rate is descriptive of your search, not predictive of it, computed from a sample of one market in one season. Anyone quoting you a universal application-to-offer percentage is guessing.
- It cannot see the other side of the pipeline. Roles where you were silently dropped, requisitions frozen mid-process, a hiring manager who decided in week one and never told you: none of it lands in your sheet. Low conversion is information about your materials and about luck you cannot measure, and the two look identical.
- A pipeline should reduce your volume, not raise it. Its useful purpose is to show you that one stage is the bottleneck, so you make fewer, better applications instead of more, worse ones.
- The invoice sequence cannot recover from a missing deposit (the leverage was gone before the invoice existed), cannot handle a scope dispute (that is a different conversation, and it is why the scope clause lists what is out of scope), and cannot force payment. After day 30 the real options are a small-claims filing or a write-off, and both are outside anything I sell.
The files, if you want them
Both methods above are written up as free pages on my site with the surrounding detail: the job-search pipeline guide has the nine columns and the full stage mapping, the invoicing guide has all four messages in full. My site is in the middle of a host change, so I am deliberately not pasting a URL here that might 429 or move; ask in the comments and I will point you at the right one.
The spreadsheets and contract templates are at https://payhip.com/MonkeyRun ($6 and $9 respectively; the coupon LAUNCH20 takes 20% off one order). The emails in this post are also in the $9 kit as editable files. If none of it is useful to you, the formulas and the four message shapes above are yours to copy; that was the point of writing it out.
Top comments (0)