Home » Portfolio » Cold outreach system — deliverability as a mechanism
CRM Email outreach / In-house product

Cold outreach system — deliverability as a mechanism

Seganiko
Client Seganiko
Industry Email outreach / In-house product
Type CRM
Technologies used PHP with no framework, MySQL, paced send queue, mailbox warm-up, MX checks, open and click tracking, Telegram notifications
Context

The challenge

Run cold outreach without burning the domain: weed out dead addresses before sending, grow volume without tripping the filters, and keep replies in the same place as the sends.
Our approach

What we delivered

Three mechanisms act before the message: scheduled mailbox warm-up, MX and catch-all checks, and a fuse tied to the bounce rate. On top of that, a paced queue rather than a volley, templates with variables previewed against a real contact, and incoming mail pulled in beside the contact.
Project details

Outreach where the point is not to burn out

Anyone can send an email. The difficulty in cold outreach is elsewhere: keeping the mail providers willing to put your messages in the inbox rather than in spam.

We built our own system in which deliverability is not a report at the end but a fuse that trips before the domain is ruined.

Outreach dashboard: system state, bounce rate, queue, base size and a thirty-day chart

The top row is not decoration — those are switches. Warm-up, auto-send, the fuse and follow-ups are visible at once, along with their state.

What it is

  • Product: built in-house at Seganiko
  • Purpose: cold outreach and follow-up
  • Base: over 55 thousand contacts
  • Stack: plain PHP, no frameworks

Objectives

  • Not lose the domain to a sudden blast across a cold list.
  • Weed out addresses that do not exist before sending, not after.
  • Keep the correspondence in one place rather than five mailboxes.
  • Make the whole thing runnable by one person.

What is inside

  • Mailbox warm-up and a fuse tied to the bounce rate.
  • A check of the domain’s mail servers before sending.
  • A send queue with pauses, open and click tracking.
  • Templates with variables, and replies in the same system.

Deliverability as a mechanism, not a report

A cold list kills a domain in two days if you send to it as though these were subscribers. So three things in the system work before the message goes out, not after.

Warm-up. A new mailbox starts at tens of messages a day and grows its volume on a schedule. Until the warm-up reaches the required pace, a large campaign simply will not leave that mailbox.

Address checks. Before an address enters the queue, the system looks at whether the domain has a mail server at all and whether it accepts everything indiscriminately. Domains that say yes to any address are flagged separately — bounce statistics lie on those.

The fuse. If the bounce share in a campaign crosses the threshold, sending stops by itself. Mail providers start treating a domain as suspect at roughly two to three percent — the fuse trips before they notice.

Why no framework: the system lives on ordinary hosting next to other sites, runs for years and has to update without migrations. Plain PHP here is not asceticism but a way of not depending on someone else’s release cycle.

A base where every state is visible

A contact is not a row with an address. It carries a status, a category, a language, a priority and groups, and the list filters by each of them. CSV import detects the encoding and the delimiter by itself, shows the column mapping and asks what to do with duplicates — skip or update.

Contact list with filters by status, category, language and priority

A campaign is a queue, not a button

A campaign does not go out in one shot. It lands in a queue with a pause between messages, and the queue is visible in the panel: how many are written, how many are waiting, how many went today. It looks dull and it saves the domain.

Opens and clicks are counted, unsubscribing takes one click, and any event can raise a Telegram notification — so nobody has to keep the panel open all day.

Campaigns section: a list of sends with statuses and statistics

Templates with variables

The message is written once; name, company, website and whatever was found during preparation are substituted in. The preview renders it against a specific contact straight away — so a mistake in a variable shows before the send, not after a thousand messages.

Email templates with variable substitution

Replies in the same place

The worst thing in cold outreach is replies landing in a shared inbox and getting lost among invoices. So incoming mail is pulled into the system and sits next to the contact: who was written to, what came back, and which step it stopped at.

How it was done

1
Phase 1
Base and import
Contacts with statuses, categories, languages and groups. CSV import with encoding detection, column mapping and duplicate handling.
2
Phase 2
Sending
A paced queue instead of a volley, templates with variables, open and click tracking, unsubscribe, Telegram notifications.
3
Phase 3
Deliverability
Scheduled mailbox warm-up, a check of the domain’s mail servers before sending, a fuse tied to the bounce rate.
4
Phase 4
Correspondence
Incoming mail beside the contact, scripted follow-ups, a history of steps on every addressee.

Under the hood

Platform

PHP with no frameworks, MySQL, its own router and data layer. It installs on ordinary hosting and updates by copying files.

Sending

An external mail service as transport, our own paced queue on top of it, open and click tracking, an unsubscribe page.

Deliverability

Mailbox warm-up, MX and catch-all checks, separate accounting of dead addresses, and a fuse that halts a campaign when bounces rise.

How it turned out

A system in which cold outreach is not “press send and wait” but a controlled process: the address is checked before the queue, the mailbox warms up on a schedule, and sending stops by itself when something goes wrong.

One person runs a base of tens of thousands of contacts without holding mailbox states or provider thresholds in their head — the system shows all of it in a single row at the top.


Have a similar project?

Let's discuss your goals and see how we can help.

Request a free quote →
Any questions?

Let's discuss
your project.

Free first consultation, no strings attached.