# SeatGap Live at https://seatgap.pages.dev > A free browser-based tool that shows a managed service provider which Microsoft 365 > licences they are paying Microsoft for but never invoicing a client for. All matching > runs in the visitor's browser: no upload, no account, no server. SeatGap compares two CSV files an MSP already has: the Microsoft Partner Center licence-based reconciliation export, and an invoice export from QuickBooks, Xero or Zoho. It reports the gap per client and per SKU. It is built for the specific case that existing paid tools do not serve: an MSP with **no PSA** (no ConnectWise, Autotask, HaloPSA or Syncro) that invoices out of a plain accounting package. Tools that do serve that need, such as BillingReconcile from $129/month, Sync 365, Gradient MSP, and Syncro's own Universal Billing. All of them assume the billing side is a PSA. ## Why the problem exists The Partner Center reconciliation file lists charges, not licences. One subscription produces several rows per month: `cycleCharge` for the baseline, `addQuantity` when seats are added mid-term, `removeQuantity` which arrives negative, and `customerCredit` rows which represent money rather than seats. Summing the Quantity column therefore produces a number that was never true. The second difficulty is matching a Microsoft SKU to a renamed invoice line. A house name like "Email & Office Bundle" shares no words with "Microsoft 365 Business Premium", so no string matching connects them. SeatGap asks the user once and remembers the pair locally. A third trap: twice in 2020 Microsoft vacated a product name and reassigned it. On 21 April 2020 "Office 365 Business Premium" became Microsoft 365 Business **Standard**, while a different plan, "Microsoft 365 Business", became Microsoft 365 Business **Premium**, so the word Premium moved sideways onto a dearer product. On 1 April 2020 the existing F1 plans were renamed to **F3** and a new, cheaper **F1** launched the same day, which means an F1-to-F1 match between two files can look correct while describing different products. ## Pages - [The tool](https://seatgap.pages.dev/): drop in two CSVs, get the gap per client and SKU. Free, no signup. - [Why the recon file never matches your invoice](https://seatgap.pages.dev/reconciliation-file): what every ChargeType means, which ones count as seats, and the 2020 renames that still cost money. - [How to reconcile Microsoft 365 licences without a PSA](https://seatgap.pages.dev/without-a-psa): the manual method step by step, why summing the Quantity column is wrong, and how long it realistically takes. - [Reconciliation tools compared](https://seatgap.pages.dev/compare): BillingReconcile, Sync 365, Syncro Universal Billing, Gradient MSP and SeatGap, with prices and PSA requirements. - [Every Microsoft 365 rename since 2020](https://seatgap.pages.dev/sku-renames): the two renames that moved a name onto a different product at a different price, the cosmetic ones with their dates, and how to tell which one an invoice line refers to. - [Lizenzabgleich ohne PSA (German)](https://seatgap.pages.dev/de): the German-language explainer and entry point. Why the Partner Center file counts charges rather than licences, the 2020 rename, and which German column headings are recognised. ## Pricing Free, with no paid tier in existence. Two paid tiers are under consideration and unbuilt: one that runs monthly and alerts on seat-count changes, and one that also writes corrected quantities back to the accounting system. Nothing is for sale today. ## Languages and file formats The interface is **English and German**, chosen automatically from the browser's language setting. There is no language switch and no account, so a German-speaking MSP gets a German page on the first visit. German support is not only the wording. Column headings from German accounting packages are recognised, so an export from Lexware Office, sevDesk, Papierkram, DATEV or plain Excel is read without renaming anything: `Kunde`, `Beschreibung`, `Bezeichnung`, `Menge`, `Anzahl`, `Einzelpreis`, `Betrag`, `Währung`, `Rechnungsnummer`, `Buchungsart`. Amounts are formatted to the convention of the language shown, so a German page prints 7.771,20 EUR rather than 7,771.20. Currency is read from the file rather than assumed, so EUR, GBP and USD all work, and the monthly price the page asks about is quoted in the currency it found. ## Privacy No data is transmitted. There is no server, no database and no account. Files are read with the browser File API, matched in JavaScript locally, and discarded when the tab closes.