Guides · 4 min read

How a 50,000-subscriber list lands in ListFunnel

Audiences become lists, pages become contacts, and a run that stops halfway picks up where it left off.

You connect a provider with 50,000 subscribers spread over three audiences. A few minutes later they are all in ListFunnel, one list per audience, with every unsubscribe and bounce marked. Here is what happens in those minutes.

Every audience becomes a list

First we ask your provider for every list, audience, publication or segment it holds. Each one becomes a ListFunnel list named after the provider and the audience, for example 'Mailchimp · Weekly digest'. If the provider tells us the size for free we show it at once, so you can watch the count fill toward it. We do not merge audiences. If the same address is in two of yours, it is in two of ours.

Subscribers come in pages

No provider hands over 50,000 records in one reply. They hand over a page, usually 500 to 1,000 records, plus a marker for the next page. We ask for the largest page the provider allows, save each record, then ask for the next. Every record is trimmed to what we need: email, first and last name, status, when they subscribed, and the provider's own id for the person.

A handful of providers, including SendGrid and Braze, do not page at all. They run an export job. We start the job, wait, poll until the file is ready, then read it in chunks. From your side it looks the same, only the first page takes longer to arrive.

Runs move in short steps

Our servers cap how long one piece of work may run. A 50,000-record pull would blow through that cap, so a sync does not run as one job. It runs as a chain of steps. Each step works for about twenty seconds, saves exactly where it got to (which audience, which page), and queues the next step. If a step dies mid-page, the next one re-fetches that page. Nothing is lost and nothing is counted twice, because every record is saved by the provider's id and, failing that, by email.

When your provider tells us to slow down, we do. A rate-limit reply sets a not-before time on the run, and the next step waits for it. Flaky replies get a few retries with growing pauses. A real failure, like a revoked token, marks the run failed and the connection as needing reconnection, and the Connections page says so.

What the counts mean

  • Audiences found: how many lists the provider reported.
  • Contacts seen: records pulled so far, across all audiences. This climbs during the run.
  • Contacts new: records we had not seen on an earlier run. On the first sync this equals contacts seen.
  • Last synced: when the most recent run finished.

Unsubscribed stays, but is not resolved

Everyone lands, including people who unsubscribed, bounced, or are waiting on double opt-in. Each carries their status. We keep them because they are part of the truth of your list: an unsubscribe rate of 30% is something you should be able to see. But by default we do not resolve them into people. Resolution costs money and you cannot email them anyway. Only subscribed addresses go on to validation and identity resolution. Unsubscribed and cleaned addresses do not count toward your plan's contact limit either.

After the pull: validation, then resolution

When the last page of the last audience lands, the run changes phase. New subscribed contacts go through local validation first (syntax, disposable domains, role addresses, typo domains, live mail server). Survivors go to the identity waterfall in batches of twenty-five, within your plan's resolution bank. If the bank is empty the run finishes the pull and stops there. Your contacts are all in. Resolution picks up when the bank refills.

Daily refresh

Every thirty minutes a scheduler checks each live connection. Any connection whose last run is older than a day gets a new run queued. Where the provider supports a since-date filter, the refresh pulls only what changed. Where it does not, we re-pull everything and update in place, which costs you nothing extra. Nobody is resolved twice.

On a refresh, someone new is added and queued for resolution. Someone who unsubscribed at the provider gets their status updated. Someone the provider has removed entirely is marked removed in ListFunnel, not deleted, so your history stays whole. Someone already resolved is left alone.

Sync now

Each connection has a Sync now button. It queues a run at once instead of waiting for the scheduler. Use it after a big import at your provider, or after you fix a list there and want ListFunnel to match.

Disconnecting

Disconnect deletes the stored credential and unhooks the lists from the connection. The lists and their people stay. They stop refreshing. You can delete a list separately if you want it gone.

Run this on your own list.