How to Prepare Your Business Data for AI, Step by Step

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for How to Prepare Your Business Data for AI, Step by Step.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for How to Prepare Your Business Data for AI, Step by Step.

Start from one AI job, not from all your data. List the records that job needs, export them into one working copy, fix the fields the AI will read (dates, categories, names and free-text notes), strip out anything it shouldn't see, write a short description of each column, and test on 20 real examples before connecting anything live.

Most small businesses have enough data for useful AI work. The problem is usually that it's spread across four systems and described four different ways. The eight steps below pull it together for one job at a time, with a data dictionary template and a test that tells you whether the data is ready before you trust any answer built on it.

Follow me on Instagram@sagnikteaches

The running example is an illustrative photography studio with five people, doing family, newborn and business headshot sessions, with about 1,400 client records built up over six years.

Connect on LinkedInSagnik Bhattacharya

Step 1: Name the job and the question it answers (20 minutes)

"Get our data ready for AI" has no finish line. "Find past family clients who are due a follow-up session" does. Write one sentence describing the job, then list the facts the AI needs to do it. Everything else is out of scope for now.

Subscribe on YouTube@codingliquids
JOB: Find past family-session clients whose last shoot was 11-14 months
     ago, so we can invite them back.
FACTS NEEDED: client ID, first name, email, marketing permission (Y/N),
     session type, session date, number of sessions to date.
NOT NEEDED: addresses, payment details, gallery links, children's names.

The "not needed" line is as important as the rest. It shrinks the cleaning work and keeps sensitive data out of the job entirely. Other jobs would need different facts: "why don't enquiries turn into bookings?" needs enquiry source, date, service asked about and outcome, but no email addresses at all.

Step 2: Map where each fact lives (30 minutes)

For each fact on your list, find where it's actually recorded. For the studio:

SourceHoldsFormatProblem found
Booking systemSession dates and types since 2023CSV exportEarlier years missing
Old client spreadsheetClients from before 2023Spreadsheet, one tab per yearDifferent columns on each tab
Email marketing toolMarketing permissionCSV exportMatches clients by email only
Invoicing appPayments, useful for session countsCSV exportSome invoices under a partner's name
Paper consent formsPermission to use imagesPaper in a filing cabinetNot needed for this job

Two things usually come out of this step. You find a fact is recorded in two places that disagree (the booking system and the email tool held different marketing permissions for 40 clients). And you find a fact isn't recorded anywhere reliably, which tells you what to start capturing from today.

When two sources disagree, decide which one wins for each fact before you merge, and write the rule down. For marketing permission, the studio chose the email tool, because that's where clients actually unsubscribe: of the 40 conflicts, most were a "Y" in the booking system for someone who had clicked unsubscribe a year later. For the rest, where the email tool had no record at all, the rule was the cautious one: treat the permission as unknown. Picking the source per fact takes minutes and stops the merge quietly reinstating people who said no.

Step 3: Export everything into one working copy (1 hour)

Pull each source out as a CSV file, the plain comma-separated format every tool can read, and combine them in one spreadsheet. Four habits prevent most later problems:

  • Keep the raw exports untouched in a dated folder. You'll want to go back to them when something looks odd.
  • Add a "source" column to every row so you always know where a record came from.
  • Give each record a stable ID. If your systems don't share one, create it (C0001, C0002…) and use it everywhere. It's also what lets you remove names later without losing track of who's who.
  • Save as UTF-8 CSV when asked, so accented names don't turn into strings of odd symbols when another tool opens the file.

That last one shows up in a way that's easy to misread. The studio's first combined file had a first name that appeared as "Renée" in one source and "Renée" in another, so the duplicate check treated them as two different clients. Nothing looked broken; there were just 30 or so more "unique" clients than there should have been. Re-exporting the old spreadsheet as UTF-8 fixed all of them at once.

Step 4: Fix the structure the AI will read (2 to 4 hours)

This is where most of the work goes. AI tools read your data literally; a human can see that "Fam", "family" and "Family shoot" mean the same thing, but a model counting sessions may not. Work through these fixes in order:

  1. One fact per column. Split "Newborn - Sept - paid" into session type, month and payment status.
  2. One format for dates. Convert every date to year-month-day (2025-04-03). This matters more than it looks: "03/04/2025" means different days in different conventions, and a mix of the two in one column produces confident, wrong answers.
  3. A fixed list for categories. Decide the allowed values (Family, Newborn, Headshot, Event) and map every variant to one of them. A data-validation drop-down stops new variants creeping in.
  4. Numbers as numbers. Remove currency symbols and "approx" notes from number columns, and put the currency in the column heading instead.
  5. Blanks mean one thing. Decide whether blank means "unknown" or "none", and replace "N/A", "-", "0" and "tbc" with that single convention.
  6. No layout tricks. Remove merged cells, subtotal rows, notes typed below the data and colour-coding that carries meaning. An AI tool reading the file can't see that red rows were "didn't pay".

Here's one row from the old spreadsheet's 2021 tab before and after those fixes (illustrative):

FieldBeforeAfter
SessionFam shoot - parksession_type: Family; location: Outdoor
Date3/4/212021-04-03 (checked against the invoice, which said 3 April)
Amount$350 approxamount_usd: 350
PaidRow shaded redpaid: N
Repeat client?N/ABlank (the convention chosen for "unknown")

The date line is the one to copy. When a date could be read either way, don't guess the convention for the whole tab: check a few rows against another record, such as the invoice, and convert the tab once you know.

If you're working in a spreadsheet, cleaning messy data has the formulas for most of these fixes.

Step 5: Make free-text notes usable (1 to 2 hours)

Notes fields are often the most valuable data a small business holds ("wants outdoor shoot next spring", "second baby due in March") and the messiest. You have two options for existing notes. You can leave them as text and let the AI read them in context, which works for small volumes. Or you can have AI extract specific fields from them, which works better at scale:

For each note below, extract:
- future_interest: the session type mentioned for the future, or blank
- timing: when they said they'd want it (as written), or blank
Return a table with the client ID and those two fields only.
If a note doesn't mention either, leave both blank. Do not guess.

On four of the studio's notes, the first run came back like this (illustrative):

Notefuture_interesttiming
C0233: "Loved it. Want to come back when the baby arrives, due March."Newborndue March
C0418: "Asked about headshots for her business at some point"Headshotat some point
C0561: "Kids were tired, lovely blossom shots though"Familyspring
C0702: "Maybe a Christmas mini session?"Christmas miniChristmas

The first two are right. The third is invented: the client expressed no future interest, and the model turned "blossom" into a spring booking despite "do not guess". The fourth used a value outside the studio's category list. Two edits fixed both: listing the allowed session types in the prompt, and adding "only extract an interest the client said they have; a description of this session is not a future interest".

Run it on a company AI account, on notes stripped of anything the job doesn't need, and check 20 results by hand before trusting the rest. For new notes, a simple structure (what happened, what they want next, when) stops the problem recurring.

Step 6: Remove what the job doesn't need (30 minutes)

Go back to the "not needed" line from step 1 and delete those columns from the working copy. For jobs that don't need to know who a person is (spotting trends, analysing enquiry sources), replace names and emails with the client ID. If you haven't sorted your data by sensitivity yet, classifying business data before using AI tools gives you a four-tier scheme for deciding what goes where.

The awkward case is a job that genuinely needs a sensitive fact. The studio's second job was inviting newborn clients back for a first-birthday session, which needs to know roughly when each baby was born. The working copy kept a single column, baby_month, holding the year and month of the newborn shoot (2025-11), and nothing else: no baby's name, no exact birth date, no notes about the birth. The shoot month is close enough to time an invitation, and it's far less sensitive than the details sitting in the original booking notes. Ask of every sensitive field whether a coarser version would do the job; it usually will.

Step 7: Write a data dictionary (30 minutes)

A data dictionary is a short description of each column. It helps the next person, and it helps the AI: pasting it in alongside the data cuts misreadings sharply.

DATA DICTIONARY: family_followup_v1.csv   Refreshed: monthly by [name]
client_id        Unique ID, format C0001. One row per client.
first_name       As the client gave it.
email            Lower case. Blank = no email held.
marketing_ok     Y = permission given, N = refused or withdrawn.
                 Blank = unknown; treat as N.
session_type     One of: Family, Newborn, Headshot, Event.
last_session     Date of most recent session, YYYY-MM-DD.
session_count    Number of paid sessions to date (from invoices).
source           booking_system / old_sheet / merged.

The line "Blank = unknown; treat as N" is the kind of instruction that prevents a real mistake: emailing people who never gave permission.

Step 8: Test on 20 cases where you already know the answer (1 hour)

Before you rely on the data, pick 20 records you know well and ask the AI questions whose answers you can check. For the studio: "Which of these clients qualify for the follow-up invitation, and why?" Then mark each answer right or wrong.

Their first test scored 16 out of 20. Three errors came from dates that hadn't been converted (one export wrote dates month first, everything else day first), and one from a client listed twice under a maiden name and a married name. Four rows of the test sheet show how each kind looked:

ClientKnown answerAI saidRight?Cause
C0107Qualifies: family shoot 2025-09-20, marketing_ok YQualifiesYes
C0388Qualifies: last shoot 2 August 2025Doesn't qualify, "last session 19 months ago"NoStored as 08/02/2025 (month first), read as 8 February
C0519Doesn't qualify: booked again in March 2026 under her married nameQualifiesNoDuplicate record
C0650Doesn't qualify: marketing_ok blankDoesn't qualifyYesThe dictionary's "treat as N" rule worked

Asking the AI to give its reason, as in the C0388 row, is what makes the causes quick to find. After fixing both kinds of error, the retest scored 20 out of 20. For duplicates like that one, cleaning up customer records before you add AI covers matching and merging properly.

If the job involves analysing figures rather than picking records, add a second test: ask for a total you can check against your accounts. If the AI's number doesn't match, the data or the question needs fixing before anyone acts on it. When the studio asked for paid sessions in 2025, the AI said 212 and the invoicing app said 204. The gap was eight refunded sessions, still in the working copy as ordinary rows because the export listed refunds as separate lines with negative amounts. Adding a refunded column and one line to the dictionary ("exclude refunded = Y from all counts") brought the two figures together. What to upload and check when AI analyses a spreadsheet has more tests of this kind.

How long it took the studio, and what it cost

StepTimeResult
1-2: job and sources50 minutesOne job, five sources mapped
3: working copy1 hour1,400 rows combined
4-5: structure and notesAbout 4 hours1,150 unique clients after merging duplicates; 1 in 5 had no session type until notes were read
6-7: trimming and dictionary1 hourSeven columns kept out of 23
8: testing and fixes1.5 hours20 out of 20 on the retest

About eight hours in total, with no new software: a spreadsheet and the studio's existing AI account. The first follow-up campaign built on it went to around 90 qualifying clients. The second job took half the time, because the IDs, date formats and category lists were already in place. That's the real return on this work: each job after the first is cheaper. To see where the studio took the campaign next, filling mini-session slots with AI marketing picks up the story.

Keeping it ready after the first job

A working copy starts ageing the day you make it. Three habits stop you redoing the whole exercise in six months:

  1. Fix problems at the source, not in the copy. If the booking system lets staff type any session type they like, add a drop-down there. Every fix you make only in the working copy has to be made again at the next export.
  2. Name one owner and one refresh date. The studio's office manager re-exports on the first Monday of each month and updates the "Refreshed" line in the dictionary. It takes about 40 minutes now that the steps are known.
  3. Version the file, don't overwrite it. Save each refresh with the date in the name (family_followup_2026-10-05.csv) and keep the previous two. When an answer looks wrong, you can check whether the data changed or the question did.

These habits matter even more once an AI tool is connected directly to a system rather than reading an export, because there's no longer a copy between your data and the answers.

Signs your data still isn't ready

  • Answers change when you ask the same question twice. Often a sign the AI is guessing around ambiguous fields.
  • Totals don't match your accounts. Duplicates, refunds counted as sales, or rows from the wrong period.
  • New category values keep appearing. The drop-down lists aren't enforced at the point of entry.
  • The AI fills blanks with plausible values. Tighten the instruction ("leave blank; do not guess") and check your dictionary says what blank means.

For a broader clean-up before a bigger project, the data readiness checklist covers every system at once rather than one job at a time.

Further reads

Want your data checked before an AI project?

On a 1:1 call we'll pick the AI job you have in mind, look at where the data for it lives, and agree the few fixes that matter before anything gets connected.

Book a 1:1 call with me