Reach: contacts, lists, and campaigns
How Wallu Reach stores your contacts, builds lists and segments, and sends email campaigns with A/B testing and per-recipient timing.
Reach: contacts, lists, and campaigns
Wallu Reach is the email marketing side of the platform. You build a list of contacts, design a campaign, and send it — with tracking, A/B testing, and automatic compliance and deliverability guards baked in. This page covers how contacts, lists, and campaigns fit together. For a step-by-step of building and sending one campaign, see Email Campaigns.
You reach it from the Reach area of the dashboard, which is split into sub-views: Dashboard, Campaigns, Lists, Subscribers, Forms, Automations, Templates, Analytics, SMS, Lead scoring, Domains, and Settings.
<!-- SCREENSHOT: Reach dashboard showing email performance chart, quick actions, and recent campaigns -->
Contacts (the Lead database)
Every contact in Reach is stored as a Lead. A lead has:
email(required) and optionalnameandphonestatus— one ofsubscribed,unsubscribed, orbounced. Onlysubscribedleads receive campaigns.source— where the contact came from (e.g.Web Widget,Manual Import, or aForm:name)tags— a JSON array; this is what drives list membership and segmentation (more below)metadata— a JSON blob for any extra fields you carry- consent fields (
consentSource,consentIp,confirmedAt) for tracking how and when the contact opted in
Leads are strictly scoped per account by ownerId, and an email can only exist once per account (email + ownerId is unique), so re-importing the same address won't create duplicates.
Contacts arrive from several places: leads captured by your chat widget, signup form submissions, manual entry, and CSV import. The same Lead table also feeds your Lead Pipeline — Reach and the pipeline read the same underlying contacts.
Importing contacts
In Lists, use Import contacts to upload a .csv. You must create (or select) a list first — the importer attaches each row to that list. It imports row by row, so the results summary reports how many were imported versus failed/duplicates. You can also add a single subscriber manually.
<!-- SCREENSHOT: Import contacts button and CSV upload flow in the Lists view -->
Lists and segmentation
A List is a named container for contacts. When you create a list it gets a name and description; its subscriber count is computed live.
Segmentation in Reach is tag-based. A campaign targets exactly one list, and when it sends, the recipients are the contacts whose tags contain that list's name and whose status is subscribed. This means:
- Moving someone into or out of a segment is a matter of tags.
- The default catch-all is list id
1("All Subscribers") — a campaign left on the default list goes to every subscribed contact in your account.
Because list matching is by name, keep list names distinct — a list called VIP will match any contact tagged with text containing VIP.
List hygiene
Each list has a hygiene score (0–100) and a last-run timestamp. Running a hygiene check (Clean) verifies every active contact on the list without any external API:
- Syntax validation (stricter than a basic regex)
- Disposable-domain detection (a built-in list of ~550 throwaway domains)
- Role-based address detection (
info@,admin@,noreply@,support@, and similar) - MX-record lookup — does the domain actually accept mail?
Contacts that fail are marked bounced (so they're excluded from future sends), and anything already on your suppression list is caught too. The score drops for each invalid or risky address, and you get back a list of the first 50 flagged emails with reasons. Cleaning before a big send is the single cheapest way to protect your sender reputation.
Campaigns
A Campaign holds the email you're sending: name, subject, previewText, HTML content, an optional target listId, and a status that moves through draft → scheduled → sending → sent (or paused / review).
You design the body in the visual email builder (blocks: headers, text, images, buttons, dividers, products, social links) or paste your own HTML. You can save designs as reusable Templates.
A/B testing
A campaign can carry variants — each with its own subject and content. When a campaign has variants, Reach rotates them across your recipients (recipient N gets variant N mod number-of-variants), and tracks sends per variant so you can compare open and click rates.
Scheduling and Perfect Timing
You can send immediately, schedule for a future time (scheduledAt — a scheduler picks it up when due), or enable Perfect Timing. With Perfect Timing on, Reach looks at each recipient's historical email-open times and schedules their copy for the hour of day they're most likely to open. Recipients with no open history fall back to 10:00.
How a send actually runs
When you send, Reach doesn't blast everything at once. It:
- Resolves the recipients (owner-scoped,
subscribed, on the target list) and counts them for billing. - Checks your plan and monthly email allowance.
- Renders each email — merging
{{first_name}},{{name}},{{email}}and a per-recipient signed unsubscribe link — and appends the tracking pixel and click-tracking links. - Enqueues one job per recipient into a background send queue.
A worker then drains the queue with retries, per-provider throttling, and a circuit breaker that auto-pauses the campaign if bounces get too high. Those deliverability and compliance guards are covered in the next article. Campaign stats (sent, delivered, opened, clicked, bounced, unsubscribed) update as the queue drains — see Analytics for the reporting views.
Sender identity and settings
Before your first send, set your sender details in Reach → Settings: from-name, from-email, reply-to, company name, and — required — a physical company mailing address. Reach will hard-block a campaign send if the mailing address is missing, because it's legally required in every marketing email. Domain authentication (SPF/DKIM) is set up in the Domains view; see the deliverability article for details.
Replies land in your inbox
Replies to your campaigns don't vanish. Inbound mail routes through Reach's webhook into the Unified Inbox and the AI reply pipeline, so a customer answering your newsletter becomes a real conversation (with heavy filtering to drop bounces, auto-replies, and mailing-loop noise first).
API
The core endpoints (all require auth):
GET /api/email/campaigns,POST /api/email/campaigns(create/update),DELETE /api/email/campaigns/:idPOST /api/email/campaigns/sendPOST /api/email/test— send yourself a testGET /api/email/statsGET /api/lists,POST /api/lists,DELETE /api/lists/:id,POST /api/lists/:id/cleanGET/POST /api/lists/subscribers,DELETE /api/lists/subscribers/:idGET/POST /api/leads
See the API reference for the full surface. New to the platform? Start with Getting Started.