Checking access...
← Back
ADMIN ONLY CAMPAIGN CRM

TLH Outreach Hub

A controlled admin workspace for agent prospect research, CSV imports, suppression controls, scheduled outreach campaigns and guarded email queue processing.

Compliance guardrail: unsubscribed, bounced and do-not-contact records are suppressed here and must not be emailed. Campaign queueing recomputes eligible recipients, sends in capped batches, includes an unsubscribe link in every email and records send outcomes.

0

Total contacts

0

To contact

0

Follow-ups due

0

Suppressed

Most common Create campaign

Build, preview, save and queue guarded outreach from one place.

Manual entry Add contact

Add one prospect manually, then save notes or select them for a campaign.

Bulk entry Import CSV

Preview a spreadsheet import before saving new unsuppressed contacts.

Recipients Select contacts

Select contacts or use filters before queueing a campaign.

Manual entry

Add Contact

Add one prospect manually or update an existing contact. Select a row from the table to edit an existing record.

Create campaign

Campaign Builder

Build a simple outreach email from visible copy fields, add one optional asset, preview it, then save and queue to eligible contacts. Select contacts or use filters before queueing.

Before queueing: confirm the lawful basis, test with a small segment, and check that every recipient is relevant. Suppressed contacts are always skipped and the send function adds the unsubscribe link.
1. Choose templateStart with a proven TLH layout.
2. Edit copyUse the simple fields below.
3. Add assetOptional image or document.
4. PreviewCheck the final email shape.
5. Save & queuePreview recipients first.

Edit Simple Copy Fields

These fields generate the polished email preview and plain-text fallback. Use merge tags like {{contactName}}, {{agencyName}}, {{town}} or {{county}} where helpful.

Select contacts or use filters before queueing. Manual selections still skip invalid email, unsubscribed, bounced, do-not-contact and suppressed records.

Optional Image or Document Asset

Images appear near the top of the email. Documents are shown as a neat button link. Uploaded files are served from tlhportal.co.uk for better deliverability, not raw Firebase Storage links.

Advanced email code
Only edit this if you need custom HTML. The simple fields above will regenerate it.
Plain text fallback
The send function appends a compliant unsubscribe line automatically.

Email Preview

Bulk entry

Import Agent Prospects

Upload a CSV with headers. Common columns are mapped automatically: email, agency/company, contact/name, phone, website, town and county. Existing or suppressed emails are not imported.

Recipients

Contacts

Find, edit and select prospects for campaign targeting. Tick contacts here, then choose selected contacts in the Campaign Builder before queueing.

Archived contacts stay suppressed for compliance but are hidden from the main list.

No contacts selected for campaign.
Contact Agency Area Status Follow-up Suppression
Loading contacts...

One-to-one Copy Template

Optional fallback for a manual one-to-one email. Use the campaign builder above for guarded sends, recipient suppression and automatic unsubscribe links.

Suppression Safeguards

Do not email suppressed contacts. Records marked unsubscribed, bounced or do-not-contact are skipped during CSV import and flagged in the table.

Campaign sends are split into queue records and processed by a scheduled Firebase Function. Unsubscribe tokens are required before sending; bounced, unsubscribed and do-not-contact contacts are suppressed before queueing and again before send.

Included in this MVP: - Bulk queue-to-eligible campaigns - Resend API delivery in capped batches - Scheduled sendAfter/dueAt support - Unsubscribe endpoint with stored per-contact token - First-party click tracking for campaign links and assets - Provider webhook endpoint for bounce/complaint/unsubscribe events External setup still required: configure the Resend webhook URL, validate webhook signing/token strategy, authenticate the sending domain and start with a small test segment.