HomeServicesProjectsAboutContactDiscuss a Project
Case study · Internal system — live

Lead Management & Follow-Up System

Outreach and inbound leads stall when follow-up depends on memory and scattered spreadsheets. This is the lead management engine that runs our own pipeline: personalised outreach pages, automated follow-up sequences, and unsubscribe/open tracking — in production on our infrastructure.

type: internal system · status: live · stack: PHP, SQLite, cron, local sendmail

Follow-up that depends on memory doesn't scale

Whether leads come from outreach or inbound enquiries, the failure mode is the same: the first reply goes out, then follow-ups happen inconsistently — or not at all. Personalisation at scale usually means either mass-mailing generic messages (which get ignored) or spending hours per lead (which doesn't scale). Tracking what happened — who opened, who unsubscribed, who replied — lives in different places, if it is tracked at all.

One route, personalised per lead — no page explosion

A deliberate design decision shapes the whole system: instead of generating a static page per lead (thousands of near-identical URLs — textbook doorway pages that hurt a domain), there is a single dynamic route that renders a personalised page per visitor, based on parameters. Real personalisation with no URL explosion.

What the system does

  • Personalised outreach pages — localised by country (currency, spelling, vocabulary) and tailored to the lead's vertical, with honest sourcing rules: nothing is claimed that hasn't been verified about that lead.
  • Follow-up sequences — scheduled sends via cron, with pacing rules and stop conditions.
  • Unsubscribe handling — a GET-based unsubscribe endpoint that always reports success; on any database failure it falls back to a plain deny file, so a failure can never result in continued mailing.
  • Open tracking — a 1×1 pixel endpoint that logs opens against the same SQLite store the cron engine reads — web endpoint and scheduler can never disagree.
PHP 8.2SQLiteCronnginxLocal sendmail

Designed to not embarrass us

Cold outreach that overclaims gets a domain burned and a reputation damaged. The system encodes that as product rules:

How it's built

Single-render funnel route

One PHP endpoint renders layout variants based on query parameters (vertical, country, channel, lead identifier). Localisation tables handle country-specific currency, spelling, and vocabulary — the details that make a message read as written for that market, not mail-merged from 5,000 miles away.

Shared SQLite store

Unsubscribe and open-tracking write directly to the same SQLite file the cron engine reads. No shelling out between services, no cache disagreement — one source of truth for subscription state.

Fail-safe unsubscribe

The unsubscribe endpoint always tells the person they are unsubscribed. If the database write fails, the address is appended to a plain-text deny file that the mailer also honours. There is no path where a system error continues mailing someone who asked to stop.

The system in action

Screenshot of a personalised outreach page generated by the funnel system, showing localised pricing and a single call to action
// personalised outreach page — one route, rendered per lead

What it isn't

This is an internal system, not a packaged SaaS product. It is tuned for how this studio does outreach — the verticals, the pacing, the honesty rules. Adapting it to a different business means rethinking the localisation tables, sequence logic, and integration points. The dashboard that manages it is described in the operations dashboard case study.

What you can learn from this

Need a lead management or follow-up system built properly? Discuss your project →

Leads slipping through the cracks?

We can build a follow-up system around your actual pipeline — honest, trackable, and reliable.

Discuss Your Project