Export six to eight weeks of timestamped till sales, ask AI to average them for each weekday hour, then set how many transactions one person can handle in an hour and divide. The result is a target head count per hour. AI drafts the rota against it; you set the minimum cover and check breaks and working-time rules.
Till data only shows work that ends in a sale. Deliveries, restocking, cleaning and the customers who browse and leave never appear in it, so the hourly target is a starting point to adjust, not an order. AI also won't respect your limits on hours and rest unless you hand it the rules and then check its answer, which is why the last stage below is a rule check you run yourself.
Export the transactions, then delete what the AI doesn't need
Ask your till for the transaction list rather than daily totals: one row per sale, with date, time, receipt number and net sales. Some systems show a sales-by-hour chart on screen but cannot export it, so the transaction list is the dependable route. Take six to eight weeks from the same season. If December trades nothing like October, use the same weeks from last year instead, because a rota built on the wrong season is confidently wrong.
Before uploading, delete the columns the job doesn't need: customer names, email addresses, loyalty numbers and card digits. The method uses only the date, time, receipt number and sale value, so nothing personal has to leave the shop. Then add one column of your own called flag and mark any day that wasn't normal: a street event, an early close, a till that was offline for an hour, a closing-down sale. Two minutes here prevents the biggest error in the whole method, shown in the next section.
Any of the main chat assistants can read a CSV. On ChatGPT's free plan, OpenAI's help page limits file uploads to three a day, which is plenty for one export, and Claude's apps accept CSV and XLSX files too. A shop ringing about 385 sales a week produces roughly 3,000 rows in eight weeks, which is tiny for all of them. If you would rather build the weekday-by-hour table yourself, the ChatGPT Excel guide covers the pivot-table route, and the weekly till-data KPI sheet builds on the same kind of export.
If your till really can't export times, because it is old or only prints daily totals, don't guess. Put a tally sheet beside it for two weeks and have whoever is on make one tick per sale in the hour's box. Type the ticks up after closing, with a count of customers who left without buying if you can bear to keep one. Two weeks of tallies beats a remembered impression, and it will tell you quickly whether a proper export is worth setting up.
Average the weeks into one table of weekday and hour
The first prompt asks for the grid and, just as important, asks the AI to check its own import. A time zone slip is easy to miss: if the file says you sold something at 03:00, the clock in the export is wrong and every hourly average after it will be too.
I run one gift and homeware shop. The attached CSV has one row per sale
for the last eight weeks: date, time, receipt_id, net_sales, flag.
Trading hours: Monday to Saturday 09:00-18:00, Sunday 10:00-16:00.
1. Check the times first. If any sale falls outside trading hours, list
the first five and stop so I can fix the export.
2. Ignore rows where flag is not empty, but list each flagged date and
its day total.
3. Build a table with one row per weekday and hour: average number of
transactions, average net sales, and how many weeks went into the average.
4. List any unflagged date whose day total is more than 1.5 times the
median for the same weekday.
5. Give the table as plain text I can paste into a spreadsheet.
Do not estimate hours with no data; write "no data".
A good reply (illustrative) starts with a one-line confirmation that all 3,080 sales fall inside trading hours, then gives rows such as the ones below, then lists flagged and unflagged outliers.
Sat 11:00-12:00 | 15.0 transactions | $470 | 7 weeks
Sat 12:00-13:00 | 18.0 transactions | $560 | 7 weeks
Sat 13:00-14:00 | 17.0 transactions | $520 | 7 weeks
Flagged: Sat week 5 (street market), day total $5,820
Unflagged days above 1.5 x median: none
Notice the "7 weeks" on a Saturday in an eight-week file. That is the flag column doing its job, and it brings us to the mistake worth guarding against. Here is how it goes wrong. Eight Saturdays come in at $2,870, $3,010, $2,930, $5,820, $3,040, $2,960, $2,890 and $3,090, and the $5,820 day had a street market outside the door. Averaged in, Saturdays look like $3,326 days, about 12% busier than the seven ordinary ones ($2,970). The 12:00 and 13:00 hours then tip over the capacity rule in the next section into four people, and 16:00 into two. That is three extra head-hours every Saturday, roughly $46 a week at the planning rate used below, to cover a rush that happened once. The median Saturday ($2,985) shrugs the outlier off, which is why the prompt asks for flagged dates and for anything above 1.5 times the median.
Decide how much trade one person can handle in an hour
This single number turns a sales table into a staffing table, and it has to come from your shop. Think of a Saturday hour when three of you were on and the queue never passed two customers. If the table says 18 transactions in that hour, one head handled 6. That figure carries more weight than any benchmark you could find, because it already contains your layout, your stock and how much gift wrapping you do.
A rough check on the figure: if a typical customer takes about five minutes of staff time, including helping on the floor, six transactions is half an hour of an hour. The rest is slack for browsers who never reach the till, tidying, the phone and the odd long conversation, none of which the till records. Plan at flat out and the first unusual customer makes a queue.
Write your rules down as a short list the AI can follow. A "head" below means one person on the floor, and a head-hour is one person for one hour. This is the set used for the worked example (illustrative; yours will differ):
- Capacity: one person per 6 transactions in an hour, rounded up.
- Minimum cover: never fewer than one person in the shop, and two in the final trading hour for cash-up and locking up.
- Task hours: Thursday 09:00 to 11:00 needs one extra person for the delivery, because no sale will ever show that work.
- Shifts: between four and eight hours, with no more than two people starting in the same hour.
- Breaks: one 20-minute paid break in any shift over six hours, taken in an hour that has a person spare.
Saturday hour by hour: from averages to heads
Here is the main worked example. The shop is a gift and homeware shop open Monday to Saturday 09:00 to 18:00 and Sunday 10:00 to 16:00. These are illustrative averages over seven ordinary Saturdays, and the last column applies the minimum-cover rule.
| Hour | Avg transactions | Avg net sales | Heads (1 per 6) | After minimum cover |
|---|---|---|---|---|
| 09:00-10:00 | 4 | $115 | 1 | 1 |
| 10:00-11:00 | 9 | $290 | 2 | 2 |
| 11:00-12:00 | 15 | $470 | 3 | 3 |
| 12:00-13:00 | 18 | $560 | 3 | 3 |
| 13:00-14:00 | 17 | $520 | 3 | 3 |
| 14:00-15:00 | 14 | $430 | 3 | 3 |
| 15:00-16:00 | 10 | $310 | 2 | 2 |
| 16:00-17:00 | 6 | $190 | 1 | 1 |
| 17:00-18:00 | 3 | $85 | 1 | 2 |
| Day | 96 | $2,970 | 19 | 20 |
Twenty head-hours at a planning rate of $15.50 an hour is $310, or 10.4% of the day's sales. The $15.50 is an illustrative loaded cost (wages plus employer extras), and you would take yours from payroll. Repeat the arithmetic for every day and you get the week below. "Rota hours" is higher than the target because shifts cannot be cut to the hour: a four-hour minimum turns a two-hour need into four paid hours.
| Day | Avg net sales | Target head-hours | Rota hours as built | Labour cost | Share of sales |
|---|---|---|---|---|---|
| Monday | $1,060 | 12 | 14 | $217.00 | 20.5% |
| Tuesday | $980 | 10 | 12 | $186.00 | 19.0% |
| Wednesday | $1,120 | 12 | 14 | $217.00 | 19.4% |
| Thursday | $1,240 | 15 (13 + 2 delivery) | 17 | $263.50 | 21.3% |
| Friday | $1,610 | 16 | 17 | $263.50 | 16.4% |
| Saturday | $2,970 | 20 | 21 | $325.50 | 11.0% |
| Sunday | $1,180 | 11 | 11 | $170.50 | 14.4% |
| Week | $10,160 | 96 | 106 | $1,643.00 | 16.2% |
Monday to Thursday run at 19% to 21% of sales, Friday at 16% and Saturday at 11%, because the one-person floor and the closing pair don't shrink when trade does. That is the cost of being open, and the choice is yours: accept it, close an hour earlier on Tuesdays, or work the quiet shifts yourself. The restaurant labour-cost tutorial tests rota changes against the labour percentage before they go live, and the same habit works in a shop.
Before and after: a fixed rota against a data-led one
Before the data, this shop ran two people from open to close every day, which is 18 hours a day Monday to Saturday and 12 on Sunday: 120 hours a week, $1,860 at the planning rate, 18.3% of sales. The data-led rota above uses 106 hours, $1,643, 16.2%. The difference is 14 hours, or $217 a week, but the interesting part is where the hours moved. Monday to Friday lost 16 between them, mostly from quiet mornings, Saturday gained 3 because 12:00 to 15:00 now has three people instead of two, and Sunday lost one.
Don't call the 14 hours savings yet. Contracts, minimum hours and the jobs the till can't see decide that. Plenty of owners would put the freed hours into restocking, window displays or online orders instead, and the data's main value is that the queue at 12:30 on Saturday gets a third pair of hands.
Draft the rota from the targets and your people
With the targets agreed, the second prompt does the assembling. Give it the targets, the staff and the rules, and ask for the gaps to be reported rather than quietly papered over.
Build next week's rota for one shop. Targets (heads needed per hour,
per day) are in the attached sheet "targets".
Staff (hours are contracted weekly hours):
A: full-time 38h, Mon-Sat, can open or close
B: part-time 27h, any day, can open or close
C: part-time 24h, Mon-Sat, cannot start before 10:00
D: weekend worker 17h, Thu-Sun, under 18 (young-worker rules apply)
Rules: shifts 4 to 8 hours; no more than two people start in the same
hour; a 20-minute paid break in any shift over six hours, placed where
the hour has a person spare; never fewer than one person in the shop.
Output: (1) a shift table: day, person, start, end, paid hours;
(2) a grid of people on the floor per hour against target; (3) hours per
person against contract; (4) every hour where cover differs from target, with the reason.
If a rule and a target conflict, tell me instead of bending the rule.
On the Saturday column the reply (illustrative) comes back like this, with starts staggered at 09:00, 10:00, 11:00 and 14:00 rather than everyone arriving at opening time.
| Person | Start | End | Paid hours |
|---|---|---|---|
| A | 09:00 | 14:00 | 5 |
| B | 10:00 | 18:00 | 8 (break placed 16:00) |
| C | 11:00 | 15:00 | 4 |
| D | 14:00 | 18:00 | 4 |
That is 21 hours against a target of 20. The extra one sits at 16:00 to 17:00, where two people are on against a target of one, because B's shift runs to close and D cannot be cut below four hours. A good draft says so in output (4). A weaker one hides it, which is why you ask for it. Then look at the grid, not the table: coverage per hour is where a rota actually succeeds or fails.
Check breaks, rest and working-time rules yourself
Rules on breaks, rest between shifts, weekly hours and young workers differ from place to place and change. I haven't looked up yours, and neither has the AI in any way you should rely on. Take the figures from official employment guidance where you trade, or from an employment adviser, and put them in a table like this one. The middle column holds placeholder values for the example; replace every one.
| Rule to look up | Placeholder used here | How to check it in the sheet |
|---|---|---|
| Break during a shift | 20 minutes once a shift passes 6 hours | Filter shifts over 6 hours; each needs a break time |
| Rest between shifts | 11 hours | Next start minus previous end, per person |
| Weekly hours cap | 40 hours | SUM paid hours per person |
| Days off | At least one day in seven | COUNT worked days per person |
| Workers under 18 | Finish by 17:30 | Filter that person's end times |
| Notice of the rota | Posted 14 days ahead | Date posted against first shift date |
Then use the AI as a second pair of eyes, with a prompt that makes it list what it could not check as well as what it found.
Audit the attached rota against these rules and list every breach as
person, day, rule and the hours involved. Then list the rules you could
not check from the data. Do not say "compliant" unless you checked every
rule in the list.
An illustrative reply, on a draft where the AI had stretched A to cover a gap, finds two breaches. D's Saturday shift ends at 18:00, after the 17:30 limit for under-18s, and A is down for 41 hours against a cap of 40. It also says it could not check break times, because the rota has none. The fix for D is a swap, not a nudge: if D moves to 11:00 to 15:00 and C takes 14:00 to 18:00, the closing pair is B and C, and Saturday coverage is unchanged. Fixing A means moving one hour to someone with spare contract hours.
Two habits keep this honest. First, recompute the hour totals with a SUM in the spreadsheet, because a one-hour slip in a seven-day grid is the sort of error a language model can make and a human reader won't see. Second, read "compliant" as "compliant with the rules I was given". When staff start swapping shifts after the rota is posted, run the same check again; the shift-swap request form with a rest-rule check is built for that.
Tell the team what changed and why
People read a new rota as a verdict on themselves unless told otherwise. Ask the AI for a short note, then edit it into your own voice. This is a sample (use first names where the placeholders are):
Hi [first name], next week's rota is attached. Two changes you'll notice: Saturday now has three of us on from 11:00 to 15:00, and Tuesday mornings are down to one person until 12:00. Both come from the last eight weeks of till data, not from anyone's performance. If a shift doesn't work for you, message me by Wednesday and we'll sort a swap before the rota is final. [your name]
Post the rota the number of days ahead your own rules require, and keep the previous week's version so you can show what changed. The note deliberately names no sales figures and no individuals, since the numbers are about hours, not people.
Four weeks in: compare the plan with the tills
A rota is a forecast, and forecasts need marking. After each trading day, whoever closes writes one line in a shared note: "queue at 12:30", "nobody in 15:00 to 16:00, one person idle", "delivery ran over by an hour". Once a month, compare the notes with sales per labour hour for each day. In the example week that is $141 on Saturday ($2,970 over 21 hours), $95 on Friday and $82 on Tuesday. Nothing is wrong with Tuesday being lowest, but a Tuesday that stays far below the rest of the weekdays is the first place to look.
The capacity figure is the dial that matters. If the closer's notes show a queue forming at 13:00 on three Saturdays out of four, lower the figure from 6 to 5 transactions per person and rerun: Saturday needs 23 head-hours instead of 20, three more, about $46 a week at the planning rate. If the queue disappears, the extra person earned their place; if it doesn't, the cause lies elsewhere, perhaps a slow card reader or a till layout, and more staff won't fix it.
Weeks that aren't normal: scale the targets from last year
Averages built from ordinary weeks will under-staff a pre-holiday Saturday and over-staff a quiet January. For the unusual weeks, find the same week last year in your sales history and compare it with the ordinary weeks around it. In this shop's records, last year's busiest pre-holiday Saturday ran at 1.3 times the autumn Saturday average (an illustrative ratio). Multiply this year's hourly transactions by 1.3 and the table changes shape: the 12:00 hour goes from 18 to about 23 transactions, which needs four people, and 11:00 to 15:00 needs four on the floor instead of three. Saturday's target moves from 20 head-hours to 26, an extra six that cost about $93 at the planning rate.
Ask the AI to do the scaling and show the result next to the ordinary table so you can sanity-check the jump. A prompt as short as "multiply every hourly transaction count in the Saturday table by 1.3, round the heads up under the same rules, and show both versions" is enough. The multiplier is a judgement call, not a statistic, so write down where it came from. If you have no history, because the shop is new or this is your first December, use a cautious multiplier, staff the peak hours slightly generously for the first occasion, and keep the closer's notes so next year's number is a measured one.
The same method in a shop with a different shape
Nothing in the method is specific to gift shops, though the curves differ. A florist's week might peak on the afternoons before a public holiday and flatten on Mondays, so the weekday table matters less than a calendar column flagging those days. A bookshop might peak at lunchtime and after school, with Saturday only slightly busier than Friday. A bike shop might have a sharp Saturday morning and an empty Tuesday, but repair work happens behind the counter and never reaches the till, so its task hours rule does more of the work than its capacity rule.
Two extensions are worth knowing. If you have a door counter, footfall gives a better capacity figure than transactions, because it includes the browsers; the footfall camera tutorial covers what these counters record and the privacy questions they raise. And if swaps and leave requests start taking longer than building the rota, an app may earn its fee; the comparison of AI shift scheduling and a rota spreadsheet sets out when.
What it costs in time and money
Plan on about two and a half hours the first time: twenty minutes to export and clean the file, twenty for the weekday-by-hour table, forty to settle the capacity figure and the rules, half an hour for the first draft and forty minutes for the rule check and the note to the team. After that, a month's refresh is nearer 30 to 40 minutes, mostly the export and the check. On money, a paid chat plan is about $20 a month at list price, and the free plans are enough to try it, though ChatGPT's data analysis is limited on its free plan, so a second run may have to wait until the next day. Nothing here needs a scheduling subscription, which is the point of building the logic in a sheet first.
Questions shop owners ask about till-based rotas
Should the rota follow sales value or number of transactions?
Use transactions to decide how many people an hour needs, because a $200 sale and a $2 sale take similar till time. Use sales value afterwards to judge whether the hour earns its labour cost. The two answers rarely match exactly, and the gap between them is where your own judgement goes.
How many weeks of till data are enough?
Six to eight weeks of the same season is a sound start for a single shop. Weekdays settle quickly, while Saturdays and event days vary more, so keep the flag column honest. If your trade is strongly seasonal, use the same weeks from last year as well, and treat a shop under two months old as a rough guide only.
Can the AI connect to my till and update the rota itself?
Only if your till offers an integration, and the method here does not need one. Exporting a CSV and uploading it works with any till, keeps you in control of what leaves the shop, and takes a few minutes a month. Automate it later, once the numbers and rules have proved themselves.
What do I do when staff availability changes every week?
Keep availability in its own sheet, one row per person, and update it before you ask for a draft. Give the AI the changes only, such as a holiday week or a new part-timer, rather than retyping everyone. Record availability as available or unavailable, without reasons, so nothing sensitive goes into the chat.
Further reads
- How to Build a Restaurant Staff Rota With AI Demand Forecasts — The same forecast-then-rota idea for a kitchen and floor team.
- What AI Costs a Small Retail Shop in Its First Year — What AI tools cost a small shop across its first year.
- Examples of AI in Retail: Eight Jobs a Small Shop Can Copy — Other shop jobs worth handing to AI after the rota.
- AI Agents in Retail: What an Independent Shop Can Actually Run — What an independent shop can realistically let an AI agent run.
- Best AI Inventory Tools for Small Retailers Compared — Stock tools to pair with a rota built on sales data.
- AI for Retail Store Design: Layout and Display Ideas — Plan a shop re-layout with AI, safely: measure, get three options, tape-test the best, check exits and access, then measure whether sales moved.
- Hotel Staff Scheduling With AI: Front Desk, Housekeeping, Breakfast — A department-by-department rota method: occupancy sets the cover, hard rules limit the AI, and a checker sheet catches what its draft gets wrong.
- How to Use AI in Hiring for a Small Shop: Ads, Questions, Scorecards — A counter-staff vacancy from start to finish: the ad, five screening questions, a locked scorecard and the fairness checks, with a person deciding.
- AI for Convenience Stores: A Weekly Routine for Reorders and Rotas — One weekly run-sheet for a convenience store: a reorder list from the till export, shelf prices against two rivals and a rota draft, each step approved by you.
- AI for Golf Course Management: Can It Plan Staffing Around Weather? — Export past rounds, add the weather, and let ChatGPT or Gemini turn each forecast into a weekly staffing sheet for the pro shop, starter, bar and range.
- AI Tools and AI Development: The Complete 2026 Guide — the AI hub, including every tutorial in the AI-for-business series.
Sources: OpenAI's file-uploads FAQ on help.openai.com (checked October 2026); the worked figures are illustrative, not benchmarks.