Your point-of-sale system or spreadsheet holds thousands of transactions, yet stock and promotion decisions are still made on gut feeling. Best-sellers run out on weekends while other items gather dust for months. The problem is rarely a lack of data; it is that the data never gets turned into answers you can act on.
You do not need a data science team to fix this. With clean records, a few well-written queries, and an AI assistant such as ChatGPT, Claude, or Gemini, a small business owner or the developer building their software can get insights that used to require an analyst. This guide walks through the full workflow, from raw transactions to decisions that actually change something.
What AI Is Good at, and What It Is Not
Large language models are excellent at explaining patterns, generating hypotheses, writing SQL or spreadsheet formulas, and summarizing findings in plain language. They are not reliable calculators. Paste 5,000 raw rows into a chat window and there is a real chance the totals will be wrong.
The safe split is simple: let your database or spreadsheet do the math, and let AI read the aggregated results and suggest actions. Tools that execute code, like ChatGPT's data analysis mode or Claude's analysis tool, can compute directly from a CSV, but you should still spot-check any number you plan to base a decision on.
| Approach | Best for | Strengths | Watch out for |
|---|---|---|---|
| Pivot tables (Excel, Google Sheets) | Owners with under ~50k rows | Free, easy to audit | Manual, easy to select the wrong range |
| SQL on your app database | Web-based POS or order systems | Accurate, automatable | Needs database access and basic SQL |
| Uploading a CSV to an AI assistant | Quick exploration and idea generation | Fast, conversational | Privacy concerns, numbers need checking |
| BI dashboards (Looker Studio, Metabase, Power BI) | Routine daily or weekly monitoring | Visual, refreshes automatically | Takes time to set up |
Step 1: Clean the Data First
Most bad analysis starts with messy data: the same product spelled three ways, refunds recorded as sales, dates stored as text. Before you ask AI anything, make sure every transaction has at least:
- a valid date and time;
- a consistent product code (SKU), not just a free-text name;
- quantity, unit price, and discount stored as numbers;
- an order or receipt ID to group items bought together;
- a status (paid, voided, refunded) so cancelled orders can be excluded.
Most POS systems already capture these fields; see What Is a POS System and How It Works for how that data is typically structured. If you are designing the schema yourself, designing a simple ERD up front will save you hours later.
Step 2: Aggregate with SQL
Summarize before you send anything to an AI model. The examples below use MySQL and assume an orders table and an order_items table. Adjust the names to match your system.
-- Revenue and units per product, last 90 days
SELECT p.sku, p.name,
SUM(oi.qty) AS units,
SUM(oi.qty * oi.price - oi.discount) AS revenue
FROM order_items oi
JOIN orders o ON o.id = oi.order_id
JOIN products p ON p.id = oi.product_id
WHERE o.status = 'paid'
AND o.created_at >= CURDATE() - INTERVAL 90 DAY
GROUP BY p.sku, p.name
ORDER BY revenue DESC;
-- Busiest hours by weekday
SELECT DAYNAME(created_at) AS weekday, HOUR(created_at) AS hour,
COUNT(*) AS orders
FROM orders
WHERE status = 'paid'
GROUP BY weekday, hour
ORDER BY orders DESC
LIMIT 15;
-- Products frequently bought together
SELECT a.product_id AS product_a, b.product_id AS product_b,
COUNT(*) AS times_together
FROM order_items a
JOIN order_items b ON a.order_id = b.order_id AND a.product_id < b.product_id
GROUP BY product_a, product_b
HAVING times_together >= 10
ORDER BY times_together DESC;
The third query is a lightweight market basket analysis. On large tables it can be slow, so limit the date range and make sure order_id and product_id are indexed. More performance tips are in Optimizing Laravel Eloquent Query Performance.
Step 3: Ask AI the Right Way
Once you have dozens of summarized rows instead of thousands of raw ones, give them to your assistant with real context. "Analyze this" produces generic output. A structured prompt produces something usable:
I run an online store selling home goods. Below is a 90-day
summary (CSV): sku, name, units, revenue.
Average gross margin: 45% for decor, 25% for kitchenware.
Tasks:
1. Classify products into A (top 70% of revenue), B (next 20%), C (last 10%).
2. Name 3 C-items that are the best candidates to discontinue, with reasons.
3. Suggest 2 bundles based on the product-pair data below.
4. State your assumptions explicitly. Do not invent numbers
that are not in the data.
[paste CSV here]
That last instruction matters. Asking the model to list its assumptions and not invent figures noticeably reduces made-up numbers.
Step 4: Forecast Demand Without a Data Scientist
Most small businesses do not need machine learning to plan stock. A rolling average plus a safety buffer gives you a sensible reorder point:
- Calculate average daily sales over the last 28 days. For example: 12 units per day.
- Find your supplier lead time, say 3 days.
- Add safety stock, for instance 50% of lead-time demand: 12 x 3 x 0.5 = 18 units.
- Reorder point = (12 x 3) + 18 = 54 units. When stock hits 54, reorder.
These numbers are illustrative. For seasonal peaks such as Black Friday, back-to-school, or holidays, ask the AI to derive multipliers from your own previous-year data rather than generic assumptions.
For developers: a weekly summary job in Laravel
// routes/console.php (Laravel 11)
use App\Jobs\SendWeeklySalesSummary;
use Illuminate\Support\Facades\Schedule;
Schedule::job(new SendWeeklySalesSummary)
->weeklyOn(1, '07:00')
->timezone('UTC');
Inside the job, run the aggregate queries, send the results to an LLM API for a short narrative, and email it to the owner. Because external API calls can be slow, run it on a queue, as explained in Laravel Queues and Jobs for Heavy Tasks. Send aggregates only, never customer names or contact details.
Common Mistakes and How to Fix Them
- Ranking by revenue instead of margin. Your top seller may barely break even. Add cost of goods so the analysis reflects profit.
- Forgetting to exclude voids and refunds. Always filter on paid status.
- Drawing conclusions from a short window. One week can be skewed by weather, holidays, or a promotion. Use 8 to 12 weeks minimum.
- Pasting personal data into public AI tools. Strip names, emails, and phone numbers, or use a business tier that excludes your data from model training.
- Treating AI suggestions as facts. They are hypotheses. Test a bundle in one channel or location for two weeks before rolling it out.
Monthly Analysis Checklist
- Pull 90 days of paid transactions.
- Fix duplicate or inconsistent SKUs and product names.
- Build summaries by product, by hour, and by product pair.
- Ask AI for an ABC classification and recommended actions, with assumptions listed.
- Manually verify two or three key figures.
- Pick no more than three actions, log the start date, and measure results next month.
A small loop you repeat every month beats one big analysis you never revisit. Start with the data you already have, keep the math in your database, and use AI where it is strongest: turning numbers into clear next steps.