vibehowto

Home / Solve a real problem / Get reports from your customer spreadsheet with AI (without sharing it)

Get reports from your customer spreadsheet with AI (without sharing it)

Updated Sep 26, 2026

Turn a messy customer spreadsheet into weekly reports with AI, while the AI only ever sees your column names, never your customers. About 25 minutes.

You'll turn a messy customer spreadsheet into a clean copy, a "top customers" report, and a Monday summary your boss can read in a minute. After that, it's one command every week.

The important part: Claude never sees your customers. It only sees your column names. It writes small programs (scripts) that do the work, and you run them on your real file.

It takes about 25 minutes the first time.

How it stays private

  1. You
    Copy your column names

    Claude seescolumn names

  2. Claude
    Writes scripts and tests them on fake data

    Claude seesfake data

  3. You
    Run the scripts on your real file, in your own tab

    Claude seesnothing

  4. You
    Get reports with no personal details

    Claude seesnothing

  5. Claude
    Chats with you about the summary

    Claude seestotals only

You'll use two Terminal tabs:

  • Tab 1: Claude. It builds and tests everything on a fake copy of your spreadsheet.
  • Tab 2: you. You run the finished scripts on your real spreadsheet. Nothing from tab 2 ever goes to Claude.

That's the whole skill, and it works far beyond spreadsheets: give Claude the shape of your problem, not your private data.

Meet Maya (and her fake spreadsheet)

Maya is a customer success manager at a small subscription company. Every Monday her boss asks: who are our best customers, and how is revenue doing? She answers by filtering and copy-pasting in Excel for an hour.

Her spreadsheet has one row per customer: ID, name, email, phone, company, state, plan, signup date, what they paid each of the last 12 months, last login, support tickets, and notes.

Follow along with her spreadsheet. It's completely fake (example.com emails, and 555 phone numbers like in the movies) and messy the way real exports are. Or use your own. The steps are the same.

Step 1: Check the rules, then make two folders

Many companies have rules about AI and customer data. With this method Claude never sees the data, but check anyway, and follow your company's rules if they're stricter. Not sure? Practice with the fake file.

Open Terminal and make two folders:

Terminal
mkdir -p ~/Documents/work-data ~/Projects/customer-reports
  • work-data is private. Your real spreadsheet goes here.
  • customer-reports is the project, where Claude works.

Put your spreadsheet (or the downloaded practice file) in Documents → work-data using Finder.

Step 2: Give Claude context: column names and rules

This is what "context engineering" means: give Claude everything it needs to do good work, and nothing it shouldn't have.

Copy your column names. Open your spreadsheet, click the 1 on the left edge to select the first row, and press Cmd + C. That's the only thing from your file Claude will ever see.

Start Claude in the project folder:

Terminal
cd ~/Projects/customer-reports
Terminal
claude

Paste this prompt, and replace the [bracketed part] with your column names:

Copy and paste this
I'm a customer success manager at a small subscription company. Here are the column names from my customer spreadsheet (I copied row 1 only, no customer data):

[paste your column names here]

Each row is one customer. The month columns are what that customer paid us that month. My real spreadsheet is in ~/Documents/work-data. Please set up this project:

1. Create CLAUDE.md with these rules, so you follow them every time:

# Customer reports project

## Privacy rules (always follow these)
- My real spreadsheet is in ~/Documents/work-data. Never open, read, list, or search anything there, and never run scripts on it. I run the scripts on the real file myself.
- Build and test everything using sample-customers.xlsx, which is fake.
- Reports must never include names, emails, phone numbers, companies, or notes. Refer to customers only by Customer ID.
- Summary reports show totals only. Hide any group with fewer than 3 customers.

## How scripts should work
- Python 3, using only built-in modules plus openpyxl.
- Each script takes the spreadsheet's location as its first argument, works with .xlsx or .csv, and saves its results in a "reports" folder next to that spreadsheet. Never change the original file.
- Add short comments explaining each part, written for someone who has never coded.

2. Create .claude/settings.json with a deny rule that blocks you from reading or editing anything in ~/Documents/work-data.

3. Check that the openpyxl add-on is installed. If it isn't, install it with: python3 -m pip install --user openpyxl

4. Create sample-customers.xlsx: 40 fake customers with exactly these columns, messy the way real exports are (extra spaces, mixed capitalization, "Last, First" names, phone numbers and dates in different formats, money like "$1,200.00" or "USD 99", a duplicate customer, a blank row). Include big spenders, customers whose spending is slowly dropping, some who stopped paying, and some who joined partway through the year. Use example.com emails and 555-01xx phone numbers so it's obviously fake.

Claude will ask permission before creating .claude/settings.json. Choose Yes. That file is the lock that stops Claude from opening your work-data folder, and Claude Code always asks before changing its own safety settings. That's a good sign, not a problem.

When it's done, you'll have:

  • CLAUDE.md, the project's memory. Claude reads it at the start of every conversation here, so the privacy rules apply every time without you repeating them.
  • The lock, a settings file that blocks Claude from reading or changing anything in work-data.
  • openpyxl, a free add-on that lets Python read Excel files.
  • sample-customers.xlsx, a fake practice copy of your spreadsheet: your columns, fake people, realistic mess.

Restart Claude once so the lock takes effect: type /exit, then claude. When we tested this and told Claude to open the real file anyway, it refused because of the rules in CLAUDE.md, and the lock blocked it too.

Step 3: Have Claude write the cleanup script

Copy and paste this
Now write clean.py. It reads my spreadsheet and saves a cleaned copy called customers-clean.xlsx in the reports folder:
- remove extra spaces, blank rows, and duplicate customers (same Customer ID or same email)
- names as "First Last" with normal capitalization
- emails in lowercase (blank if it isn't a real email)
- phone numbers like (415) 555-0101
- dates like 2026-03-14
- states as two-letter codes
- plans written consistently: [your plan names, for example Starter, Pro, Business], and flag any plan that isn't one of these
- money as plain numbers (a dash or blank means 0 for months after they signed up)
- anything you can't fix, list on a "Cleaning notes" tab by Customer ID only

Test it on sample-customers.xlsx and tell me what it fixed.

Replace the [bracketed part] with your own plan names. Telling Claude your categories matters. In our tests, when we left the plan names out, the script couldn't know that "Biz" was unusual, so it didn't flag it.

Claude writes the script, tests it on the fake sample, and reports what it changed. Read its questions. In our tests it asked whether a date like 03/04/2026 means March 4 or April 3, instead of guessing. You want a careful analyst, not a confident guesser.

Step 4: Run it on your real spreadsheet, in your own tab

Open a second Terminal tab with Cmd + T. Claude stays open in the first tab. In the new tab:

Terminal
cd ~/Projects/customer-reports
Terminal
python3 clean.py ~/Documents/work-data/customers.xlsx

(Different file name? Type python3 clean.py , then drag your spreadsheet from Finder into the Terminal window.)

You'll see a summary like this:

What you'll see
What was fixed:
   173  cells with extra spaces
    47  phone numbers reformatted
    83  dates converted
   574  money amounts converted to numbers
     2  duplicate customers removed

31 item(s) to double-check - see the 'Cleaning notes' tab.

Your cleaned copy is in work-data → reports, and your original is untouched. The cleaned copy still has names and emails, so keep it as private as the original.

Fix what the notes flag: describe the pattern, never the data. Open the Cleaning notes tab. It lists Customer IDs and what's wrong, never the actual values. In our test, the real file wrote Business as "Biz", and some logins said "187 days ago". Claude's fake sample had neither, so the script left them alone instead of guessing. Back in tab 1, tell Claude the pattern, and share nothing else:

Copy and paste this
I ran clean.py on my real spreadsheet and found two patterns. Some plans are written as "Biz", which means Business, and our plans are Starter, Pro, and Business. And some Last Login values are written like "187 days ago" instead of a date; treat those as that many days before today. Update clean.py to handle both, flag any plan that isn't Starter, Pro, or Business on the Cleaning notes tab, add a few examples to the sample file so they're tested, and test it.

Then run clean.py again in tab 2. Some notes aren't cleaning problems at all. In our test, a few customers were charged before their signup date. That's a real question for your billing system, and exactly the kind of thing you want to know about.

Step 5: Build the reports and the Monday command

One prompt, three scripts:

Copy and paste this
Now write two reports that read the cleaned file, plus one command to run everything:

1. top_customers.py saves top-customers.csv: for each customer, their Customer ID, plan, state, average monthly spend (only counting months they were a customer), and total spend for the last 12 months, highest first. Add average spend by plan at the bottom.

2. monday_summary.py saves monday-summary.txt, written in plain English for my boss: revenue for each of the last 12 months, the change from last month, how many customers are new this month, how many stopped paying, and revenue by plan.

3. run_all.py runs clean.py and then both reports, so every Monday I can type one command: python3 run_all.py path/to/my-spreadsheet.xlsx. At the end, tell me which report is safe to share and which file to keep private.

Follow the privacy rules. Test everything on the sample and show me the top 5 customers and the summary.

"Follow the privacy rules" is enough, because they're in CLAUDE.md.

Then, in tab 2:

Terminal
python3 run_all.py ~/Documents/work-data/customers.xlsx

That's your Monday routine from now on: export the spreadsheet, drop it in work-data, run that one line. Run it the same day you export, because things like "187 days ago" count back from today.

Open the reports in Excel or Numbers. Customers appear only by ID. To see who C-1036 is, look them up in your cleaned copy. That lookup never leaves your computer.

In our tests, Claude also caught privacy problems nobody asked about. The only customer in one state was identifiable from the state column. When one plan's revenue was hidden, anyone could subtract the visible plans from the total and work it out. When Claude points out a risk like that, take it seriously.

Step 6: Chat with your summary

This is the payoff. The summary has only totals, so it's safe to paste into Claude. Copy everything in monday-summary.txt, and in tab 1 say:

Copy and paste this
Here's this week's customer summary. It's totals only, no individual customer details.

[paste the summary]

Write a short update for my boss: 5 bullet points, plain English, what's going well, what to watch, and one suggested action.

In our test, Claude spotted a four-month revenue decline, suggested where to look, warned that the month might not be complete yet, and noticed that "Biz" and "Business" looked like the same plan. It never saw a single customer.

Go further

Ask your own questions. Every new question is a new script. Try:

Copy and paste this
Write at_risk.py: customers who might leave, with reasons. Flag them if their spending over the last 3 months is at least 30% lower than the 9 months before, if they haven't logged in for 30 days, or if they have 3 or more support tickets. IDs only. Test it on the sample, then add it to run_all.py.
Copy and paste this
Compare revenue in the first 6 months to the last 6 months, by plan. Totals only.
Copy and paste this
Which plan has the most customers who stopped paying, as a percentage? Totals only.

Four habits make prompts like these work:

  1. Say what the columns mean. "Support Tickets (90 days) is how many help requests they opened in the last 90 days."
  2. Define fuzzy words. What counts as "stopped paying"? "Paid last month, nothing this month."
  3. Say exactly what you want back. "A CSV with these columns," or "plain English for my boss."
  4. Keep the privacy rules in CLAUDE.md, so you only need to say "IDs only" or "totals only."

Look inside the code. You didn't write any code, but ask Claude: "Explain clean.py like I've never coded." Every script here has the same simple shape: import lines load tools (like openpyxl for Excel), the script reads the spreadsheet one row at a time, a loop applies the same fixes to every row, if checks handle special cases, and the results are saved to the reports folder, never over your original. The commented versions of all the scripts from this guide are on GitHub: buildleansaas/vibehowto-customer-reports.

Checklist

Saved in this browser. No account. Clearing site data wipes it.

Next: Automate your weekly work report · Projects

Get new guides and videos by email

One email when something new is up. No spam. Unsubscribe anytime.