FeaturesSecurityPricingCompareDevelopersBlogStart Free

Saudi Arabia

A model built in Arabic Excel should open the way it was built.

Documents in a Saudi deal arrive right to left, dated on the Umm al-Qura calendar, and priced in riyals. Most viewers get all three wrong and say nothing about it. Below is what each engine actually renders, reproduced rather than asserted.

The same cell, two engines

Every row below is a real Excel number format taken from our KSA test fixture. The value is 14131000 for the currency rows and Excel serial 45662, which is 5 January 2025, for the date rows. The middle column was produced by running ssf@0.11.2 locally: that is the standalone publication of the format engine SheetJS ships, and it sits underneath a large share of the spreadsheet viewers on the web.

Excel number formats rendered by ssf 0.11.2, reproduced locally on 4 August 2026, against the Umm al-Qura and Arabic-Indic renderings the format asks for.
CriterionWhat the format asks forssf 0.11.2Sifrsys
[$-2060401]#,##0.00Locale directive, no currency glyphArabic-Indic digits, no symbol$14,131,000.00١٤٬١٣١٬٠٠٠٫٠٠
[$-060401]dd/mm/yyyyHijri calendar id inside the locale tokenThe Hijri date05/01/202505/07/1446
B2dd/mm/yyyyExplicit Hijri calendar prefixThe Hijri date05/01/144405/07/1446
[$SAR-401]\ #,##0.00ISO code carried in the tokenSAR before the numberSAR 14,131,000.00SAR 14,131,000.00
[$⁧ر.س⁩-401]#,##0.00Riyal symbol carried in the tokenThe riyal symbolر.س14,131,000.00ر.س14,131,000.00
Excel number formats rendered by ssf 0.11.2, reproduced locally on 4 August 2026, against the Umm al-Qura and Arabic-Indic renderings the format asks for.

The last two rows matter as much as the first three. Those formats already rendered correctly, so we leave them exactly alone. The one thing worse than an unhandled format is a regressed one.

The dollar sign that was never in the file

Look at row one again. A cell formatted [$-2060401]#,##0.00 carries no currency glyph at all: there is nothing between the $ and the -. The token is a locale directive that packs three instructions, Arabic language, Umm al-Qura calendar, and a top nibble asking for the locale's own digits. The engine read the marker character as a symbol and printed an American dollar sign onto a Saudi balance sheet. In a diligence data room that is not a cosmetic defect. It is a fourteen million riyal line item wearing the wrong currency.

We drop empty-symbol locale tokens before formatting, and apply Arabic-Indic digits to the finished string so digits and separators convert together: ١٤٬١٣١٬٠٠٠٫٠٠ and not ١٤,١٣١,٠٠٠.٠٠. Half a conversion looks broken in a way that is worse than none.

Right to left is structural, not styling

A model built in Arabic Excel writes rightToLeft onto the sheet view. Column A belongs on the right edge. When a viewer ignores that flag, the label column lands on the far side of the screen from the numbers it labels, and the frozen header pane pins to the wrong edge, so the labels scroll away and leave a wall of unattributed figures.

  1. Read the flag
    sheetView rightToLeft on the sheet, readingOrder on the cell
  2. Mirror the grid
    Column A at the right edge, dir on the table rather than the scroller
  3. Move the origin
    Sticky columns pin right, so left becomes right
  4. Normalise the scroll
    Offset runs negative from the right edge; every measurement is absolute
What the viewer does with a right-to-left sheet. All four steps or the grid tears mid-scroll.

Cell-level reading order is resolved separately from sheet direction, so an English assumptions block inside an Arabic model keeps its own direction on the same sheet, which is what a bilingual model actually looks like.

What was measured

  • KSA number formats100%
  • Display strings100%
  • Merged cells100%
  • Alignment100%
  • Font styles100%
  • Fills99.7%
Viewer output scored against LibreOffice ground truth in real Chromium, across four producer dialects. Suite in tests/fidelity/, with a committed baseline that fails the build on regression.
Streaming
Purpose-built OOXML parser. The maintained libraries either drop cell styles in streaming mode or hold the whole workbook in memory to keep them.
infrastructure/hetzner/worker/src/xlsx-model/
30
Chunks of verbatim deal text, across 13 documents, that an unrelated signed-in user retrieved before the July 2026 lockdown
Measured. The filter itself is structural: asserted against pg_proc.prosrc in CI, with a denial suite that counts only SQLSTATE 42501 as a pass.
11.7%
Watermark ink surviving the worst of 64 crops at 25%, all four fields legible
Watermark crop study

Bilingual diligence, one thread

A Riyadh process rarely runs in one language. The advisor's memo is in English, the commercial registration and the board minutes are in Arabic, and counsel asks in whichever language the document was in. Q&A threads are free text, so a question asked in Arabic can be answered in English inside one thread, under the same permission boundaries that govern documents.

When a participant asks the AI, the answer cites the exact page in the PDF or the exact cell range in the workbook, rendered as Q3_Model.xlsx · Revenue!B14:F34with absolute 1-based sheet rows. Tapping the citation opens the workbook at that sheet and washes those cells. That matters more here than elsewhere: a partner who does not read Arabic needs to see the cell, not take the model's word for it.

The retrieval filter runs inside the SQL query, on tenant id and the per-participant document access function, rather than after retrieval or as an instruction in the prompt. On a sell side with three competing bidders in one room, that boundary is the product.

Where the data sits

There is no in-Kingdom hosting region. The primary database, object storage and application hosting run in the United States, and document processing is transient in Germany. Every subprocessor and its country is published on the Trust Center. What is true today: buckets are private and never publicly readable, permissions resolve on the server, AI retrieval is fenced inside the SQL query, and every document view is written to a hash-chained audit log. The full residency and compliance position is here.

Cost

Flat published plans: a free tier, Teams at $399 a month, Pro at $999 a month, custom Enterprise. AI is included in every paid tier rather than sold as an add-on, and there are no per-page fees, which is the pricing model that makes a document-heavy Saudi diligence unpredictable elsewhere. The 14-day trial needs no credit card, and the price-lock commitment means no surprise mid-contract increase, with 90 days notice for any change. Detail on pricing, including the Founding 10 terms: the first ten paying companies keep their signup price for the life of the subscription, and we move documents, folder structure and permission setup out of the current data room ourselves at no charge.

Related: Data rooms across the GCC · هذه الصفحة بالعربية · Cross-border MENA deals

Saudi Arabia FAQ

The questions a Riyadh deal team actually asks.

No. There is no in-Kingdom region today and we will not imply one. Our Trust Center publishes every subprocessor and the country it operates in: the primary database, object storage and application hosting run in the United States, and document processing is transient in Germany. If your mandate requires data to stay physically inside the Kingdom, we do not meet it, and you will hear that on the first call rather than in week three of a security review.
Yes. Excel encodes the calendar inside the number format, either as the B2 prefix or packed into a locale token such as [$-060401]. We resolve the calendar id and render Umm al-Qura. Our golden fixture anchors on 5 January 2025, which is 5 Rajab 1446, and the fidelity suite fails the build if that cell drifts. Run the same date through ssf 0.11.2, the format engine SheetJS ships, and B2dd/mm/yyyy returns 05/01/1444: the day held, the month and the year did not.
The sheet keeps the direction its author gave it. When a sheet carries rightToLeft, the grid renders right to left, column A sits at the right edge, and frozen panes pin to the right rather than the left. Horizontal scroll offset runs negative in that mode, so every measurement taken from it is sign-normalised; doing the mirroring without that normalisation is what makes a grid tear halfway through a scroll. Cell-level reading order is handled separately, so an English assumptions block inside an Arabic model keeps its own direction on the same sheet.
Yes, across the forms a Saudi workbook actually uses: the Arabic symbol as a quoted literal, the ISO code in a currency literal, the locale-tagged symbol, and the bare locale directive. The bare directive was the interesting bug. A cell formatted [$-2060401]#,##0.00 carries no currency glyph at all, and the format engine was inventing a US dollar sign against Arabic-Indic digits. Tokens that do carry a real symbol are left untouched, because those already rendered correctly.
No to both. We hold no SOC 2 certification and no PDPL attestation, and we do not display a badge for an engagement that has not completed. What is in place today: private buckets, permissions resolved on the server rather than in the browser, AI retrieval fenced inside the SQL query, and a hash-chained audit log of every document view. The Trust Center states the position line by line, including the gaps.
Yes. Questions and answers are free text, so a thread can be asked in Arabic and answered in English, or switch mid-thread, which is how bilingual deal teams work anyway. Threads carry the same permission boundaries as documents.

Test It On A Real Workbook

Upload the model nobody else renders properly.

Take the workbook with the Hijri maturity schedule and the Arabic-Indic totals, the one that opens wrong everywhere. Ten minutes on the free tier settles the question better than any page can.

Free to start · No per-page fees · No credit card required

Start Free