Can AI Run a Vending Machine Business? Restocks Yes, Servicing No

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Can AI Run a Vending Machine Business? Restocks Yes, Servicing No.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Can AI Run a Vending Machine Business? Restocks Yes, Servicing No.

Yes, for the planning half. AI can read a sales export by machine and product, work out how many units each slot needs, flag slow sellers and rank which machines to visit first. It cannot clear a jam, refill a coil, repair a fridge or collect cash. Those stay with a person in a van.

The useful split is "decide" versus "do". Deciding what goes on tomorrow's pick list, and in what order to drive, is arithmetic over a spreadsheet, and AI does it in a minute. Doing the visit is physical. Operators who try to hand AI the second half get nowhere; the first half is where a sheet and a saved prompt can replace restocking from memory.

Follow me on Instagram@sagnikteaches

What the sales export needs, and what to leave out

The AI only sees what is in the sheet, so the sheet decides the quality of every answer. One row per machine, per slot, per day (or per week, if that is all your reader reports) is the shape that works. A cashless reader or telemetry unit normally exports this; if yours does not, a column filled in at each visit does the same job more slowly.

Connect on LinkedInSagnik Bhattacharya

Columns worth including, in this order:

Subscribe on YouTube@sagnikteaches
  • machine_id and site: a short code like M04, plus where it sits. Two machines at one site share a site value.
  • slot and product: the coil or shelf number and the product name spelled the same way every time. "Salted crisps 40g" and "Crisps salted" count as two products unless you tidy them first.
  • units_sold for the period, and sell_price and unit_cost so margin can be worked out.
  • slot_capacity: how many units physically fit. This is the number most operators forget, and it changes the answer more than anything else.
  • filled_at_last_visit and last_visit_date, so the sheet can estimate what is left today.
  • days_offline: days the reader or telemetry unit did not report. Covered in its own section below, because ignoring it produces the most embarrassing mistake in this whole routine.
  • best_before_days for chilled and short-life products.

Leave out anything personal. A sales export by slot holds no customer data, which keeps the privacy question simple. If you are unsure about pasting business figures into a chat tool at all, the guide to customer data in ChatGPT covers what the plans do with what you paste. Also leave out site contracts, commission terms and supplier price agreements unless you are sure the plan you use is covered by your confidentiality duties to the other party.

If your data is untidy, a ten-minute clean-up first pays back. The tutorial on cleaning messy data with AI shows how to fix product-name spelling and blank cells before any analysis.

The Complete Excel Course with AI Integration thumbnail

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 now

From two weeks of sales to a par level for every slot

A "par level" is the number of units a slot should hold after you fill it. Too low and you sell out between visits; too high and chilled stock expires or cash sits on a shelf. The sum is not complicated, which is why AI handles it well once the sheet is right.

The rule: par = average daily sales x days until the next visit + one day's safety stock, capped at slot capacity. When the cap bites, the slot cannot be fixed by ordering more; only a more frequent visit, a bigger slot or a different product helps.

Here is the main illustration, with invented figures. A warehouse canteen machine, M04, is visited every Monday and Thursday, so the longest gap is four days (Thursday to Monday, counting the weekend as two days of sales). Fourteen days of sales for four slots:

SlotProductSold in 14 daysPer dayCapacityPar (4 days + 1)Filled to
A1Salted crisps 40g352.51212.512 (cap)
A2Chocolate bar 50g282.0101010
B3Oat bar 45g40.381.52
C1Still water 500ml564.0142014 (cap)

Three things show up straight away. Slot C1 for water cannot hold what the sales need, so the machine will be empty of water before Monday every week, however well you restock: that is lost margin you can price. Slot B3 holds eight oat bars but sells about two a week, so six of those units are working capital sitting on a shelf. And A1 is just at its cap, so a single hot week will sell it out.

Now put a price on the water. Say it sells at $1.50 and costs $0.60, a $0.90 margin. The long Thursday-to-Monday gap leaves the slot 6 units short (20 needed, 14 held), which is 6 x $0.90 = $5.40. The shorter Monday-to-Thursday gap needs 16 (3 days x 4, plus 4 spare) and leaves it 2 short, or $1.80. That is $7.20 a week, or about $375 a year, from one slot in one machine. Whether that justifies a mid-week extra visit, a larger water slot or a second water column is your call; the AI's job was to surface it. This is a made-up machine, so check whether your own sheet shows the same pattern: one or two capped slots carrying most of the avoidable loss.

The prompt that produces the par table

I run vending machines. Attached is a sales export (CSV, one row per machine, slot and product for the last 14 days).
Columns: machine_id, site, slot, product, units_sold, sell_price, unit_cost, slot_capacity, filled_at_last_visit, last_visit_date, days_offline, best_before_days.

For machine M04 only, visited every Monday and Thursday:
1. Work out units sold per day for each slot, ignoring days the reader was offline.
2. Set par = daily sales x 4 days + 1 day safety stock, capped at slot_capacity.
3. Flag every slot where uncapped par is more than slot_capacity, and say how many units short it is per 4-day gap and the margin lost per gap.
4. Flag every slot with fewer than 3 units sold per week.
Return a table, then a three-line summary. Show your arithmetic for two rows so I can check it. Do not invent products or prices that are not in the file.

Ask it to show arithmetic for two rows. If those two are right and the totals match what you get in a spreadsheet, the rest is almost always right. If you work in Excel, the guide to using ChatGPT with Excel shows how to check a table like this with a formula rather than trusting the chat.

Ranking tomorrow's visits by margin at risk

A par table tells you what to load. The harder daily question is where to drive first, and the honest answer is "wherever you are about to lose the most margin". That is something a sheet can estimate: for each machine, count the slots with less than two days of cover left, multiply their daily sales by unit margin and sum the result.

Six machines, illustrative figures, on a Thursday evening with three visits possible tomorrow:

MachineSiteSlots under 2 days' coverUnits a day at riskMargin per unitMargin at risk per day
M04Warehouse canteen511.5$0.95$10.93
M01Gym reception36.0$1.10$6.60
M06Depot yard45.2$1.25$6.50
M05College corridor24.0$1.05$4.20
M02Office A11.5$0.90$1.35
M03Clinic waiting room00-$0.00

The total at risk is about $29.58 a day. Visiting M04, M01 and M06 tomorrow covers $24.03 of it, which is 81 per cent, and leaves M05, M02 and M03 for the next run. A rule of thumb you can give the AI: rank by margin at risk per day, then break ties by which two machines share a site or a road. Straight ranking ignores drive time, so add the distance or the order of your usual route as a column and ask the AI to propose the three visits that cover the most margin at risk in the fewest minutes.

This is a small version of the dispatch problem that field service teams solve with scheduling software. For one van and a few dozen machines, a sheet and a good prompt is usually enough. Beyond that, route-optimisation software starts to earn its fee.

A sample answer, and what to correct in it

This is the kind of reply a chat tool gives to the ranking prompt. The wording is illustrative, but the pattern is realistic.

Suggested visits for tomorrow (3 slots available):
1. M04 Warehouse canteen - 5 slots under 2 days cover, about $10.93 margin at risk per day.
2. M01 Gym reception - 3 slots, about $6.60 per day.
3. M06 Depot yard - 4 slots, about $6.50 per day.
Together these cover roughly 81% of margin at risk. M05, M02 and M03 can wait until the next run.
Restock for M04: A1 to 12, A2 to 10, C1 to 14, B3 to 2. Note: C1 (water) is capped; consider a second water slot.

What you would fix: the reply says nothing about whether M06 is on the way to M01 (it has no map), and it assumes your van holds enough water for C1 and the other machines. Add a line to the prompt: "Check total units per product against what is on the van. The van holds: 60 water, 40 crisps, 30 chocolate." Then it will tell you where the load list falls short before you leave the yard, not after.

The slow-seller review: four tests before a slot loses its product

Slow sellers drain a vending business quietly. The oat bar above sells two units a week but occupies eight spaces; at a $0.62 cost, that is about $5 of stock sitting idle in that slot, and more if it nears its date. Multiplied across thirty machines with a dozen weak slots each, it is a few hundred dollars of cash and a steady stream of write-offs.

Give the AI four tests and let it list the slots that fail more than one. Do not let it decide; let it propose.

  1. Velocity: fewer than three units a week for four straight weeks, with the machine online throughout.
  2. Expiry exposure: units in the slot x unit cost, for any product where the sell-by date falls before the next fill at current velocity.
  3. Cash tied up: slot capacity x unit cost, ranked, so the biggest sums come first.
  4. Replacement candidate: the best-selling product in the same machine type that is not already in this machine, and whether it fits the slot size.

Here is a filled-in extract, again with invented figures, for a machine at a college site:

SlotProductUnits a weekCash tied upFailsSuggested swap to trial
B3Oat bar 45g2.1$4.96Velocity, cashCereal bar, top seller at two other sites
D2Dried fruit pot0.8$3.40Velocity, expirySecond water slot
A4Mint tin1.5$2.10VelocityKeep, check again in 4 weeks

The decision stays yours, for a plain reason: sales history cannot tell you that a slow product is bought by the one regular who would stop using the machine if it vanished, or that a mint tin is a deliberate low-price item that keeps small-change buyers using the machine. Run each swap as a four-week trial in one slot, then compare units a week against the product it replaced. Put the result back in the sheet so the next review has history to read.

The same ranking idea applies to any shop with limited shelf space; forecasting stock and reordering for a small shop walks through it for retail.

Why a zero in the export may be a dead reader, not a dead product

This one catches almost everyone once. Say the card reader on machine M05 lost its connection for six days. The export shows 0 units sold for those days across every slot. Fed to an AI without the offline flag, the sheet looks like a machine where nothing has sold for six days, and the model may confidently report that every product in it is a slow seller and recommend clearing the machine.

In a case like this, the ranking puts M05 at the bottom with eight "dead" slots, while the driver's last visit found the crisps and water nearly gone. The cause is in the sheet, not the machine. The fix has two parts:

  • Keep a days_offline column (or an "online" flag per day) and tell the AI to exclude those days from any velocity calculation.
  • Add a sanity rule to the prompt: "If a machine shows zero sales across all slots for a day, treat it as offline and ask me before using that day."

The same trap exists with cash-only machines, where a missing weekly cash count reads as zero sales. A quick glance at total revenue per machine by week, which any sheet can chart in a minute, would have shown the cliff. Make that glance part of the routine rather than expecting the AI to notice a gap it was never told about.

Jobs that stay with a person with a toolbox

The title says servicing is a no, and it is worth being exact about why. AI works on the numbers you give it. It has no hands, no sight of the machine and no sense of a bad smell from a fridge. The list below is not exhaustive, but it is what operators spend their real time on:

  • Clearing jams, coil faults and stuck products.
  • Cleaning, including the cold side of chilled machines and the delivery chute.
  • Checking temperatures and recording them where your food-safety rules require it.
  • Emptying the coin and note boxes and counting them against the record.
  • Repairing or replacing a failed reader, validator or compressor.
  • Dealing with a site manager, a damaged machine or a complaint.
  • Judging a location: footfall, rival machines, who walks past at what time.

AI can help around the edges. If the reader reports a fault code, it can look up what the code usually means from the manual you give it. It can draft a "machine is out of order" notice or a message to a site contact. It can turn a technician's voice note into a tidy job record. But the repair, and the decision about whether a machine is safe to leave running, belong to a person who has seen it. If you are weighing how far to go beyond the restock list, the guide to reorder points and stockouts covers the supplier-ordering side of the same problem.

Another place the numbers mislead: events and weather

A fortnight of sales from a college machine that includes an open day will overstate demand; a fortnight that includes a heatwave will overstate water. Add a "notes" column for anything unusual, such as "site closed Tue", "roadworks, no access Fri", "heatwave" or "event", and tell the AI to exclude flagged days from par calculations or to ask you. It takes ten seconds to write the note at the time and saves a week of an over-filled machine.

Running it weekly without it turning into a chore

The routine that sticks is short. On the evening before a route day, export the last 14 days, paste or attach the file, run the same saved prompt, and read three things: the ranked visit list, the pick list per machine and any slot flagged as capped. Write down what you changed and why in a "decisions" tab. Over a month, that tab becomes the most valuable thing in the workbook, because it records which swaps worked.

Save the prompt as the instructions of a ChatGPT Project (the project's more-options menu, then Project settings) or the equivalent in whichever assistant you use, so that you are not retyping it. Project instructions apply only inside that project, so the restock project can carry its own rules without changing how the assistant behaves elsewhere. Keep the columns identical every week; most failures in this routine are a renamed column or a new product spelling, not the AI.

How you know it is working

Judge the routine on four numbers, each from your own sheet, after four weeks:

  • Empty-slot days: the count of slot-days with zero stock at visit time. It should fall.
  • Write-offs: units thrown away for date. It should fall.
  • Margin per visit: total margin divided by the number of visits. It should rise if the ranking is working.
  • Time to build the list: from export to printed pick list. Under 20 minutes is a fair target once the prompt is saved.

If empty-slot days do not fall, the usual cause is the cap, not the AI: you are physically unable to hold what you sell between visits. That is a business decision about visit frequency or machine type, and the sheet has just given you the number to make it with.

Before you hand over more of the business

Everything above is a decision-support job on data you already have. Anything that acts on the world, such as automatically ordering from a wholesaler or re-pricing a machine, deserves a human sign-off step at first. A mistyped quantity in an automatic order is cheap to catch on a list and expensive to catch on a pallet. If you would rather map which of these jobs are worth automating in your own operation, that is what my AI implementation consultation covers; you can book a 1:1 call here.

Questions vending operators ask before trying this

Does my sales export have to come from telemetry?

No. A weekly export from a cashless reader or a spreadsheet filled in at each visit both work. Telemetry just gives fresher numbers, so the visit ranking can be rebuilt each morning instead of each week. Without it, add a column for units refilled so the sheet can estimate what is left.

Which ChatGPT plan should I use for my sales sheet?

A sales export holds no personal data, so a standard paid plan is enough for most operators. Keep supplier price lists and location contracts out of the chat if their terms are confidential. On a personal plan, the 'Improve the model for everyone' switch under Data controls decides whether your chats can be used for training; turn it off if you would rather they were not.

Can AI decide which new products to stock?

It can suggest candidates from what already sells in similar sites, but it cannot know what a site will buy. Treat suggestions as a short trial list. Put one new product into one slot for four weeks and judge it on units per week, not on the AI's confidence.

What if two machines sit at the same site?

Give each its own machine ID and add a site column. Ask the AI to rank by site as well as by machine, so one trip serves both. The saving comes from skipping a second drive, and the AI can only see that if the site is in the sheet.

How often should I rerun the restock list?

Match it to how often you can actually visit. Weekly operators rerun it the evening before each route day. With telemetry and daily visits possible, run it each morning. Running it more often than you can act on it only produces lists nobody follows.

Further reads

Sources: OpenAI help pages on ChatGPT data controls and on projects (project instructions), checked 5 November 2026; the worked figures are illustrative, not measured.

Want your restock routine mapped to your own machines?

On a 1:1 call we can look at the sales data you already collect, decide which of the restock and ranking jobs is worth automating first, and set up something your team can run each week.

Book a 1:1 call with me