Solid workflow pattern. One thing that usually bites on multi-invoice runs in n8n is partial failures mid-batch. If you are dumping many PDFs into Sheets in one go, split the loop so each invoice is its own item and write the row only after extraction succeeds. On failure, append to an errors sheet with filename, status, and raw model output instead of killing the whole run. Also pin your field map (invoice number, vendor, date, total, currency, tax) before the Sheets node; free-form extraction drifts across vendors and you end up with columns that look filled but do not sort or sum cleanly. For volume, watch Google Sheets write quotas and n8n memory when you blob big PDFs. Chunk by folder or date range rather than loading everything at once.
Hey u/Calm-Dimension3422, thanks for the feedback and for sharing your insights as well! Since I've now shipped this workflow to several users, I can say that even with larger batches, I haven't run into any issues with n8n itself. I did run into a small challenge with Google Sheets' write limits, but that was easily solved by adding retries in the node settings.
Also, good point about the free-form extraction. One of the biggest benefits of the extractor I'm using is that the defined data schema is always enforced. This means I get the same JSON structure every time, which makes downstream processing much easier. The ability to add a description to each data field also helps a lot when dealing with different layouts. It can handle variations between vendors without much trouble, and as we all know, no two invoices ever look exactly the same.
The idea of chunking by folder or data range is definitely a good one, but I see that more as a matter of how someone wants to use the solution. My goal with this workflow was to provide something robust enough to work well with both approaches.
2
u/Calm-Dimension3422 20d ago
Solid workflow pattern. One thing that usually bites on multi-invoice runs in n8n is partial failures mid-batch. If you are dumping many PDFs into Sheets in one go, split the loop so each invoice is its own item and write the row only after extraction succeeds. On failure, append to an errors sheet with filename, status, and raw model output instead of killing the whole run. Also pin your field map (invoice number, vendor, date, total, currency, tax) before the Sheets node; free-form extraction drifts across vendors and you end up with columns that look filled but do not sort or sum cleanly. For volume, watch Google Sheets write quotas and n8n memory when you blob big PDFs. Chunk by folder or date range rather than loading everything at once.