A salesperson finishes the call and the twelve page proposal is already written.
Everything is filled in. Confirm and I render the PDF.
Everything inferred first. One confirmation, then the PDF renders.
The situation
How this used to work
The twelve page proposal was already proven. Cover, welcome, introduction, the approach to design, the sitemap, the work, the process, the timeline, the bonuses, the price, thank you. That shape wins work.
What it cost was an afternoon of assembly per proposal, every time, for a document whose structure never changed.
What we built
The system
A command that treats the entire conversation as the brief.
It infers what it can, pulls the rest from the client's own files, and asks only about what it genuinely cannot know. Then it presents the whole filled-in plan in one message and waits.
Silent context gathering, one confirmation, execution. Not an interview.
How it works
The pipeline, step by step
The conversation is the brief
It works out who the client is from what has already been said, rather than asking a question whose answer is on the screen.
Their file already knows
Status, decisions and source documents come out of the client's own workspace folder, so the proposal starts from what the agency has actually agreed with them.
One message, one yes
The filled-in plan is presented once: client, sitemap, pricing, timeline, bonuses. Every gap is asked about here or not at all.
A4, and it has to actually be A4
Chrome headless prints the PDF, because it is the only method that respects the template's page size. The browser automation tools ignore it and silently force US Letter, which is eighteen millimetres shorter, so the layout shifts and clips and the PDF looks nothing like the page that was approved.
Two page boxes, drawn to scale. The shorter one is what gets forced.
Trust the bytes, not the render
The finished PDF is grepped for its own page box and the number is checked. It has to read A4 and not Letter. A visual check misses that one every time, because a clipped A4 layout looks like a design decision until it is next to the original.
The page box, read back out of the finished file rather than looked at.
What changed
The result
A proposal that was an afternoon is a conversation and a confirmation.
The interesting part is what the automation refuses to do. It will not invent a welcome headline to fill an empty slot, because a forced line reads as a non-sequitur to the client even when it felt clever while writing it. The slot stays empty.
It also does not trust itself on layout. Greek text wraps differently from English, so the rendered page gets screenshotted and looked at before anything is called done. Counting characters in the source does not predict where a Greek sentence breaks.
The stack
Render
- Chrome headless
- print-to-pdf
- CSS @page A4
- ImageMagick
Sources
- client workspace files
- Airtable fallback
Brand
- Manrope
- 12 page A4 template