Engineering

Generating documents the platform will not generate

An invoice is a layout problem before it is a data problem. It needs a total that lands in the same place on every copy, a line-item table that does not split a row across a page boundary, and a page number that reads 2 of 5. No-code platforms give you the data and then hand the layout to a plugin. That is the point where this stops being cheap.

Where the platform stops

Airtable is unusually honest about this in its own documentation. The page designer extension draws a fixed canvas at 109 pixels per inch, pulls live field values into it, and sends the result to your browser's print dialog. The help centre article now opens by recommending Interface Designer instead.

The limits sit in the FAQ. You cannot batch print multiple records, because page designer "was built for printing individual records in a standard custom layout." You cannot run a print action inside an automation and attach the resulting PDF back to the record. For one record that needs more than a single page, the documented workaround is to double or triple the canvas height in the extension settings and then choose Letter in the print dialog.

When a page break lands somewhere wrong, Airtable offers two fixes: a custom margin on all four sides, or your browser's print settings. That is not pagination control. That is nudging. For an internal packing slip, nudging is fine and nobody will ever notice. For a contract a customer signs, it is not a plan.

The meter you rent instead

So most teams bolt on a document API, and the honest ones work well. CraftMyPDF gives you 50 PDFs and 3 templates free, then $29 a month for 1,200, $49 for 3,000, $99 for 12,000, $299 for 40,000 and $499 for 150,000. One PDF is one credit whatever its page count. Credits reset at the start of each month and never roll over, annual plans included. PDFMonkey prices lower in euros: 5 euros for 300 documents, 15 for 3,000, 60 for 5,000, 300 for 60,000, with overflow billed between 0.005 and 0.008 euros per extra document.

Read the second column though. PDFMonkey keeps your document for one day on Free and Starter, one week on Pro, and indefinitely only from Pro+ at 60 euros. If you do not copy the file somewhere you control, it goes away. Its free tier also blocks external images, fonts, CSS and JavaScript, which rules out your logo and your typeface. Generation times out at 30 seconds on Starter, so a long statement can fail for a reason that has nothing to do with the statement.

What costs you is not the volume. It is which capability sits behind which tier. CraftMyPDF only lets you write output to your own S3 bucket, or set a password on a PDF, from the $99 Professional plan upward. I keep coming back to that one. Your customers' invoices live on somebody else's storage until you pay a hundred dollars a month for the right to keep them yourself.

What owning the renderer gives back

Chrome already prints PDFs, and Puppeteer exposes that path directly. Turn on displayHeaderFooter, pass a footerTemplate, and the classes pageNumber and totalPages get filled in for you, so "2 of 5" becomes a line of HTML rather than a support ticket. preferCSSPageSize hands the page size to your own @page rule instead of scaling content to fit the paper. pageRanges prints 1-5, 8, 11-13. The tagged option defaults to true, so the output carries structure a screen reader can follow, and waitForFonts defaults to true so your webfont has actually loaded before the frame is captured.

The page break problem turns out to be one CSS property. break-inside: avoid on a table row, or on the block holding the invoice total, keeps it whole. MDN lists it as baseline since January 2019, with the caveat that avoid-page still does not work in Safari. You are rendering in headless Chrome, so Safari never sees it.

Stay World Class came to us on Webflow and Xano. We rebuilt it on Next.js, NestJS and Supabase, with a four stage ETL that preserved every legacy ID as a PostgreSQL UUID so nothing orphaned at cutover. Lighthouse went from 55.91 to 91 out of 100 and LCP got 77% faster. Document rendering moved with the rest of it. Once templates are files in a repo, a changed layout goes through code review like any other change, and generating one more PDF costs the CPU time to render it.

When renting the meter is the right answer

If you send a few hundred documents a month off one template, PDFMonkey Starter at 5 euros is cheaper than any hour of engineering you would spend replacing it, and a boost pack adds 1,000 documents for another 5. At that size the meter is a rounding error rather than a ceiling, and which tier includes S3 export is a question you will never have to ask.

Airtable's page designer is also the right tool for a real print job: a one-off catalogue page, a business card, a feature sheet somebody looks at once. Its weakness is automation, not design. If a human clicks print, it works.

Own the renderer when the document is part of the product. A contract with conditional clauses, a statement whose page count varies per customer, a report with charts that have to survive a page boundary, anything an auditor will read back to you later. The test is whether you can state your pagination rules in one sentence. If you can, rent the meter and spend your time elsewhere. If it takes a paragraph and a list of exceptions, you are already writing code, you just are not allowed to touch it.

Sources

Is your platform outgrowing its stack?

Book a call and we'll walk through how we'd approach your platform, with an estimate grounded in a working prototype.