Export two years of job orders and placements, count starts by month and role family, and build a seasonal forecast in a spreadsheet, using AI to clean job titles, write the formulas and sanity-check the pattern. Then convert forecast starts into the number of ready candidates you need, using your own acceptance and show-up rates.
Corporate workforce planning forecasts headcount for one employer. A staffing agency forecasts other businesses' demand, which arrives as job orders with days of notice from a handful of clients, and it has to hold a bench of candidates who are ready before the order lands. The sheet below forecasts orders and the bench together.
What to export from your system, and what to leave out
You need one row per job order, with counts and dates and nothing about individuals. Demand forecasting works on how many people were wanted, when, and for what kind of job, so candidate names, phone numbers and CVs have no place in the file. Stripping them also means the file can go into an AI assistant without sending personal data anywhere. An illustrative extract of the columns:
| Order ID | Order date | Client code | Job title as typed | Start date | Heads ordered | Heads filled | Assignment length (weeks) |
|---|---|---|---|---|---|---|---|
| 10482 | 02 Sep | C07 | Picker packer | 06 Sep | 12 | 12 | 8 |
| 10483 | 02 Sep | C12 | Reception cover | 09 Sep | 1 | 1 | 6 |
| 10490 | 05 Sep | C07 | Goods in op | 12 Sep | 6 | 5 | 8 |
| 10497 | 09 Sep | C03 | AP clerk | 16 Sep | 2 | 2 | 12 |
| 10501 | 11 Sep | C19 | Operative | 13 Sep | 8 | 6 | 4 |
Keep the client as a code, add heads ordered as well as heads filled, and export at least 24 months. Starts understate demand in any period when you turned work away, so keep the unfilled heads in the file: demand is filled plus unfilled, and your fill rate is a separate number worth tracking. Capturing job orders cleanly at intake makes this export far less painful, because consistent job titles and start dates at the front end save most of the cleaning later. For general export problems such as mixed date formats, cleaning messy data with AI covers the routine fixes.
Sorting job titles into role families with AI
Orders arrive with titles typed by whoever took the call: "picker packer", "warehouse op", "goods in". A forecast needs six to eight role families, not 300 spellings. Ask an AI assistant to build the mapping, then keep the mapping as a lookup table in the sheet so the next export is a formula, not another chat. A prompt:
Below are job titles from my staffing agency's order history, one per line. Map each to one of these role families: Warehouse, Driver, Production, Admin, Customer service, Finance, Other. Return a table with the original title, the family and a confidence of high or low. Do not invent new families. If a title is ambiguous (for example "Operative" with no sector), mark it low and say what extra information would settle it.
TITLES:
Picker packer
Goods in operative
Warehouse op
Class 2 driver
Receptionist (maternity cover)
AP clerk
Operative
Data entry
Forklift (reach)
Customer support advisor
An illustrative result: picker packer, goods in operative, warehouse op and forklift (reach) map to Warehouse with high confidence; class 2 driver to Driver; receptionist (maternity cover) and data entry to Admin; AP clerk to Finance; customer support advisor to Customer service. "Operative" comes back as low confidence, possibly Warehouse or Production, to be settled by the client's sector. That last line is the behaviour you want, because the alternative is a confident guess that quietly moves 400 heads into the wrong series.
Check the work before you build on it. Resolve every low-confidence title by looking up the client, and sample 20 of the "high" rows by hand. If 19 or 20 are right, accept the mapping. If fewer, tighten the family definitions and rerun. Make a note of any family you have split, such as reach-truck operators from general warehouse, because splitting a thin series further makes forecasts noisier, not sharper.

The Complete Excel Course with AI Integration
From formulas and pivot tables to Power Query, DAX, VBA and AI with Copilot, ChatGPT and Claude — hands-on from the first lesson.
By Sagnik Bhattacharya and Virginia Thorn, Primetime Emmy Award winner
Buy nowMeasure how much notice clients give you
Before forecasting anything, find out how little warning you get. Subtract order date from start date for every row, then take the median and the 90th percentile. These two formulas do it:
Notice in days (column I): =E2-B2 (start date minus order date)
Median notice: =MEDIAN(I:I)
90th percentile of notice: =PERCENTILE.INC(I:I, 0.9)
In an illustrative export the median is 4 days and the 90th percentile is 11. Then nine orders in ten arrive with under a fortnight's notice. If it takes you three weeks to find, check and register a new candidate, you cannot build the bench in response to orders; you have to build it in anticipation of them. That is what the forecast is for, and the notice figures tell you how far ahead it has to look: at least as far as your bench-building lead time.
A seasonal forecast from two years of starts
With the titles mapped, count heads started by month for one role family. Use the start date, not the order date, because a peak that appears a week early in the orders will mislead the bench plan. Illustrative figures for one warehouse family, in heads started per month:
| Month | Year 1 | Year 2 | Seasonal index | Forecast, Year 3 |
|---|---|---|---|---|
| Jan | 38 | 41 | 0.72 | 43 |
| Feb | 34 | 37 | 0.65 | 39 |
| Mar | 41 | 45 | 0.79 | 47 |
| Apr | 44 | 48 | 0.84 | 50 |
| May | 47 | 52 | 0.90 | 54 |
| Jun | 45 | 49 | 0.86 | 52 |
| Jul | 42 | 46 | 0.80 | 48 |
| Aug | 40 | 44 | 0.77 | 46 |
| Sep | 55 | 61 | 1.06 | 64 |
| Oct | 78 | 86 | 1.50 | 90 |
| Nov | 92 | 101 | 1.76 | 106 |
| Dec | 70 | 77 | 1.34 | 81 |
| Total | 626 | 687 | 12.00 | about 720 |
The method has four steps and needs no special function. First, total each year: 626 and 687, so volume grew 9.7%. Second, work out each month's index as its value divided by that year's monthly average (626 / 12 = 52.2 for Year 1, 687 / 12 = 57.25 for Year 2), then average the two years. October is 78 / 52.2 = 1.50 in Year 1 and 86 / 57.25 = 1.50 in Year 2, so its index is 1.50: an October is typically half as busy again as an average month. Third, choose a growth assumption. One year's growth is thin evidence, so assume half of it continues: 9.7% / 2 = 4.9%, which puts Year 3 at 687 x 1.049 = about 720, or 60 heads a month. Fourth, multiply: October is 60.0 x 1.50 = 90.
Index for January (B and C hold Year 1 and Year 2, rows 2 to 13):
=AVERAGE(B2/AVERAGE(B$2:B$13), C2/AVERAGE(C$2:C$13))
Growth assumption (half the observed growth):
=(SUM(C2:C13)/SUM(B2:B13)-1)/2
Year 3 forecast for January (D holds the index; growth is the cell holding the formula above):
=AVERAGE(C$2:C$13)*(1+growth)*D2
AI earns its place around this method, not inside it. Ask an assistant to write the formulas for your column layout, to explain what an index above 1 means in plain words for a colleague, and to catch an obvious error such as a month missing from the list. Do not ask it to produce the forecast numbers on its own and take them as final; the sheet is the record, because you can audit every cell. Claude and ChatGPT can both read an uploaded spreadsheet, and if you work in Excel the Copilot side pane can help with formulas. The old =COPILOT() worksheet function was retired on 14 September 2026, so do not build the sheet around it.
Cross-check with Excel's FORECAST.ETS and an AI second opinion
A second method is worth ten minutes. Excel's desktop versions have FORECAST.ETS(target_date, values, timeline, [seasonality]). Microsoft's page says it needs a timeline with a constant step, returns an error otherwise, and is not available in Excel for the web, iOS or Android. Put the 24 monthly values in one column, number the months 1 to 24 beside them so the step is constant, and set seasonality to 12 for a yearly cycle with monthly data:
=FORECAST.ETS(25, $F$2:$F$25, $E$2:$E$25, 12) (values in F, month numbers in E; month 25 is January of Year 3; repeat for months 26 to 36)
Compare the output with the index method month by month. With only two years behind it the seasonal estimate rests on two cycles, so treat it as a cross-check, not a replacement. If the two methods differ by more than about 15% in a month, find out why before planning around either; a single odd order in the history is the usual cause. In a spreadsheet without that function, the index method above needs only AVERAGE, SUMIFS and multiplication.
For an AI second opinion, give the assistant the 24 monthly figures and constrain it:
Here are 24 monthly values of temp starts for one role family, January of Year 1 to December of Year 2: [paste]. (1) Describe the seasonal pattern in two sentences. (2) Flag any month that looks like an outlier and say why. (3) Forecast September to December of Year 3 using the same shape and assuming 5% growth on Year 2. Show the arithmetic as a table. Use no figures I have not given you.
In an illustrative reply the pattern description is sound: demand dips in January and February, plateaus in May and June, dips again in July and August and climbs from September to a November peak. The forecast table shows November at 109, though, against the 106 that 5% growth on Year 2 gives (101 x 1.05), and when you read the arithmetic the model has used 101 x 1.08, not the 5% you specified. That is the sort of slip to look for. Reconcile every cell against your sheet, and treat any difference you cannot explain as the model's mistake until proven otherwise.
Add what history cannot see: client signals
A history-based forecast has no idea that your account manager signed a new client last week or that another client has served notice. Keep a short table of known changes, each with a probability, and add the weighted effect to the forecast. Illustrative entries for the warehouse family:
| Signal | Effect | Likelihood | Weighted effect |
|---|---|---|---|
| New client A starts in October | +25 heads a month | 60% | +15 |
| Prospect B: one-off project in September | +10 heads in September only | 30% | +3 |
| Client C served notice, ends September | -12 heads a month from October | Certain | -12 |
| Client D shuts for two weeks in December | -10 heads in December | Certain | -10 |
The weighted effects are the first column multiplied by the likelihood: 25 x 0.60 is 15, 10 x 0.30 is 3. Net change: September +3 from prospect B alone, October and November +3 (15 minus 12), and December +3 minus 10, which is minus 7. The adjusted forecast is September 67, October 93, November 109 and December 74. Account managers' notes are the raw material, and AI can turn them into the table if you give it a format: "From these notes, produce rows of signal, effect in heads per month, start month and likelihood, and write NOT STATED where a note does not say." Review every row. A model will happily supply a likelihood that nobody gave it.
Pipeline coverage: ready candidates per forecast start
A forecast of starts is not yet a plan. The question is whether you will have enough ready candidates, meaning compliant, available and reachable within a few days, when the orders arrive. Two ratios answer it. The bench coverage ratio is ready candidates divided by forecast starts in your lead-time window. The booking pace compares orders already booked for a month with the same point last year.
Start with your own funnel, from your own history. Illustrative rates: clients accept 60% of the candidates you submit; 90% of accepted candidates take the assignment; 85% of those turn up on day one. Multiply them: 0.60 x 0.90 x 0.85 = 0.459, so one start takes 1 / 0.459 = 2.18 submissions. Now take the adjusted October forecast of 93 starts and a three-week lead time. Weekly starts are 93 / (52 / 12) = 21.5, so the window holds about 64 starts. Ready candidates needed are 64 x 2.18 = 139.5, call it 140, and a 10% buffer for the unexpected makes 154.
Your bench currently holds 118 ready candidates. The coverage ratio is 118 / 64 = 1.84 against a target of 154 / 64 = 2.41, a gap of 36. Close it with the cheapest sources first. You also hold 300 dormant candidates, and your history says 15% reply and 60% of those pass compliance again: 300 x 0.15 x 0.60 = 27 ready. The remaining 9 come from new registrations; if one in four becomes ready, that means 36 registrations. A plan with named numbers and dates beats "we should recruit more warehouse people before peak".
Check booking pace in parallel. If 38 October heads are booked on 1 September against a forecast of 93, you are 41% booked. If last year at the same date you had 35 booked against the 86 that eventually started (41%), you are on pace. A lower figure than last year's is an early warning that the forecast may be too high, or that a client is late; a higher one tells you to add to the bench sooner. Early endings also create replacement starts, so a check-in routine that keeps temps on assignment reduces demand on the bench as well as improving service.
Backtest before you plan around it
Run the method on the past before trusting it with the future. Forecast Year 2's September to December using only Year 1, with a 5% growth assumption, and compare with what happened:
| Month | Forecast from Year 1 | Actual, Year 2 | Miss |
|---|---|---|---|
| Sep | 58 | 61 | -3 (-5%) |
| Oct | 82 | 86 | -4 (-5%) |
| Nov | 97 | 101 | -4 (-4%) |
| Dec | 74 | 77 | -3 (-4%) |
The total miss is 14 on 325 actual starts, about 4%, and it leans the same way each month, which suggests the 5% growth assumption was a little low. That is a clean result, cleaner than most real agencies will see, because these figures are illustrative. With real data, expect individual months to miss by more, especially if one client dominates, and use your own backtest to size the bench buffer. If single months miss by more than about 20%, which is my rule of thumb, widen the buffer, shorten the forecast horizon to the next 8 weeks, or both.
A one-page planning view for the monthly meeting
Keep the output to one page that the owner and the lead recruiter can read in five minutes. A filled-in version for the October window:
| Line | Value |
|---|---|
| History-based October forecast (warehouse) | 90 starts |
| Client signals, weighted | +3, so 93 starts |
| Booked on 1 September | 38 (41%); same point last year 41% |
| Starts in the three-week lead-time window | 64 |
| Ready candidates needed (2.18 per start, 10% buffer) | 154 |
| Ready candidates now | 118 (coverage 1.84; target 2.41) |
| Gap | 36 |
| Plan | Re-engage 300 dormant candidates (about 27 ready); 36 new registrations (about 9 ready) |
| Owner and date | [name], bench at target by 22 September |
Repeat the page each week with the latest bench count and bookings, and each month with refreshed history. Keep last month's page, because comparing the plan with what happened is how the funnel rates improve. If a rate in the plan was wrong, such as show-up on day one being 78% instead of 85%, that is the most valuable line in the whole exercise. For a plain-language method that works outside staffing, a simple seasonal forecast from sales history follows the same logic with sales data, and rota and headcount scenarios in a sheet shows how to run what-if cases.
Where small-agency forecasts fail
- One client is the forecast. If a single client supplies 40% of starts, the agency's demand is that client's calendar. Forecast it separately, ask the account manager for its plan, and stop pretending the seasonal index describes it.
- Lumpy orders. A single order for 30 heads is a third of a quiet month. Mark one-off large orders in the history and either exclude them from the index or carry them as signals, so next year's forecast does not assume they repeat.
- Series too thin. A role family with 5 starts a month produces an index that moves with each order. Merge families until a month typically has 20 or more starts, then split again when volume grows.
- The wrong date. Orders counted by order date, starts counted by confirmed start date and payroll counted by first shift give three different peaks. Pick the start date and stay with it.
- Unfilled heads forgotten. A year in which you declined work looks like a quiet year in the placement history. Keep ordered and filled separately.
- Rates left unchanged. Client acceptance, take-up and show-up rates move with the market and with your own process. Recalculate them every quarter from the last 12 weeks.
The bench plan is only as good as the candidates on it, so fairness and quality checks belong upstream; the skill assessment tutorial covers testing new registrants without screening out good ones.
Questions agencies ask about demand forecasts
How much history do we need for a staffing demand forecast?
Two full years is a workable minimum for a seasonal pattern, because the second year confirms whether the first year's peaks were typical. With one year you can still build a rough shape, but treat it as a draft. Fewer than 12 months is enough only for a short-term run-rate forecast, not for planning around a peak.
Should we forecast by client or by role family?
Start with role family, which gives each series enough volume to show a pattern. Forecast an individual client separately only if it supplies more than about a third of your starts, because then its calendar is effectively your forecast. Splitting a small agency's data by client and role at once leaves series too thin to read.
What if our placement history is too patchy to forecast?
Start with what you can trust: the last 12 weeks' run-rate by role family, booked-to-date orders against the same weeks a year ago if you have them, and the bench coverage ratio. These need little history. Keep a clean monthly export from now on and add the seasonal index at 24 months. Until then, widen the bench buffer rather than trusting a forecast you cannot test.
Does a bigger bench always mean better cover?
No. Every ready candidate costs recruiter time to keep warm, and candidates who wait weeks for a first assignment tend to take work elsewhere. Track how long ready candidates wait for their first placement, and stop adding to the buffer when that wait starts to lengthen. The aim is the smallest bench that still meets forecast starts.
Further reads
- How to Forecast Next Quarter's Sales With AI Using Your History — A general method for forecasting a quarter from your own history.
- Why AI Stock Forecasts Go Wrong: 8 Mistakes Small Businesses Make — Why AI forecasts go wrong, and how to spot it early.
- AI for Recruitment Business Development: Winning New Clients — Winning the new clients that change next quarter's forecast.
- How Much Time Does AI Save a Recruitment Agency per Role? — Put a number on recruiter time before sizing the bench.
- AI Staffing Best Practices: A Checklist for Placements and Candidate Data — Human decisions, notices and retention rules for the candidates on your bench.
- AI Tools and AI Development: The Complete 2026 Guide — the AI hub, including every tutorial in the AI-for-business series.
Sources: Microsoft's support pages for the FORECAST.ETS and COPILOT functions, and the OpenAI and Claude help pages on uploading spreadsheets. All placement figures, ratios and rates in the worked example are illustrative.