Products AI Voice Agents WhatsApp Agents Sales Meeting Agents Rocket Sales Agent TenderCraft Procurement Intelligence Customer Risk Intelligence SAP AI Copilot Sales Order Email Agent Voxdonna Personal Assistant Donna Photoshoot Virtual Try-On Prescription OCR Explore Demos How it works Pricing Book a Demo
SAP AI Copilot

Your SAP exports already have the answer. Nobody has the time.

Point it at the folder your team already downloads into. Ask the question in plain language. Get the number, the chart, and the file it came from — or a refusal, when the data cannot answer it.

The live app is behind a login. Ask us for credentials, or bring your own exports to a walkthrough.

No SAP integration — Excel files in a folder 0% hallucination on the benchmark 4.1s to a chart, p95
Which business unit performed worst last quarter? 3.8s
BU-2100 Wire₹ 41.2 Cr
BU-3400 Cables₹ 31.8 Cr
BU-1200 Rope₹ 21.5 Cr
BU-5000 Services₹ 8.4 Cr
Services contributed ₹ 8.4 Cr in Q3, the lowest of the four units and 21% below its own Q2. Wire held the top position for the third straight quarter.
3 files FI_GL_Q3.xlsx · FI_GL_Q2.xlsx · BU_MASTER.xlsb metric: net_revenue every figure traced to a row
The problem

The report exists. The answer takes four days.

Finance pulls the export. Someone pivots it. Someone else checks the pivot. By the time the number reaches the meeting, the meeting has moved on.

🧮

The analyst is the bottleneck

Every question routes through the two people who know which tab holds the real figure. They are also the two people you need for closing.

🎲

A chatbot on a spreadsheet guesses

Ask a general-purpose model to read your export and it will produce a confident number. Sometimes it is the right one. You will not know which time.

🧩

SAP exports are not tables

Banner rows, merged headers, subtotals folded into the data, trailing-sign negatives. Every generic tool trips on the first file.

How it works

The model never writes the SQL. That is the whole design.

It picks from metrics and dimensions that exist in your catalog. Code compiles that into the query. A number that was never computed cannot be invented.

Step 01

Drop the exports in a folder

xlsx, xlsm, xls and xlsb. It finds the real table under the banners, reads the locale per file, and keeps leading-zero keys as text so the joins survive.

Step 02

Your question becomes a spec

Metrics, dimensions, filters, a date range. Each one has to exist in the catalog. If your question needs something that does not, it is refused, not approximated.

Step 03

Table, chart, and the sentence

The chart type follows the shape of the query, so it is never a guess. The prose only restates rows that exist — anything it cannot account for is caught and rewritten.

Measured, not promised

Forty-five questions. Marked against hand-written SQL.

Ground truth is computed independently of the product's own semantic layer, so if the catalog is wrong the two disagree and the suite fails.

MetricTargetMeasured
Numerical accuracy≥ 90%100%
Hallucination rate≤ 5%0%
Refusal accuracy on out-of-scope questions100%
Chart correctness100%
Time to visualisation, p95< 5s4.1s

Measured on a fixture warehouse of roughly 472,000 synthetic SAP rows across aggregates, filters, group-bys, joins, rankings, time series, year-on-year comparisons, currency conversion, and nine questions that are deliberately unanswerable. The suite is re-run on every change.

The part that is actually hard

ALV exports break every generic reader.

This is what the ingestion layer is tested against, file by file, before a single question gets asked.

01

Report title, client and selection-screen rows sitting above the real header.

02

Two-row merged headers, where the column name is split across both.

03

Subtotal and grand-total rows interleaved with the data on the sort field.

04

Trailing-sign negatives — 1.234,56- is -1234.56, not a text value.

05

German and US number locales in the same deployment. 39,000 is 39 in one and 39,000 in the other, so locale is decided per file.

06

Dates as DD.MM.YYYY, YYYYMMDD and native Excel serials, in the same folder.

07

Leading-zero keys like 0000012345, which must stay strings or every join silently drops rows.

08

German column names and the binary .xlsb format, both handled without a manual mapping step.

Governance

Every figure has a receipt.

Auditors do not accept "the system said so". Each answer carries the metric definition it used, the filters applied, and the source files it read. The query engine is read-only, capped on rows, and killed on a timeout, so a badly phrased question cannot touch your data or your bill.

1
Refusal is structural

An unmapped metric fails validation before any query exists. There is no path where it answers anyway.

2
Lineage is not a feature, it is a by-product

Source files, filters and definitions fall out of the spec that produced the query.

3
The prose is checked against the table

A quantity in the sentence that no row can account for triggers a repair, then a plain fallback. An unexplained answer is recoverable. A wrong number is not.

# what the answer carries question: worst business unit, last quarter metric: net_revenue definition: sum(amount) where doc_type in (RV, RE) net of credit notes dimension: business_unit filter: period = 2026-Q3 currency: INR, FX from rate table sources: FI_GL_Q3.xlsx (218,004 rows) FI_GL_Q2.xlsx (203,711 rows) BU_MASTER.xlsb (48 rows) rows_returned: 4 grounding_check: PASS
What your team gets

Self-serve numbers, without a new ERP project.

💬

Ask, don't file a request

Business users get their own answer in seconds. Finance stops being a queue for questions that were always simple.

📂

Data explorer

Every ingested file with its row count, types, missingness, and the keys it can join on. You see what the system sees.

🚫

Honest refusals

"Your data does not contain that" is a valid answer and a rare one to get from an AI tool. It is what makes the other answers worth trusting.

🔁

Idempotent ingestion

Re-run the folder as often as you like. Files already loaded are skipped, updated files are re-read, nothing double-counts.

🔐

Nothing touches SAP

The only data ingress is Excel files in a folder. No connector, no basis team, no change window, no production risk.

🌍

Multi-entity from the start

Several locales, currencies and column languages in one deployment, resolved per file rather than per install.

Pricing

Scoped to your catalog, not your headcount.

Cost follows how many report families you put under management and how deep the history goes, not how many people ask questions. We size it with you before anything is signed. Pilots start on one report family.

Single-report pilot Function rollout Group-wide
Get a tailored quote

Send us one folder. We'll send back the questions it can answer.

A pilot runs on your own exports. You bring ten questions your team asks every month. We show you the answers, the lineage behind each one, and the ones the system refuses.