xMatix
Sign in Request demo
xMatix
PRODUCTS
SalesField SalesCRMRewardsClaimsInventoryProcurementWarehouse ManagementField ServiceServiceSupportTelephony & MessagingFinance & AccountingPayrollExpense ManagementCommercePortalsAnalytics & ReportingData StudioMobile AppSee all products →
PLATFORM
Platform overviewApp BuilderAutomationIntegrationsSecurity & GovernanceChange ManagementDevelopers
SENSE AI
Sense AI overviewSense AssistSense ControlSense VisionAI StudioTrust & governanceIn Claude & ChatGPTUse cases
SOLUTIONS
FMCG & DistributionManufacturing & Dealer NetworksAutomotive & DealershipsPharma & HealthcareConsumer DurablesAgri-InputsBuilding MaterialsService NetworksWarehousing & 3PLFinancial AccountingERP SoftwareIndia GST ComplianceUAE VAT & e-InvoicingSaudi ZATCA & VATAll solutions →
RESOURCES
Knowledge CenterDeveloper & CLIBlogGuidesWhat is xMatix?Company facts
COMPANY
AboutCareersPartnersEventsContactAuthorsLegal
Sign in Request demo
BLOG · AI & TRUST

The chart is the answer

A model that answers "which customers dropped more than twenty percent" with a paragraph has failed, however accurate the paragraph. What it took to make Sense answer with the chart the question deserved — and the trap in the data we had to fix first.

· AI & Analytics · · 7 min read

A transcript from one of our own tenants: someone asked Sense which customers' sales had dropped more than twenty percent against the previous quarter. The answer was correct. It was also eight tool calls long, listed accounts by their internal identifiers, confused the page size of a query with the size of the population, and delivered the result as a text table where two charts so obviously belonged that the person reading it would have drawn them by hand.

Every one of those is a distinct failure with a distinct fix, and together they are a good illustration of what "AI over your data" actually consists of once the demo is over.

The aggregate tool was answering a smaller question

Sense answers questions about populations through an aggregate tool: group these records by that field, count or sum or average, return the groups. The tool did that. What it did not do was say how many groups there were, as opposed to how many it returned in one page. A model told "here are twenty-five groups" will happily report twenty-five customers when the truth is four hundred, because nothing told it otherwise.

So the result now carries the true group count alongside the page. It also carries names. Records in a business platform relate to each other by identifiers, and an aggregate grouped by customer naturally comes back keyed by the customer's identifier — meaningless to a person, and a model that sees only identifiers will either show them or guess. The tool now resolves every lookup in the grouping to its display name in the same call. This is the unglamorous half of grounding: not teaching the model about your data, but making sure the data it receives is the kind a person could read.

Period over period in one call

"Dropped against last quarter" is two aggregations and a subtraction. Eight tool calls is what happens when a model has to run this quarter, run last quarter, line the groups up by hand and notice the ones that are missing. The tool now accepts a comparison filter: the same grouping evaluated over a second period, returned side by side, with the gaps filled — a customer who bought last quarter and nothing this quarter appears with a zero, which is precisely the customer the question was about. One call, and the model's remaining job is to say which rows crossed the threshold.

Where a chart is the answer

The result of an aggregate is a dataset with a shape, and the platform already knows how to draw datasets with shapes: the dashboards. Rather than teach the chat a second charting system, an aggregate now produces a chart specification in the dashboard's own schema, and the chat renders it with the dashboard's own chart component — on the web and in the mobile app, and again when the conversation is reopened from history. Same colours, same drill behaviour, same tooltips a user already knows from their dashboard.

The agent can ask for any of the dashboard's grouped chart kinds — bars, columns, lines, areas, pies, funnels and the rest — and for more than one series: the sum of this quarter and the sum of last, or revenue and count side by side, each with its own filter. A handful of kinds that only make sense over raw distributions are refused with a reason rather than drawn badly. The model decides whether a chart belongs at all; a single number is still a sentence.

Top ten, and the honest remainder

Four hundred customers do not fit on a bar chart. The obvious fix, showing the top ten, has a quiet dishonesty in it: the chart now implies those ten are the population. So the result carries both the full table and a chart-ready view of the top groups with one extra bar, Others, computed as the grand total minus what is shown. The chart tells the truth about the whole while staying readable about the parts, and the model states how many groups were folded. Drilling into a real bar opens the records behind it; drilling into Others does nothing, deliberately.

Running the dashboard the business already has

Alongside this, agents gained the ability to run existing dashboards, not just draft them. For a question the business already answers with a dashboard, the right move is to run that dashboard through the same evaluator the product uses and return its widgets, rather than reconstruct the logic from raw tables and produce something subtly different from what the business considers official. Report-first, dashboard-first, raw data last — that ordering is written into the agent's instructions, because a platform with well-built dashboards usually has the correct answer already.

What it took, and what it did not

None of this changed the model. It changed the tools the model is given and the shape of what they return: a true count instead of a page count, names instead of identifiers, a comparison instead of two calls and a subtraction, a chart specification instead of a table of numbers, a remainder instead of an implied whole. The model got smarter about our data because our data got easier to be smart about.

The same tools serve every surface. The chat in xMatix, the assistant on the mobile app, and an external assistant connected through the MCP endpoint all call the same aggregate and get the same chart-ready result, under the same permissions. Fix the tool once and every conversation improves.

Related: Sense Assist · Analytics & Reporting · Grounding an agent in your own model

← All posts
See it on your business.
Request a demo