Before you start
What “working” looks like
- Your transaction export sits in one tab, exactly as your accounting system produced it.
- A mapping table, which you control, says what each account and supplier is for.
- Every transaction lands in exactly one management group, and the report total matches your profit and loss.
- A checks panel tells you when something is wrong or unclassified before you trust the numbers.
- You can see where the money went, which costs are growing, your biggest suppliers, and every contract that renews on its own.
- Next month, you import the new export and everything updates. Nothing is rebuilt.
What you need
- A transaction listing for your expense accounts for the last 12 complete months, as CSV or Excel (step 02 explains which report).
- Your profit and loss for the same months, to check against.
- A rough idea of how your team’s time splits between serving customers, selling, looking after existing customers and running the business.
- A Google account the business controls (see guide 01 for why), or Excel for Microsoft 365.
- For the free route: a free ChatGPT account at chatgpt.com, if you would like help with the mapping.
- For the AI workspace route: Claude Pro or ChatGPT Plus, with that company’s desktop app on Mac or Windows.
No export to hand yet? Practise with our invented sample transaction listing (CSV): 12 months of costs for Koppie Lane IT, a fictional 12-person IT support firm. Every name and number in it is made up. The expected results in this guide are for that file.
01
Decide what the report must answer
This guide builds a report that answers four questions most owners can’t answer from the profit and loss:
- Where does the money actually go: serving customers, winning them, keeping them, or running the business?
- Which of those is growing faster than the business?
- Who are we paying the most?
- What renews automatically, and has its price crept up?
Keep these four questions in front of you. They decide every mapping choice in steps 04 and 05.
02
Export the transaction listing
Every accounting system names this report differently. Look for a report that lists one row per transaction, with the account it was posted to, often called “Account Transactions”, “General Ledger Detail”, “Transaction Detail by Account” or “Detailed General Ledger”. A profit-and-loss summary is not enough.
- Choose the last 12 complete months. Leave out the current, unfinished month.
- Include only expense accounts: cost of sales, operating expenses and interest. Leave out income, bank, debtors, creditors and VAT control accounts.
- Make sure the report includes: date, account name, supplier (or contact), description, reference and the amount excluding VAT.
- Include supplier credits. They reduce costs and belong in the total.
- Export as CSV if you can; Excel also works.
- From the profit and loss for the same months, add up cost of sales, expenses and interest, and write down the total. You will check against it in step 06.
Choose your route
Two ways to build the report
Free route: Google Sheets with ChatGPT as a helper
You build the workbook yourself with the formulas below. ChatGPT only sees your account names, never your transactions. Excel equivalents are noted where they differ.
Continue with the free route ↓AI workspace route: Claude Cowork or ChatGPT Work
For readers with Claude Pro or ChatGPT Plus. The AI proposes the mapping, you decide it, and the AI builds the whole workbook to the same specification. Your job is to check its work. This route sends supplier-level spending to the AI company.
Continue with the AI workspace route ↓03 · Free route
Set up the spreadsheet and import the export
- In Google Drive, create a folder named
Cost report – liveand a new Google Sheet inside it namedCost report. - Rename the first tab
Data. Add four more tabs namedMapping,Classified,ChecksandReport. - With the
Datatab open, select File → Import → Upload and choose your export. - For Import location, choose Replace current sheet. Leave the separator on Detect automatically. Select Import data.
- Select View → Freeze → 1 row so the headings stay visible.
This guide assumes the sample file’s column order: A Date, B Account code, C Account name, D Supplier, E Description, F Reference, G Source, H Amount excl VAT, I VAT, J Amount incl VAT. If yours is different, step 05 shows how to adapt the formulas.
Data sheet of a new workbook with the same five sheets. Next month, paste over it the same way.04 · Free route
Build the mapping table
This is the heart of the guide. Your accounts say what kind of cost something is. The mapping says what it is for. It uses six management groups:
- Delivering the service
- What it costs to serve paying customers: materials, stock resold, tools used on client work, site travel.
- Winning new customers
- What it costs to get a first sale: advertising, lead generation, sales commission, sales tools.
- Keeping customers
- What it costs to hold on to the customers you have: renewal discounts, review meetings, newsletters, client events.
- Running the business
- Central costs: rent, admin, accounting, insurance, office software.
- Owner and non-operating
- Spending that is not part of running the business: loan interest, personal purchases on the business card.
- Not yet classified
- Anything your mapping can’t place. This must be close to zero before you trust the report (step 08).
- In the
Mappingtab, type these headings in row 1: AAccount, BGroup, CRenews automatically, EKeyword, FGroup, GRenews automatically, IGroup, JShare of salaries. - In cell A2, list every account in your export:
=SORT(UNIQUE(FILTER(Data!C2:C, Data!C2:C<>""))) - Select column A, copy it, and paste it back with Edit → Paste special → Values only. The list now stays put when next month’s data arrives, so your groups stay next to the right accounts.
- For each account, type a group in column B, exactly as written above, and
YesorNoin column C for whether it renews without anyone deciding. For salaries, typeSplit by role(step 05 explains). For an account that mixes purposes, pick its most common purpose for now; step 05 handles the exceptions.
The sample file’s accounts are mapped like this:
| Account | Group | Renews automatically |
|---|---|---|
| Advertising and marketing | Winning new customers | No |
| Bank charges | Running the business | No |
| Commission paid | Winning new customers | No |
| Cost of sales - hardware | Delivering the service | No |
| Discounts allowed | Keeping customers | No |
| Entertainment | Running the business | No |
| General expenses | Not yet classified | No |
| Insurance | Running the business | Yes |
| Interest paid | Owner and non-operating | No |
| Motor vehicle expenses | Delivering the service | No |
| Professional fees | Running the business | No |
| Rent | Running the business | Yes |
| Salaries and wages | Split by role | No |
| Software subscriptions | Running the business | Yes |
| Telephone and internet | Running the business | Yes |
Want a second opinion? Ask ChatGPT. It only needs your account names, not your transactions:
Copy this prompt
I run a [type of business] with [number] people. I’m sorting my accounting accounts into six management groups: Delivering the service, Winning new customers, Keeping customers, Running the business, Owner and non-operating, and Split by role (salaries only). Here are my account names, one per line: [paste column A of the Mapping tab].
For each account, suggest the most likely group and say whether it usually renews automatically. Then list the accounts that commonly mix more than one purpose, and for each say what kinds of supplier or description would belong to a different group. Don’t guess where you’re unsure; say so.
05 · Free route
Add rules for mixed accounts and split salaries
Keyword rules
A rule says: when this word appears in the supplier or description, use this group instead of the account’s. To find the mixed accounts, select Data → Create a filter on the Data tab, filter one account at a time, and read down the suppliers. Anywhere you think “that one is really for something else”, add a rule in columns E to G of Mapping.
- Keywords are not case sensitive, and part of a word is enough:
Signal LeadsorSignal. - The first matching rule wins, so put specific keywords above general ones.
- Leave Renews automatically blank to keep the account’s setting.
- Remove the filter when you are done (Data → Remove filter).
The sample needs these rules:
| Keyword | Group | Renews automatically |
|---|---|---|
| Riverbend | Keeping customers | (blank) |
| NetWatch | Delivering the service | (blank) |
| HelpLoop | Delivering the service | (blank) |
| SafeCopy | Delivering the service | (blank) |
| DeskPilot | Delivering the service | (blank) |
| LinkPoint | Delivering the service | (blank) |
| PipeTrack | Winning new customers | (blank) |
| Postbird | Keeping customers | (blank) |
| Client review | Keeping customers | (blank) |
| Signal Leads | Winning new customers | Yes |
| Fleetline | Delivering the service | Yes |
| Stationery | Running the business | (blank) |
| Coffee | Running the business | (blank) |
| personal | Owner and non-operating | (blank) |
Salary split
Salaries are usually the biggest cost, and they arrive as one journal a month. Leaving them in one lump hides most of what it costs to win and keep customers. In Mapping columns I and J, enter the four operating groups and the share of payroll each one takes. The shares must add up to 100%.
| Group | Share of salaries |
|---|---|
| Delivering the service | 66% |
| Winning new customers | 9% |
| Keeping customers | 8% |
| Running the business | 17% |
Work the shares out on paper, not in the sheet. List each role, its monthly cost from your payroll report, and roughly how that person’s time divides. A technician is all delivery; a salesperson might be 80% winning and 20% keeping. Add the rand amounts per group and divide by total payroll. Only the four percentages go into the workbook, never names or individual pay.
If your columns are different
Using the sample file? Skip to step 06. Otherwise, give ChatGPT your column headings and two or three rows you invent by hand, never the export itself:
Copy this prompt
I’m building a cost report in Google Sheets. My accounting export is in a tab called Data. These are its column headings, in order, starting in column A: [paste header row]. Here are three example rows with invented suppliers and rounded amounts: [paste rows].
The guide I’m following expects: A date, C account name, D supplier, E description, F reference, H amount excluding VAT. 1. Tell me which of my columns holds each of these, and flag anything missing or ambiguous instead of guessing. 2. Rewrite each of these formulas for my columns, one per line: [paste the formulas from steps 04, 06 and 07].
06 · Free route
Classify every line and check the data
In the Classified tab, type these headings in row 1: A Date, B Month, C Account, D Supplier, E Description, F Amount, G Group, H Renews. Then enter three formulas. Each one fills its columns all the way down and grows with next month’s data, so there is nothing to drag.
| Cell | Fills | Formula |
|---|---|---|
| A2 | Date, month, account, supplier, description and amount | =ARRAYFORMULA(IF(Data!A2:A="", "", {Data!A2:A, TEXT(Data!A2:A, "yyyy-mm"), Data!C2:C, Data!D2:D, Data!E2:E, Data!H2:H})) |
| G2 | Management group | =MAP(Data!C2:C, Data!D2:D, Data!E2:E, LAMBDA(account, supplier, description, IF(account="", "", LET(rule, IFERROR(INDEX(FILTER(Mapping!F2:F, Mapping!E2:E<>"", ISNUMBER(SEARCH(Mapping!E2:E, supplier&" "&description))), 1), ""), IF(rule<>"", rule, IFERROR(VLOOKUP(account, Mapping!A2:B, 2, FALSE), "Not yet classified")))))) |
| H2 | Renews automatically | =MAP(Data!C2:C, Data!D2:D, Data!E2:E, LAMBDA(account, supplier, description, IF(account="", "", LET(rule, IFERROR(INDEX(FILTER(Mapping!G2:G, Mapping!E2:E<>"", ISNUMBER(SEARCH(Mapping!E2:E, supplier&" "&description))), 1), ""), IF(rule<>"", rule, IFERROR(VLOOKUP(account, Mapping!A2:C, 3, FALSE), "No")))))) |
Select column A and choose Format → Number → Date so dates don’t show as numbers.
Now, in the Checks tab, enter these labels in column A and formulas in column B. The last column shows what the sample listing should give. (The report-total check shows an error until step 07 is done.)
| Label | Formula | Sample result |
|---|---|---|
| Rows of data | =COUNTA(Data!A2:A) | 514 |
| Total excl VAT | =SUM(Data!H2:H) | R7 340 320 |
| First date | =MIN(Data!A2:A) | 1 Nov 2025 |
| Last date | =MAX(Data!A2:A) | 28 Oct 2026 |
| Months in the data | =COUNTA(UNIQUE(FILTER(Classified!B2:B, Classified!B2:B<>""))) | 12 |
| Dates not recognised | =COUNTA(Data!A2:A)-COUNT(Data!A2:A) | 0 |
| Accounts missing from Mapping | =SUMPRODUCT((Data!C2:C<>"")*(COUNTIF(Mapping!A2:A, Data!C2:C)=0)) | 0 |
| Lines not yet classified | =COUNTIF(Classified!G2:G, "Not yet classified") | 12 |
| Unclassified share of total | =SUMIF(Classified!G2:G, "Not yet classified", Classified!F2:F)/SUM(Data!H2:H) | 0.25% |
| Salary split adds up to | =SUM(Mapping!J2:J) | 100% |
| Report total minus data total | =ROUND(SUM(Report!B2:B7)-SUM(Data!H2:H), 2) | 0 |
| Lines that appear more than once | =SUMPRODUCT((Data!A2:A<>"")*(COUNTIFS(Data!A2:A, Data!A2:A, Data!D2:D, Data!D2:D, Data!F2:F, Data!F2:F, Data!H2:H, Data!H2:H)>1)) | 2 |
Then work through these before going further:
- Total excl VAT must match the profit-and-loss total you wrote down in step 02. If it doesn’t, the export is missing an account, includes VAT, or covers the wrong months.
- Months in the data must be 12. The comparison in step 07 relies on it.
- Accounts missing from Mapping must be 0. If not, a new account has appeared: add it to the bottom of column A in
Mappingand give it a group. - Salary split adds up to must be 100%.
- Lines that appear more than once counts both copies. In the sample, one bookkeeping bill was captured twice, so the books themselves are overstated by R6 500. Ask your bookkeeper to reverse the duplicate, then export again.
To see the unclassified lines, enter this in cell D1 of the Checks tab: =FILTER(Classified!A2:F, Classified!G2:G="Not yet classified"). The sample shows 12 card purchases with descriptions like “Card purchase - online store”. Step 08 deals with them.
ARRAYFORMULA( and its closing bracket, because Excel spills arrays on its own. Replace open-ended ranges such as Data!A2:A with a fixed range such as Data!A2:A5000, using the same end row everywhere. In Excel 2021, which has no MAP, put the group formula in G2 without MAP, refer to row 2 (Data!C2, Data!D2, Data!E2) and fill it down past your last row.07 · Free route
Build the report
The Report tab has five parts. Build them in this order.
1. Where the money went (A1:C7)
- Type
Group,Last 12 monthsandSharein A1:C1. - Type the six management groups in A2:A7, in the order listed in step 04.
- In B2:
=SUMIF(Classified!$G$2:$G, A2, Classified!$F$2:$F) + SUMIF(Classified!$G$2:$G, "Split by role", Classified!$F$2:$F) * IFERROR(VLOOKUP(A2, Mapping!$I$2:$J, 2, FALSE), 0) - In C2:
=B2/SUM($B$2:$B$7). Copy B2:C2 down to row 7.
2. Month by month (A11 onwards)
- Type
Monthin A11. In B11:=TRANSPOSE(A2:A7) - In A12:
=SORT(UNIQUE(FILTER(Classified!B2:B, Classified!B2:B<>""))) - In B12, then copy it across to G12:
=MAP($A12:$A, LAMBDA(m, IF(m="", "", SUMIFS(Classified!$F$2:$F, Classified!$B$2:$B, m, Classified!$G$2:$G, B$11) + SUMIFS(Classified!$F$2:$F, Classified!$B$2:$B, m, Classified!$G$2:$G, "Split by role") * IFERROR(VLOOKUP(B$11, Mapping!$I$2:$J, 2, FALSE), 0)))) - Select A11:G23, choose Insert → Chart, and set the chart type to Stacked column chart. Drag the chart below the table, to row 26 or lower.
3. First three months against the last three (E1:H7)
- Type
Group,First 3 months,Last 3 monthsandChangein E1:H1. - In E2:
=A2 - In F2:
=SUM(INDEX($B$12:$G$14, 0, MATCH(E2, $B$11:$G$11, 0))) - In G2:
=SUM(INDEX($B$21:$G$23, 0, MATCH(E2, $B$11:$G$11, 0))) - In H2:
=IF(F2=0, "", G2/F2-1). Copy E2:H2 down to row 7.
4. Top suppliers, excluding payroll (J11)
In J11: =QUERY(Data!A1:J, "select D, sum(H) where D is not null and D <> 'Payroll' group by D order by sum(H) desc limit 10 label sum(H) 'Last 12 months'", 1)
5. Contracts that renew on their own (M11 onwards)
- Type
Supplier,First charge,Latest monthandChangein M11:P11. - In M12:
=SORT(UNIQUE(FILTER(Classified!D2:D, Classified!H2:H="Yes"))) - In N12:
=MAP(M12:M, LAMBDA(s, IF(s="", "", INDEX(FILTER(Classified!F2:F, Classified!D2:D=s), 1)))) - In O12:
=MAP(M12:M, LAMBDA(s, IF(s="", "", SUMIFS(Classified!F2:F, Classified!D2:D, s, Classified!B2:B, $A$23)))) - In P12:
=MAP(N12:N, O12:O, LAMBDA(first, latest, IF(first="", "", latest/first-1)))
Format the Share, Change and Last 12 months columns as percentages or currency with Format → Number. When you are done, Report total minus data total on the Checks tab must show 0.
=TAKE(GROUPBY(Data!D2:D5000, Data!H2:H5000, SUM, 0, 0, -2, (Data!D2:D5000<>"")*(Data!D2:D5000<>"Payroll")), 10). For the chart, choose Insert → Column → Stacked Column.08 · Free route
Read the report and close the gaps
Close the gaps first
Unclassified lines are a bookkeeping gap, not a spreadsheet problem. Send the list from step 06 to whoever holds the card or does the books, and ask them to recode each one to the right account or add the supplier and a description in the accounting system. Then export again. Don’t fix them in the sheet: the books would stay vague and next month the gap comes back.
You can use the report while Unclassified share of total is under 1%. Above that, close the gaps before drawing conclusions. The sample is at 0.25%, so it is usable.
What the sample shows
| Group | Last 12 months | Share |
|---|---|---|
| Delivering the service | R4 621 246 | 63.0% |
| Winning new customers | R695 082 | 9.5% |
| Keeping customers | R501 860 | 6.8% |
| Running the business | R1 480 482 | 20.2% |
| Owner and non-operating | R22 970 | 0.3% |
| Not yet classified | R18 680 | 0.3% |
| Group | Nov 2025 – Jan 2026 | Aug – Oct 2026 | Change |
|---|---|---|---|
| Delivering the service | R1 142 500 | R1 195 478 | +4.6% |
| Winning new customers | R140 744 | R202 112 | +43.6% |
| Keeping customers | R134 770 | R117 200 | −13.0% |
| Running the business | R377 609 | R368 477 | −2.4% |
| Owner and non-operating | R6 350 | R5 850 | −7.9% |
| Not yet classified | R3 530 | R3 870 | +9.6% |
- Total costs grew 4.8%, but the cost of winning customers grew 43.6%. On the profit and loss, Advertising looks flat: R14 950 in November, R14 611 in October. Inside it, Google Ads went from R5 850 to R14 061 a month while client events faded away. And a lead-generation retainer that started in February sits in Professional fees, where nobody would look for it.
- The cost of keeping customers fell 13%. Fine if it was a choice. Worth asking about if nobody decided it, especially while more is being spent winning new ones.
- Three of 20 renewing contracts changed price: NetWatch rose 18% and OfficeOne 12%, and the Signal Leads retainer more than doubled, from R5 000 to R11 000.
- Three pairs of software tools do the same job (remote access, passwords, file sharing). The renewing list puts them side by side; ask which one in each pair you need.
03 · AI workspace route
Make a safe upload copy and turn off training
- Open your export and delete every column the report doesn’t use. Keep only: date, account name, supplier, description, reference and amount excluding VAT.
- Check that payroll appears as one line a month, with no employee names or individual pay (see step 02). If it doesn’t, sort that out with your bookkeeper before uploading anything.
- Where a supplier is a private person, such as a freelancer or a landlord, replace their name with a fixed label such as
Contractor 1. Use the same label every month so the mapping still recognises them. - On your computer, create a folder named
Cost reportand save the copy there ascost-listing-upload.csv. Practising? Do the same to the sample file: delete its Account code, Source, VAT and Amount incl VAT columns. - In Claude: select your name, then Settings → Privacy, and turn off Help improve our AI models.
- In ChatGPT: open your account menu, then Settings → Data controls, and turn off Improve the model for everyone.
04 · AI workspace route
Open your AI workspace
Follow the instructions for the tool you pay for. Both lead to the same place.
Claude Cowork (Claude Pro)
- Install the Claude Desktop app for Mac or Windows from
claude.ai/downloadand sign in. - If your message box offers Chat and Cowork, select Cowork. Newer accounts have one combined experience and no separate option.
- Select Projects in the left navigation, create a project and choose Use an existing folder. Pick your
Cost reportfolder. - Leave the approval mode on Manual for the first build, so Claude asks before each action.
ChatGPT Work (ChatGPT Plus)
- Install the ChatGPT desktop app for Mac or Windows and sign in.
- In the message box, switch from Chat to Work.
- Keep Work locally selected, not Cloud. Only Work locally can use files on your computer.
- Give ChatGPT access to your
Cost reportfolder when it asks. Approve each action it proposes during the first build.
Both apps change often. If a label here doesn’t match what you see, look for the option to give the app access to a folder on your computer.
05 · AI workspace route
Let the AI propose the mapping, then decide it yourself
Read the six management groups and the note on why correct totals can hide the problem in step 04. Then work out your salary split on paper, as described under “Salary split” in step 05. Paste this prompt into Claude or ChatGPT. It is the same for both.
Copy this prompt
I want to sort my business costs by what the money is for. cost-listing-upload.csv is my accounting transaction listing for the last 12 complete months, amounts excluding VAT. I run a [type of business] with [number] people.
Propose a mapping using exactly these groups: Delivering the service, Winning new customers, Keeping customers, Running the business, Owner and non-operating, Not yet classified. Salaries go to “Split by role”.
Create Mapping.xlsx in this folder with three tables. 1. Accounts: every account in the file, its most likely group, and Yes or No for whether it renews automatically. 2. Rules: a keyword found in the supplier or description, the group it should use instead of its account’s, and Yes, No or blank for renews. Add a rule only where one account clearly mixes purposes, and put specific keywords above general ones. 3. Salary split: [Delivering the service X%, Winning new customers X%, Keeping customers X%, Running the business X%].
Then list, in a short table, every account you think mixes purposes and every rule you added, with one line explaining each. List lines you can’t place as “Not yet classified”; don’t guess.
- Open
Mapping.xlsxand go through every row. The AI knows accounting conventions, but only you know that the client lunch was about keeping a customer or that a tool is used on client work. Change anything that’s wrong, directly in the file. - Check that the salary split adds up to 100%.
- Save the file. From now on, this mapping is yours: the AI uses it but doesn’t change it.
Practising with the sample? Use this prompt instead, so your results match the ones in this guide:
Sample practice prompt
Create Mapping.xlsx in this folder with three tables, exactly as given. Accounts (account, group, renews): Advertising and marketing, Winning new customers, No; Bank charges, Running the business, No; Commission paid, Winning new customers, No; Cost of sales - hardware, Delivering the service, No; Discounts allowed, Keeping customers, No; Entertainment, Running the business, No; General expenses, Not yet classified, No; Insurance, Running the business, Yes; Interest paid, Owner and non-operating, No; Motor vehicle expenses, Delivering the service, No; Professional fees, Running the business, No; Rent, Running the business, Yes; Salaries and wages, Split by role, No; Software subscriptions, Running the business, Yes; Telephone and internet, Running the business, Yes. Rules, in this order (keyword, group, renews): Riverbend, Keeping customers, blank; NetWatch, Delivering the service, blank; HelpLoop, Delivering the service, blank; SafeCopy, Delivering the service, blank; DeskPilot, Delivering the service, blank; LinkPoint, Delivering the service, blank; PipeTrack, Winning new customers, blank; Postbird, Keeping customers, blank; Client review, Keeping customers, blank; Signal Leads, Winning new customers, Yes; Fleetline, Delivering the service, Yes; Stationery, Running the business, blank; Coffee, Running the business, blank; personal, Owner and non-operating, blank. Salary split: Delivering the service 66%, Winning new customers 9%, Keeping customers 8%, Running the business 17%.
06 · AI workspace route
Ask for the whole workbook in one go
Start a new task in the same folder and paste this prompt. It is the same for both tools.
Copy this prompt
Build a cost report workbook from cost-listing-upload.csv, using the mapping in Mapping.xlsx. The CSV is my accounting transaction listing for the last 12 complete months, amounts excluding VAT.
Make five tabs. 1. Data: the CSV exactly as supplied. Do not change, sort, clean or remove anything. 2. Mapping: the three tables from Mapping.xlsx, unchanged. 3. Classified: one row per Data row, with its month and its group and renews setting. A rule applies when its keyword appears anywhere in the supplier or description, ignoring case; the first matching rule wins; otherwise use the account’s group; an account that isn’t in Mapping is Not yet classified. 4. Checks: the number of rows; total excluding VAT; first and last date; the number of months; dates that aren’t real dates; accounts missing from Mapping; the number of lines not yet classified and their share of the total; the salary split total; the Report total minus the Data total; lines that appear more than once (same date, supplier, reference and amount); and a list of the unclassified lines. 5. Report: the total and share for each group over the 12 months; each group’s first three months against its last three, with the change; each group by month with a stacked column chart; the top 10 suppliers excluding payroll; and every supplier that renews automatically, with its first charge, its latest month and the change.
Rules: “Split by role” lines are shared across the four operating groups using the salary split, so every rand lands in exactly one group and the Report total equals the Data total. Every number on Classified, Checks and Report must be a formula that reads the Data and Mapping tabs, so replacing the Data tab next month updates everything. Don’t invent or estimate anything. If a column you need is missing or unclear, stop and ask me.
Save it as Cost report.xlsx in this folder. Then give me a short table of every value on the Checks tab.
07 · AI workspace route
Check its work
- Open the workbook. Select three numbers on the Report tab and confirm the formula bar shows a formula, not a typed number.
- Compare the total on the Checks tab with the profit-and-loss total you wrote down in step 02, and confirm Report total minus Data total is 0. Practising with the sample? Every Checks value should match the “Sample result” column in step 06.
- Open the Mapping tab and confirm it is exactly your Mapping.xlsx, with nothing added or changed.
- Pick five lines on the Classified tab, including one from a mixed account, and check each landed in the group you would choose.
- Compare the Report with step 08’s tables. With the sample, Winning new customers is R695 082 over the year and rises 43.6% from the first three months to the last three; NetWatch, OfficeOne and Signal Leads are the only renewing suppliers whose price changed.
- If anything differs, tell the AI exactly which number is wrong and what it should be, and ask it to show the formula it used. Check again after every fix.
Then read the report and close the gaps exactly as in step 08.
08 · AI workspace route
Save the monthly refresh and know what you’re trusting
Keep this prompt. You will use it every month in step 09.
Monthly refresh prompt
This is my monthly cost report refresh. Use my current Cost report workbook and this month’s cost-listing-upload.csv. Replace the whole Data tab with the new file exactly as supplied. Don’t change the Mapping tab or any formula, tab, chart or layout.
Then give me: every value on the Checks tab; each group’s first three months against its last three; any renewing supplier whose price changed; and any new account or supplier, with the group you would suggest for it. Only suggest; I will change the Mapping tab myself. Save the result as a new workbook named Cost report followed by the month and year.
Claude Cowork
Open your project and paste the prompt into its Instructions, so Claude follows it in every task in that project. Each month you will start a new task there and say “Run the monthly refresh.”
Claude’s scheduled tasks can’t read folders on your computer and don’t offer a monthly option, so you run the refresh yourself after exporting.
ChatGPT Work
Save the prompt as a note in your Cost report folder. Each month, open the desktop app, switch to Work with Work locally selected, give it the same folder and paste the prompt.
Work can also save the prompt as a template, which saves pasting it each month.
- The workbook is yours. It keeps working without the AI tool; only the refresh needs it.
- Keep last month’s workbook. If a refresh goes wrong, you can compare the two or go back.
- The AI’s summary is a convenience. The Checks tab is the evidence. Read the checks, not only the summary.
- The mapping is a decision. Change it yourself, and only after thinking about it.
09
Refresh it next month
- Export the latest 12 complete months the same way as in step 02.
- Free route: open the
Datatab, select File → Import → Upload, and choose Replace current sheet. AI workspace route: make the upload copy as in step 03, then run your saved refresh from step 08. - Look at the
Checkstab. Fix anything that isn’t as expected, especially new accounts, new unclassified lines and duplicates. - Read the report against the four questions from step 01. Write down one action.
10
Keep it useful
- Monthly: refresh, check, and add rules for any new supplier that belongs somewhere other than its account’s group.
- Every six months: redo the salary split. Roles change, and so does how people spend their time.
- Before any renewal: look at the renewing list and decide, rather than let it happen.
- Backups: before changing the mapping, select File → Make a copy (AI route: copy
Cost report.xlsxin your folder).
Common fixes
- The total doesn’t match the profit and loss
- Look for a missing account (often cost of sales or interest), VAT-inclusive amounts, an extra month, or income accounts included by mistake.
- Report total minus data total isn’t 0
- A group in
Mappingcolumn B or F is spelt differently from the six in the report. Copy and paste the group names rather than retyping them. - A supplier lands in the wrong group
- A rule higher up the list is matching first. A short keyword like
Coffeecan catch more than you meant. Make the keyword more specific or move the rule down. - Dates show as text (Dates not recognised is above 0)
- Check File → Settings → Locale matches the date format in your export, then import again. Exporting dates as year-month-day avoids the problem altogether.
- A formula shows #ERROR! or #VALUE!
- If your spreadsheet uses semicolons, replace the commas between formula parts with semicolons. Otherwise paste the formula and error into ChatGPT and ask what is wrong, without any data.
Official instructions used in this guide
Tool interfaces change. If a menu or label here doesn’t match what you see, these official instructions are the place to check. The Claude and ChatGPT steps match guide 02, checked on 26 September 2026:
If you would rather not do this alone
Bring the export you have. We’ll help you see where the money is going.
This guide is enough on its own when your costs come from one accounting system, the checks match your profit and loss, and you know roughly how your team’s time is spent.
It’s worth getting help when:
- unclassified spend never gets below 1%, because the bookkeeping itself needs fixing;
- you run more than one branch or entity and central costs need sharing out;
- you need the cost of serving each customer or product, not just each group;
- the report shows something you can’t explain;
- or you’ve built it and nobody acts on it.