Two things to add to thoopring’s first point, because the shape of that failure is worth naming exactly.
The usual way a paged export decides it has finished is that a page comes back shorter than the page size. That is a fine rule right up until a page comes back short for some other reason, and then the walk stops early, the file gets written, and nothing anywhere reports a problem. That is the “opens fine, imports fine, missing a chunk in the middle” case, and comparing the count Stocky shows against the row count afterwards is the check that catches it. The trailer idea is a good one for the same reason.
There is a second version that a row count on its own does not always catch. If the pagination direction is wrong for a resource, the same page can come back over and over, so the walk either hangs or quietly covers the same ground twice. Keeping the set of ids already collected and stopping the moment a page adds nothing new turns that into a named warning instead. The general point behind both: the quiet path and the successful path look identical from the outside, so the export needs to say what it thinks it got, out loud, every time.
On supplier_cost_price and received_at, agreed, and worth being blunt about. Both sit at the line item level rather than the purchase order level. Any export shape that hands you one row per PO has already thrown the receipt history away, whatever its field list says, and that is the history you need if you ever want real supplier lead times later. Keeping line items as their own file instead of flattening them is the whole difference.
Roberto_Teng, on your diff question: not from us. We have never taken one export into two replacement apps and compared what actually landed on the other side. If you do write up the CSV shape that imports cleanly, that is the missing half of this thread.
Disclosure: we build a Stocky exporter, so discount this accordingly. Being straight about its limits, it is tested against a mock built from Stocky’s published API docs and it has never run against a live store, because Stocky cannot be installed fresh any more. So treat the field names above as what the documentation says, not as something confirmed on a real account.
And thoopring’s last point is the one with a clock on it. The date applies to the API, not just the export screen.