LedgerdropGR

myDATA → spreadsheet

myDATA invoices, as a spreadsheet

Every invoice issued in Greece is reported to AADE, so every Greek company already has the XML. It is not EN 16931 — a European reader opens it and finds nothing it recognises.

Drop the files here →

InvoicesDocVAT category codesΑΦΜ check digitPeppol BIS 3.0

01 — A number that is not the number it looks like

vatCategory is a code, not a rate

In myDATA the standard rate is written 1. The reduced rate is 3. Copied straight into a spreadsheet, a 24% invoice reports 1% — and every figure on the row still looks like a plausible figure.

The codes are turned back into rates here (1 → 24%, 2 → 13%, 3 → 6%, and the island rates 4, 5, 6). Code 8 — entries without VAT — is deliberately not given a rate: it is not the same box on the return as a true 0%, and filling one in would be inventing an answer.

02 — The prefix that turns a real number into a fake one

The VAT prefix is EL, not GR

The file says <country>GR</country>, because that field means which country the party is in. The EU VAT number for the same company begins with EL. Gluing the ISO code to the ΑΦΜ produces a number that does not exist anywhere in the EU — and looks exactly like one that does.

The ΑΦΜ check digit is recomputed too (weights 256…2, mod 11, then mod 10). Both spellings are accepted, because both are written in the wild.

Withholding tax, and totals that legitimately do not add up

On professional fees, παρακράτηση φόρου is withheld at source. Net 1 000 plus VAT 204 is 1 204, but the payable total is 1 128 — and that is correct. A checker that insists on "net + VAT = total" turns every such invoice red.

So it is not applied there. Withholding, stamp duty, fees, other taxes and deductions are each read from the summary; if any of them is non-zero, the generic balance rule stands down instead of shouting. Rules are worth keeping only where they hold.

One file, many invoices

Reporting is done in batches, so an InvoicesDoc normally holds a run of invoices rather than one. Reading only the first is a quiet way to lose a month: no error, just fewer rows than the file contains.

Both wrappers are accepted: the InvoicesDoc a supplier transmits, and the RequestedDoc that comes back when you download your own received invoices from myDATA. The second is the one an accountant usually has, and a reader that only knows the first says "format not recognised" to every one of them.

The number is rebuilt from series and αα together. The same αα under a different series is a different invoice — take αα alone and two real invoices collide as a duplicate.

Credit notes count downwards

Greek credit notes come in three flavours (5.1, 5.2 and the retail 11.4) and all carry positive amounts; only the type says money is going back. All three are treated as credit notes, so the total at the bottom subtracts them. Recognising just one of the three gives a total that is too high, made entirely of correct-looking numbers.

What else lands in a Greek inbox

The same drop zone reads Peppol UBL and CII, Factur-X and ZUGFeRD PDFs, German XRechnung, Italian FatturaPA (including signed .p7m), Spanish Facturae, Polish KSeF, Romanian e-Factura, Austrian ebInterface, Hungarian NAV, Finnish Finvoice and Czech ISDOC — plus ZIP archives and .eml / .msg emails. Each one is held against the EN 16931 rules by number where that standard applies, and where it does not, the compliance column says so instead of leaving a bare dash.

Greek invoices sent over Peppol are read as UBL or CII like any other European document; this page is about the domestic myDATA XML, which nothing else reads. Which countries are read · η ίδια σελίδα στα ελληνικά.

Trying it

Drop files on the main page — up to 10 invoices per export and 20 a day, free, no account, and the count resets at midnight. Pro lifts both limits for 29 € once, with no renewal.

Nothing is uploaded

The files are read in the browser. There is no server they could go to, and it takes two minutes to confirm: open the developer tools, the Network tab, and drop an invoice in — no request goes out. Or load the page, disconnect the network, and drop it anyway. It still works. Why that check matters.