Claude vs Gemini for Sales Dashboards: One CSV, the Same Checks

Claude vs Gemini for Sales Dashboards: One CSV, the Same Checks

Both dashboards reached the right answer on the starting sales file: $600 in net sales. That was the beginning of the comparison, not the verdict. A dashboard also needs to reject bad uploads, explain which file its numbers come from, and remain readable on a narrow screen.

I asked Claude and Gemini to build the same downloadable HTML dashboard for Harbor Thread, a fictional retailer. The brief included an embedded CSV, an exact duplicate, two product lines sharing one order, refunds, and rows that should be excluded. I then opened the generated files locally and ran the guided upload and mobile checks documented below. Independent calculation checks supplemented those browser observations.

Quick Verdict

For this particular task, Claude's original output was the stronger starting point. It displayed the expected figures, accepted the replacement and quoted-comma CSVs, rejected the invalid-number and missing-header CSVs, clearly marked retained data after a rejection, and kept its header and controls readable at 320 and 390 pixels.

Gemini's first output also calculated the baseline correctly, but extra independent checks exposed validation and CSV parsing weaknesses. I do not have equivalent documented Claude results for those extra cases, so they do not establish a head-to-head advantage. It used an external Tailwind dependency despite the request for a self-contained file. One targeted repair produced a self-contained version that passed the tested replacement, rejection, recovery, and quoted-comma uploads. Its mobile header still needed work.

These are results from one task and one initial output per tool, with one evaluated Gemini repair. They describe these artifacts, rather than establishing a general ranking of Claude and Gemini.

What the dashboard had to do

Each CSV row represented a product line. Gross sales and refunds were already line amounts, so multiplying them by quantity would have been wrong. Net sales meant gross minus refunds; it did not mean profit.

Only Completed lines dated September 28 through October 4, 2026, inclusive, belonged in the report. Deduplication had to compare all nine original columns and preserve the first exact match. Two different lines could share an order ID and still count toward sales.

The requested interface included five indicators, labeled channel and product charts, All/Store/Online filters, a replacement upload, the source filename, and an exclusion audit. Filters had to update applicable views consistently. Invalid required numbers, dates, or missing headers had to reject the entire replacement, with a prominent warning near the indicators. If previous figures remained visible, their source had to be clear.

The complete shared prompt and synthetic inputs are included in the accompanying kit.

How I Tested

The visible Claude configuration was Sonnet 5.5, Medium, Manual, on the Free plan. Gemini showed Auto; the underlying model version was not disclosed in the captured interface. These were the available app configurations, not matched API settings.

I performed the local Chrome uploads and responsive viewport checks, and checked the screenshots against the expected results. Separately, automated checks ran extracted JavaScript calculation logic in Node against an independent reference. Those checks exercised calculations and parsing, not browser clicks or file-upload events. The kit includes a runnable verifier for its five supplied CSVs.

I preserved the original HTML files and kept Gemini's evaluated repair separately. The public ZIP contains those three evaluated outputs; the excluded regeneration is not included. A later file was generated after the CSV was attached again in the chat, outside the planned initial-output-plus-one-repair sequence. It contained different code from the evaluated repair; I did not test its behavior, so I cannot say whether it improved or worsened the results. I excluded it because it was outside that sequence, not because of an observed score. Setup time, generation latency, subscription costs, and labor savings were not measured.

The independent answer

Swipe horizontally to view all columns.

Starting file scopeGrossRefundsNetIncluded linesDistinct orders
All$660$60$60065
Store$390$40$35032
Online$270$20$25033

The product breakdown was Jacket $300, Jeans $180, Shirt $90, and Belt $30. Those amounts sum to $600, as do the channel totals of $350 and $250.

The source contained 11 data rows. The audit should explain one exact duplicate, two non-Completed rows, and two rows outside the date range, leaving six included lines. Six lines became five orders because order A01 legitimately contained both a Jacket and a Belt.

The replacement fixture added a $60 Online Belt line. Its expected result was $720 gross, $60 refunds, $660 net, seven included lines, and six orders. The starting file's $660 gross and the replacement file's $660 net happen to be equal; they are different measures from different datasets.

What happened with the generated files

Swipe horizontally to view all columns.

CheckClaude originalGemini originalGemini after one repair
Starting and replacement calculationsMatched referenceMatched referenceMatched reference
Supplied invalid-number CSVRejected in logic and observed uploadRejected in logicRejected in logic and observed upload
Missing required headerRejected in logic and observed uploadRejected in logicRejected in logic and observed upload
Comma inside quoted productAccepted in logic and observed uploadAccepted in logicAccepted in logic and observed upload
Store and Online audit updatesObserved consistentUnfiltered audit found in codeObserved consistent
Clear previous-source warningObservedNeeded repairObserved
No external dependencyConfirmed in codeFailed: Tailwind CDNConfirmed in code
Narrow-screen headerReadable at 320/390 pxNot visually assessedCrowded at 390 px; clipped at 320 px

A correct result on a valid CSV did not demonstrate safe behavior on every invalid CSV. Gemini's original calculation logic accepted an empty gross amount as zero. It accepted February 30 as a date and excluded that row instead of rejecting the file. An incomplete row was silently skipped, and escaped quotation marks inside a product name were lost.

These additional cases were reproduced in extracted Gemini logic, not through observed uploads in its first dashboard. I do not have an equivalent documented set of results for Claude's original output on those four extra cases. They demonstrate specific weaknesses in Gemini's first artifact and the effect of its repair, but do not establish that Claude passed the same cases. The five supplied fixtures in the kit were checked across all three evaluated files.

Claude original: the replacement file produced $660 net, seven included lines, and six orders.
Claude original: the replacement file produced $660 net, seven included lines, and six orders. Click or tap to view at full size.
Gemini after one repair: the same replacement file produced the expected totals.
Gemini after one repair: the same replacement file produced the expected totals. Click or tap to view at full size.

One repair, followed by the same checks

The repair request identified concrete problems: remove the external dependency; reject empty or non-finite required numbers; validate real calendar dates; reject malformed field counts; preserve CSV quoting; update the audit with the channel filter; and identify retained figures as the previous valid source.

The revised file used embedded styling. Independent logic checks rejected the tested empty amount, invalid calendar date, incomplete row, and Infinity value. Escaped quotes and a quoted newline were preserved in those checks. That is useful evidence for the repair, not exhaustive CSV conformance certification.

In the local browser, the replacement produced $660 net with seven lines and six orders. Uploading the invalid-number CSV retained those figures with an explicit previous-source message. A subsequent valid source upload removed the error and restored $600 net.

The quoted fixture displayed “Shirt, cotton” as one product with $90 in both dashboards. I then uploaded the missing-header fixture, which was rejected for lacking refund_usd. After that rejection, both dashboards retained the data from the last valid upload, pa43-quoted.csv, and identified that previous source. Uploading the original source again cleared the warnings.

Claude made the retained-data state especially visible: a separate warning above the indicators, dimmed values, and dashed borders. Gemini's repaired version explained the retained source in its red rejection banner while leaving the indicator cards in their normal style.

Claude original: missing refund_usd rejected; the previous valid source is clearly identified.
Claude original: missing refund_usd rejected; the previous valid source is clearly identified. Click or tap to view at full size.
Gemini after one repair: missing refund_usd rejected; the banner identifies the previous valid source.
Gemini after one repair: missing refund_usd rejected; the banner identifies the previous valid source. Click or tap to view at full size.
Claude original: Shirt, cotton remains one product with $90 net.
Claude original: Shirt, cotton remains one product with $90 net. Click or tap to view at full size.

Mobile revealed a different problem

Chrome's responsive mode was used at widths of 390 and 320 pixels. This was desktop browser emulation, not a physical-phone test.

Claude wrapped its title, placed the upload control within its panel, and changed the indicator arrangement to fit the narrower width. The tested table could be moved horizontally to reach the result column.

Gemini's repaired dashboard kept the indicators legible, but its fixed header crowded the business name and wrapped the source filename below the header area. At 320 pixels, the title was clipped and the filter group extended beyond its card. Its audit table did scroll horizontally: after dragging within the table, the final columns and exclusion reasons became visible.

The table's need for horizontal scrolling was acceptable for a wide audit. The header clipping was a separate layout problem. These findings remain in the report; no second evaluated repair was made to remove them.

Claude original at 320 pixels: the header, controls, and indicators fit.
Claude original at 320 pixels: the header, controls, and indicators fit. Click or tap to view at full size.
Gemini after one repair at 320 pixels: header clipping and filter overflow remain visible.
Gemini after one repair at 320 pixels: header clipping and filter overflow remain visible. Click or tap to view at full size.

What I Learned from Testing

The most useful review was the transition between files. When an upload failed, the dashboard still looked like a sales report. Without an obvious source warning, a reader could associate valid old numbers with the rejected new file.

Another lesson was to check orders and lines separately. Removing every repeated order ID would have discarded a legitimate product line. A visually polished dashboard can hide that mistake unless the test data deliberately includes a multi-line order.

Finally, mobile inspection answered a question that calculation checks could not. Gemini's repaired arithmetic and upload behavior improved, yet its header still failed to fit cleanly. Reviewing only the code or only the initial desktop totals would have missed that.

Repeat the test

Download the reproducible test kit (ZIP) — includes the shared prompt, five synthetic CSV fixtures, reference totals, three dashboard outputs, and a Node.js calculation verifier. The repair prompt template is reusable guidance, not the exact transcript of the evaluated repair.

Extract the accompanying kit and open an output HTML file in your browser. Start with pa43-source.csv and compare All, Store, and Online against reference-results.json. Upload pa43-replacement.csv, then pa43-invalid.csv, then the source again. Check both the figures and the source warning.

Next, upload pa43-quoted.csv and verify that “Shirt, cotton” remains one product. Upload pa43-missing-header.csv and check the missing-header message. Restore the source. Inspect narrow widths and move within the audit table to reach its final columns.

For the independent calculation checks, run node verify-outputs.cjs from the extracted kit directory. This verifies the five supplied fixtures against the reference; it does not replace the browser protocol.

A simple spreadsheet provides a useful alternative for a small report: deduplicate exact rows, apply status/date filters, sum gross and refunds, and count distinct included order IDs. AI helped build the interface here. The resulting sales calculations are ordinary deterministic code.

Who Should Skip This Approach

Skip these prototypes if you need accounting reconciliation, access control, multi-user editing, a live store connection, or guaranteed compatibility with arbitrary exports. Those requirements were outside this experiment. Neither dashboard was tested with real customer data, production integrations, or large datasets.

The local HTML approach is more suitable for experimenting with a small, defined CSV structure and checking the output against a known answer before adopting it.

FAQ

Did both tools calculate the starting sales correctly?

Yes. Their extracted logic matched $600 net, six included product lines, and five orders. Browser screenshots also confirmed the baseline for Claude and Gemini's repaired output.

Was Gemini's repair successful?

It resolved the tested parsing, validation, dependency, and audit issues. The revised dashboard still had a narrow-screen header problem.

Does the dashboard use AI every time it calculates sales?

No. AI generated the HTML and JavaScript. The downloaded files perform their calculations with that code.

Are these sales results real?

No. Harbor Thread and the CSVs are synthetic test materials. No revenue improvement or business savings were measured.

Final Verdict

For this fixed retail-dashboard brief, Claude's original artifact required less intervention in the shared checks and handled narrow layouts better. Gemini became substantially more useful after one specific repair, but its mobile header remained unfinished. This comparison concerns the app configurations available during my test—Claude Sonnet 5.5 with the captured settings and Gemini Auto—not equivalent model settings or a controlled model benchmark. The extra Gemini probes do not support a comparative claim about Claude on those cases.

The practical decision is whether the generated file can pass your own reference calculations, reject bad inputs clearly, and remain usable where you will open it. The included materials make those checks repeatable.

For other business workflows alongside sales reporting, explore our AI tools for business hub.

Recommended Reading

John Deris

John Deris

John Deris combines postgraduate AI studies with hands-on product testing to help professionals and small businesses make clearer technology decisions.


Leave a Reply

Your email address will not be published. Required fields are marked *