Caleb Lanting
Lead responder

One tap from a new lead to a sent text.

For Pete's Holiday Lighting, every quote request gets a reply drafted from the owner's own scripts. The owner gets a text with a link, and one tap opens Messages with the customer's number and the reply filled in, ready to send from their own phone.

Role
Sole developer
Status
Live since September 2026
When
September 2026
Built with
Firebase Cloud Functions, Firestore, SendBlue
A made-up lead. The real one runs on Firebase and texts the owner.

Send it a test lead

Where the lead lives

Settings: reply scripts

The owner writes these once. {first} and {city} fill in from the form.

The problem

Quote requests come in while the owner is out on jobs. Answering one meant opening the email, copying the number, and typing the same reply again.

The obvious fix, a bot that texts customers on its own, was the one thing the owner didn't want. Replies had to come from the owner's own number, in the owner's own words.

What I built

It prepares everything and leaves the send to a person.

  • A drafted reply for every lead

    When the quote form comes in, a reply is drafted from the owner's scripts with the customer's first name in it: one script for addresses inside the service area, one for outside it.

  • One text, one tap

    The owner gets a text with a link. It opens a page with the draft, which can be edited, and an Open in Messages button.

  • Sent from the owner's phone

    Messages opens with the number and the reply already filled in. The system never texts a customer itself, so every conversation stays in the owner's normal threads.

  • Scripts in settings

    The owner changes the scripts and rules on a settings page. No code needed.

The hard part

Two systems, one inbox, no double replies.

The responder shares a texting number with another system I run, and the owner can reply to it by text. Those replies arrive two ways: a poller that checks every minute, and an optional webhook that's faster.

Both write to one ledger of handled messages, so whichever sees a message first handles it and the other skips it. Leads are numbered L1, L2 and so on, so neither system acts on the other's messages. Texts from anyone but the owner are ignored, and if a text to the owner fails, the lead and link go by email instead.

By the numbers

1tap from the owner's text to a filled-in reply
0texts the system sends to customers on its own
1 minbetween checks for the owner's replies
11automated tests

From the project's code and tests, September 2026.

Stack and role

I built it alone, with AI coding agents writing the code to my spec. Pete's Holiday Lighting was also my first client website, in 2025; the responder came a year later and plugged into the same quote form.

Node.js 22Cloud FunctionsFirestoreFirebase HostingSendBluenode:test

Want to build something together?

I'm looking for a team to build with full time. Email is the fastest way to reach me.