Skip to main content

Contact cleaning

Since backend 2026.10.21.5. Bounces come from addresses that no longer exist, and they hurt the sending mailboxes for every product that shares them. So every person in the people pool gets a verdict before any campaign mails them, and new imports are cleaned the same way without anyone asking.

Verdicts​

QualityMeaningMailed?
uncheckedNot looked at yet. The campaign engine holds the person until a verdict exists.not yet
validThe recipient's mail server confirmed the mailbox.yes
unverifiedEvery check that could run passed, but the mailbox itself could not be confirmed (for example Yahoo-hosted mail, or a server that accepts every address).yes
riskyCould receive mail, but likely to bounce or complain: a role mailbox (info@, sales@), a full mailbox, or a company domain whose mailed people mostly bounced.only when the project turns on send_to_risky
invalidCannot receive mail. The person's global status becomes invalid, so no product mails them.never

What is checked​

  1. The address itself. Shape, typo domains of the big providers (gmial.com), placeholders (test@, example.com), about 9,900 disposable-inbox domains, and role mailboxes.
  2. The domain's DNS, looked up once per domain and refreshed every 30 days. No mail server, or a null MX, makes the address invalid. A failed lookup is never a verdict.
  3. An AI review of company domains. Bought lists carry many addresses at companies that were acquired, renamed or closed. Their domains still answer DNS, but nobody reads the mail. Only bare domain names are sent, in batches. A domain the AI is unsure about changes nothing.
  4. Bounce history. A company domain with at least 3 hard-bounced people, who are half or more of its mailed people, makes the rest risky.
  5. A mailbox check with the recipient's server. FilesHub opens SMTP to the recipient's mail server, names the address, and hangs up before any message is sent. The check runs only a few times a minute per provider, and it detects servers that accept every address. It leaves a provider alone for six hours if that provider refuses the check. A self-test turns it off when the server cannot open port 25.

People waiting in a campaign are checked first. People in a project paused for bounces come before them.

A bounce pause clears itself​

When a project's campaigns stop for hard bounces, the cleaner checks that project's waiting people first. Once none of them is unchecked, the project resumes by itself and the owner is emailed. Bounces then count afresh from resumed_at, and the same is true after a manual Clear auto-pause.

A second bounce pause within 14 days of a self-resume stays paused for a person. Complaint pauses are never lifted automatically.

API​

GET /email-marketing/contact-cleaning on the Management plane (https://fileshub.zaions.com/api/public/v1, Authorization: Bearer fh_pat_…). It needs can_manage_email_marketing and a token for every project; otherwise it answers 403.

{
"data": {
"people": { "total": 115168, "checked": 41200, "sendable": 36950,
"by_quality": { "unchecked": 73968, "valid": 21400, "unverified": 15550, "risky": 1800, "invalid": 2450 } },
"top_reasons": [ { "quality": "invalid", "reasons": ["mailbox_missing"], "people": 1210 } ],
"domains": { "known": 9120, "business": 8400, "ai_reviewed": 3200, "ai_dead": 410, "no_mail_server": 260 },
"mailbox_checks": { "enabled": true, "available": true, "checked_at": "2026-10-21T10:00:00+00:00", "detail": "Port 25 reachable." },
"bounce_paused_projects": [ { "project": "rentparty", "people_waiting_for_a_check": 0, "resumes_by_itself": true } ]
}
}

The numbers in the example are illustrative. Each one is a single aggregate query, and nothing is listed person by person.

In Nova​

Email People shows a Quality badge and has a Quality filter. A person's page lists the reasons and when they were checked. Allow mail again also lifts an invalid stop; the address is checked again after 90 days.