What is your goal?
Print a PDF (invoice/label/receipt) generated in Make to a local/on-prem printer in a reliable way (multi-site, behind NAT), with job status + audit trail.
What is the problem & what have you tried?
Make can trigger cloud services easily, but printing is tricky because printers/spoolers are local and often not internet-reachable. I’m trying to understand which pattern is most reliable in real production setups.
What I’ve tried / considered:
- Emailing PDFs to staff / manual print (not reliable, no automation)
- Upload PDF to storage + send a link (still requires manual print)
- Using third-party services like PrintNode / ezeep / PaperCut / PrinterLogic (works in some cases but varies per environment)
- Considering a “local agent” approach (a small service running on a PC/mini-PC on-site) that pulls jobs from a queue and prints locally, then reports status back to Make
Main concerns / questions:
- What approach has been most stable for you?
- How do you handle idempotency (avoid duplicate prints on retries)?
- Any tips for PDF printing reliability (rendering, driver selection, spooler failures)?
- Best practices for multi-site setups (many printers, intermittent connectivity)?
Error messages or input/output bundles
No specific error yet, I’m in the design/architecture phase and looking for proven patterns and pitfalls before implementing. (If needed, I can share sample payloads like { job_id, printer_id, pdf_url, checksum, created_at }.)
Create public scenario page
Not applicable yet, I’m first collecting best practices from the community before building a scenario.
Hey there,
If changing the printer is not an option (to one that has an email address and auto prints attachments) then you can maybe setup a flask app running on a local machine that has an API endpoint which receives pdfs a s forwards them to the local printer for printing.
Thanks, that’s exactly the direction I was considering (a local agent).
If I go that route, I want to make it production safe:
- Authentication (shared secret / HMAC) so the endpoint can’t be abused
- Idempotency (job_id + checksum) to prevent duplicate prints on retries
- Queueing + retries locally (printer offline/sleep)
- Status callback back to the workflow (printed / failed + reason)
Have you seen a preferred pattern for sending the PDF (direct file upload vs. signed URL download)? And any gotchas with Windows spooler/PDF rendering?
I’ve only done it on Linux so not sure how it will work on Windows.
You can protect it with an API key yeah.
I prefer sending the file directly instead of a download link.
And the tools I was using on Linux already supported queueing and I can’t say about Windows.
But yeah, you should be able to have some local SQL to track what’s already received and processed and maybe keep a queue there.
Thanks, that matches the pattern I’m aiming for. On Windows my main concern is reliable PDF printing + queue handling when the printer sleeps/offline.
A couple of implementation questions if you’ve seen this elsewhere:
- For “send the file directly”: do you mean multipart upload to the local agent (POST /jobs with PDF) and return a job_id?
- For idempotency: would you store {job_id, sha256, status, printed_at} in a local DB and ignore duplicates on retries?
- Any tips on what to log as “success” (spool accepted vs actually printed) to avoid false positives?
I’m leaning to a local SQL queue + status callback to Make (printed/failed + reason) so the scenario can alert/retry safely. This is very similar to what we do in our cloud printing workflows (distributed printers), so I’m trying to align with community best practices.
Not sure if there are best practices for this but yeah multipart should allow you to send the file.
You can calculate the hash in Make and send that too for verification and the when the local service receives the file it can also calculate the hash to make sure the file didn’t break.
Then I would have the receiving service store the file, the hash and the status in the local database and you can use the hash to prevent duplicates. And do some handling based on the status changes to call Make webhooks to send responses.
Then have an independent service check the queue in the database and trigger printing and change the status when a job is accepted, printed or failed.
Thanks, this is very close to how we approach it in OuViTel: receive job (multipart) → store file + hash + status → worker/service prints → status changes → webhook back to Make. Having the print worker separate from the receiver makes a lot of sense for reliability. One question on best practice: for idempotency, would you key primarily on a job_id (and use the hash just for integrity checking), or do you rely on hash as the dedupe key? I’m leaning toward job_id + hash, because the same PDF might be legitimately printed twice (reprint / second copy) and hash-only could block that.
Oh yeah, in my use case it was strictly unique prints, so I was using the hash. But if you are going to be reprinting, the job id should work better. And in that case I would use the hash just for integrity check.
Cool, I will implement: job_id idempotency, hash integrity check, receiver+worker split, status webhook back to Make, and a reprint flag/copy_number. Appreciate the input.