AWRA OpsHub Search

The Export Is Not the Report: Row Caps, Missing Formats and the "N/A" That Breaks Your SUM

Three formats, but not on every dataset. A row cap that applies quietly. And a CSV convention that turns an empty cell into the text "N/A", which is why your total in Excel is wrong. The mechanics of getting data out, stated exactly.

Reports & BI Washingtone Aura 11 min read

Nobody plans their reporting around export mechanics, and then a Thursday arrives when it is the only thing that matters. The auditor wants the full year in a spreadsheet. The bank wants a PDF with your letterhead on it. Somebody sums a column in Excel and gets a number that is obviously wrong but not obviously wrong enough for anyone to check. All three of those are the same category of problem: the export is not the report, and the differences between them are specific.

This is the unglamorous article. It is also the one that saves an afternoon, because every behaviour below is a fixed rule rather than a mystery, and knowing them changes how you ask for things.

Three formats, unevenly available

CSV, PDF and XLSX all exist. What surprises people is that the third is not offered everywhere: XLSX is available on nine of the thirty reporting datasets, and the other twenty-one are CSV and PDF only. That is a per-dataset property, not a permission you can grant yourself.

Where each format is the right choice

Format Available on Use it when Watch out for
CSV No No No
XLSX No No No
PDF No No No

Built and maintained Configurable by you, not maintained by us Not built

The nine XLSX datasets are the HR ones — employees, leave, attendance, payroll runs — plus projects, tasks and time entries, tickets, and expenses. The pattern is roughly "datasets built later", which is honest but not something you can predict from the outside. Check the format list on the dataset you actually need before promising a spreadsheet to somebody.

The row cap, and what happens above it

Exports are capped at 5,000 rows. This is the number worth committing to memory, because of how the cap behaves rather than because of its size.

Separately, a report matching more than 10,000 rows is handed to a background queue rather than generated while you wait, and you are told the export is being prepared. That is sensible — a large export should not tie up a browser. The interaction between those two numbers is the part to understand.

A full-year invoice export in a business doing 30,000 invoices

Rows matching your filters 30,000
Above the 10,000 async threshold, so the export is queued You are told it is being prepared
The file that arrives 5,000 rows
Any warning row, header note or truncation marker in the file None
Does the run record show the real matching count? Yes — the count is taken before the cap is applied
How you would notice **By comparing the file to the row count on screen**
The rule to work by Never export a period you have not first checked the row count for

This is the behaviour we would most like you to take away, because it fails quietly and in the direction of looking correct. A truncated CSV is a well-formed CSV. It opens, it sums, it looks like a year. The habit that prevents it costs five seconds: run the report, read the row count, and if it is near or above five thousand, split the export by month or quarter before you export anything.

The "N/A" problem, which is the one that costs money

When a CSV is written, an empty value is not written as an empty cell. It is written as the three characters N/A.

For a text column that is merely untidy. For a numeric column it is a genuine trap, and here is the mechanism. Excel and Google Sheets look at a column and decide whether it is numbers or text. A column of amounts containing a handful of "N/A" entries is a text column with numbers in it, so SUM skips what it cannot read and returns a total that is confidently, silently too low. No error, no warning, no green triangle in most cases. Just a figure that is wrong by however much the blank rows would have contributed — which is nothing, arithmetically, but the same coercion breaks averages, pivots, sorting and any lookup on that column, and those are not nothing.

Handling it in about thirty seconds

  • Find and replace "N/A" with nothing across the sheet, before you do anything else, then check that your numeric columns right-align. Right alignment is the free confirmation that the column is genuinely numeric.
  • Do it before building formulas, not after. A pivot table built on a text column will not silently repair itself when you clean the data underneath it, and you will spend longer diagnosing that than the original cleanup would have taken.
  • Prefer XLSX where the dataset offers it — nine of them do, mostly HR and projects — since typed cells avoid the whole question.
  • Sanity-check one total against the on-screen report every time, on any file you are about to send outside. This catches truncation and coercion in the same glance, which makes it the highest-value five seconds in the process.
  • Never send a raw export to a lender, auditor or funder without opening it. Not because it is likely wrong, but because they will build on it and the correction is far more expensive than the check.

Two access questions the format hides

Exports are where data controls actually get tested, because a file leaves the building and your permissions do not travel with it.

Control What it does What to set it to
Per-field export restriction Marks a column as barred from exports while leaving it readable on screen. Independent of marking a field sensitive, which is a separate flag. Set it on national ID numbers, bank details, individual salary figures and personal phone numbers. Screen-readable and file-barred is the correct setting for most personal data.
External schedule recipients Whether scheduled reports may be delivered to email addresses outside your organisation. Permitted by default. Leave enabled if you genuinely send reports to an external accountant or funder. Know that it is on.
Allowed external domains An allowlist of domains external recipients must belong to. Empty by default — and empty means no domain restriction at all, not "none allowed". If you use external delivery, populate it with the two or three domains you actually send to. An empty list is the permissive setting, which is the opposite of how an allowlist usually reads.
The export record itself Every export writes a row with its format, file size in bytes and its own actor, separate from the run that produced it. Nothing to configure. Worth knowing it exists — it is what makes who took what an answerable question.

Exports, precisely

What AWRA OpsHub does today

  • CSV and PDF on every dataset; XLSX on nine of the thirty.
  • A configurable row cap, at 5,000 by default.
  • Automatic background queueing for reports matching more than 10,000 rows, so large exports do not block the browser.
  • Timestamped filenames on CSV and XLSX, so repeat exports do not collide.
  • Every export recorded with format, file size and actor, attached to the run that produced it.
  • Per-field export restriction, independent of the sensitivity flag.
  • An optional domain allowlist for external scheduled-report recipients.

What it does not do

  • No truncation warning. An export above the row cap is delivered short with nothing in the file to say so. This is the behaviour to build a habit around.
  • No null handling option in CSV. Empty values are written as "N/A" and there is no setting to change that, so cleaning it is a step in your process rather than a preference.
  • No XLSX on twenty-one datasets, including invoices, POS sales, purchase orders, items, assets, payments and the audit logs.
  • No timestamp in PDF filenames, so a second export of the same report overwrites the first locally.
  • No pagination or chunking across multiple files for a large dataset — splitting by period is manual.
  • No password protection or watermarking on exported files.
  • No export-volume alerting, so nothing notices somebody taking a great deal of data at once.

The row cap deserves one more sentence because of how the two thresholds interact. A report matching 30,000 rows is above the async threshold, so you are told it is being prepared in the background — which reads as reassurance that a large export is being handled properly. The file still arrives capped. The queueing message is about size, not completeness, and it is easy to hear it as both.

A practical rule that avoids all of this

Export by period, not by "everything". A month or a quarter at a time will sit comfortably under the row cap for almost every dataset in almost every mid-sized Kenyan business, arrives immediately rather than via a queue, opens in one piece, and produces files a person can actually reconcile against something. The instinct to pull a full year in one action is what runs into every limit on this page simultaneously — and the twelve monthly files are more useful anyway, because when a total looks wrong you can tell which month it is in.

Our take

Three things to carry away. Check the row count on screen before exporting, because the cap is 5,000 and a truncated file contains nothing to tell you it was truncated — being told a large export is queued is a statement about size, not completeness. Strip the "N/A" values before building any formula on a CSV, since empty cells are written as text and a numeric column containing them will not sum correctly. And check whether the dataset you need offers XLSX at all, because twenty-one of the thirty do not, including invoices, POS sales and payments. Then do the boring thing that makes all three moot: export by month or quarter rather than by year, and sanity-check one total against the screen before any file leaves the building.

Exports you can reconcile

CSV and PDF on every dataset with XLSX on nine, a configurable row cap, automatic background queueing for large jobs, per-field export restrictions, and every export recorded with its format, size and actor.

See plans & pricing

Frequently asked questions

How many rows can a report export?

5,000 by default, and the cap is configurable. The important part is the behaviour above it: the file is delivered truncated with nothing in it to indicate that anything is missing. Check the row count on screen first, and if it is near or above five thousand, split the export by month or quarter before exporting.

I was told my export was being prepared in the background. Does that mean I get all the rows?

No, and this is the easiest thing here to misread. Reports matching more than 10,000 rows are queued so they do not tie up your browser, which is sensible — but the row cap still applies to the file that is produced. The queueing message is about the size of the job, not the completeness of the result.

Why does my exported CSV show "N/A" instead of blank cells?

Because empty values are written as the literal text "N/A" and there is no setting to change it. On a text column that is untidy; on a numeric column it is a real problem, because Excel then treats the whole column as text and SUM silently skips what it cannot read. Find and replace "N/A" with nothing before building any formula, then confirm your numeric columns right-align.

Can I export everything to Excel?

Not everything. XLSX is offered on nine of the thirty reporting datasets — the HR ones, projects, tasks, time entries, tickets and expenses. The other twenty-one are CSV and PDF only, including customer invoices, POS sales, purchase orders, items, assets, payments and the audit logs. For those you export CSV and clean it.

Can we stop certain columns from being exported?

Yes. Fields carry an export restriction that is separate from the sensitivity flag, so a column can stay readable on screen for the people who need it while being barred from any file that leaves the building. National ID numbers, bank details, individual salaries and personal phone numbers are the usual candidates, and setting them takes minutes.

Can scheduled reports go to people outside our organisation?

Yes, and it is permitted by default. There is a domain allowlist for external recipients, but it is empty by default and an empty list means no domain restriction rather than none allowed — the reverse of how an allowlist usually reads. If you deliver reports to an external accountant or funder, populate it with the two or three domains you actually use.

Help Center

Need a quick answer while you read?

Run inventory, procurement, assets, sales, and field work with approved AWRA guidance for setup, migration, integrations, security, pricing, and support.

Search all approved AWRA public help articles.

Open Help Center