Blog

Print a note when a lead messages

This project started as a bit of a challenge rather than fixing a real problem. Whilst working with a customer they mused if they could have a flashing alarm light whenever a potential lead contacted them. They know being quick to respond is key!

What we actually came up with was that whenever someone completed the form from GHL, a receipt printer should quickly print out the message so someone can jump on it.

What we are building

The concept is dead simple. A visitor fills out your “Contact Us” or “Book a Call” form. Before they’ve even finished blinking, a physical receipt prints on your desk showing exactly what they submitted. Name, email, phone, message — the works. Plus a QR code linking back to the record.

The plan has a few moving parts:

  • A form — this gets the data
  • An automation — this takes the data and sends it off
  • Job storage — a queue of messages to be printed
  • n8n — sitting in the office, goes out and pulls the jobs to be printed and fires them to the printer
  • Printer — a cheap to buy and cheap to run thermal receipt printer

Why would you want this? Instant awareness. You don’t need to check a CRM or wait for an email. You physically hear the printer and know you have a lead. Physical workflow — if you operate in an environment where a printed slip is useful, like a warehouse desk, workshop, or kitchen, this bridges the gap between digital and physical. And, it’s genuinely cool. People get a kick out of it. It sparks conversations in a way that an email notification never will.

What you’ll need

You don’t need much. GoHighLevel hosts the form and fires a webhook when someone submits it. A small server runs a tiny piece of middleware that receives that webhook and stores it in a database. n8n, which is free if you self-host it, polls that database every few seconds looking for new jobs. And a thermal receipt printer handles the physical output. The whole thing runs for pennies.

The architecture

Step 1: the GoHighLevel form

Build your form in GoHighLevel exactly as you normally would. Add your fields — name, email, phone, message, whatever you need. The only thing worth noting is to name your fields properly, because you’ll be referencing them by name later on. Create an automation that triggers when the form is submitted. Filter it to the specific form you want, so other forms on your account don’t accidentally trigger this workflow. The automation’s only job is to fire a webhook containing the full form submission data as JSON to your middleware endpoint. That’s it for the GoHighLevel side.

Step 2: the middleware

This is the “secret sauce”. You need a small web service — a few dozen lines of code — that does one thing: receive the webhook from GoHighLevel and store the submission in a database. You could write this in Python with Flask or FastAPI, or in Node.js, or really anything that can handle an HTTP request. Or just contact me ;) The specifics are up to you, but the concept is straightforward. When the webhook arrives, parse the JSON, and insert it into a simple database table with a “printed” flag set to false.

Step 3: the n8n workflow

This is where the actual printing happens. Your n8n workflow has three stages. First, a schedule trigger fires every ten seconds. This is incredibly lightweight — it’s just a simple check, not a heavy process. Second, a request goes out to your middleware asking for any unprinted jobs. Third, a conditional check. If there are no jobs, the workflow does nothing and goes back to sleep. If there are jobs, it formats the data and sends it to the printer.

The print step itself depends on your printer setup. If the printer is USB-connected to the same machine as n8n, you can use a shell command or a small script. If it’s a network-connected Ethernet thermal printer, you send raw ESC/POS commands over a TCP socket to the printer’s IP address. You initialise the printer, send the formatted text with the customer’s details, add some line feeds, and send the cut command. A few seconds later, a complete receipt drops out of the printer.

Step 4: mark as printed

Once the print job completes successfully, a final step updates the database to mark that job as printed. This prevents duplicates if n8n fires again before the next new job arrives. Some people delete printed jobs entirely to keep the database from growing over time.

Real-world considerations

A few things worth knowing before you build this.

Latency is minimal. It can print within seconds! That’s because the n8n poll interval is set to ten seconds and everything runs locally. If you need it faster, drop the poll interval to five seconds — the load is negligible.

Reliability is surprisingly good. If the printer runs out of paper or gets unplugged, the jobs just sit in the database queue unprinted. When you fix the issue, n8n picks them up on the next poll. No leads get lost, no manual re-entry required.

Cost is essentially nothing beyond GoHighLevel and a cheap thermal printer. We’re talking about a one-time hardware cost of maybe forty to eighty pounds for the printer, and that’s it.

Multiple forms? If you want to handle multiple forms — one for general enquiries and one for bookings — you can easily extend this. Add a form type column to your database and route different jobs to different print templates. The architecture supports it without any real extra work.

Thinking about building this? Grab a thermal printer, spin up a free n8n instance, and start with the middleware. Don’t forget your free trial of GoHighLevel!

← All blog