How to Fix Expandi Data Sync and CSV Export Stalls (2026)
Three of the most common versions of a broken Expandi sync are documented behaviour: the export is emailed rather than downloaded, a known lead is deduplicated on purpose, and a field over 300 characters is dropped in silence.
You asked Expandi for a CSV and nothing downloaded. Or a lead went through the webhook and never appeared. Or the field you need arrived empty while every other field came through, with no error anywhere. So the conclusion writes itself: the sync is broken.
It usually is not. Three of the most common versions of this are Expandi working exactly as documented, in ways the interface does not explain while you are standing in front of it. The export does not download. A lead you already have is deliberately not added twice. And a field longer than a specific limit is dropped without comment.

What is actually happening
Expandi moves data in three directions: out as CSV, in as CSV, and both ways over webhooks and the API. Each has one rule that surprises people, and between them they account for most reports of a broken sync.
| Cause | How you recognise it | What to do |
|---|---|---|
| Export sent by email | You clicked Send and no file downloaded | Check the inbox of the address you typed |
| Lead already in a campaign | The lead does not appear, the data seems lost | Look in Placeholders, the value imported anyway |
| Field over 300 characters | One field is empty, everything else came through | Shorten it at the source before importing |
| Placeholder never defined | The field has nowhere to land and vanishes | Create it in Placeholders, then send the data |
| Webhook not activated or a bad URL | Nothing arrives at all, no partial data | Activate it, then use Send test |
The first one costs the most time for the least reason. Exporting from Expandi is not a download: you open the campaign, go to the People tab, select the people you want, type the email address that should receive the file, give the file a name and click Send. The CSV then arrives in that inbox. Anyone waiting on a browser download is waiting for something that was never going to happen, and the address is typed by hand, so a typo sends your export somewhere you will never look.
The second is the one that looks most like data loss. A lead already present in one of your campaigns will not be added again, to that campaign or to a different one. That is deliberate deduplication, and crucially it is only the lead that is skipped: the dynamic placeholder and its value still import into the Placeholders section. The data you sent is there. It just is not where you were looking for it.
The five checks, in order
Ordered by how often each one is the answer. The first two cost nothing.
Look in your email, not your downloads folder
Open My Campaigns, click the campaign, go to the People tab, select the people you want, enter the address the CSV should go to, name the file and click Send. There is also an Export filtered as CSV button if you have narrowed the list first. Then check that inbox, including spam, and check the address you typed for a typo.
Check whether the lead already exists
If a lead you pushed does not turn up in the campaign, search your other campaigns for them. A lead already in any campaign is not added again, which is usually what you want and never what you expect at the moment you are debugging. Then open the Placeholders section: the value you sent alongside that lead will have imported there regardless.
Check the mandatory column and the URL format
A CSV upload requires profile_link for a regular LinkedIn URL, or profile_link_sn for a Sales Navigator one. Get that wrong and the row has no person to attach to. On the webhook side the equivalent failure is a malformed LinkedIn URL, which is a documented reason for a lead never appearing, so validate the URLs before you validate anything else.
Define the placeholders, then map the columns
Placeholder values can be added in the Placeholders section or imported from a CSV, but the placeholder has to exist before data arrives for it. Create what you need, then map each CSV column to its placeholder and click Send CSV for processing. The import takes a few minutes depending on file size, so a few seconds of nothing is not a failure. And keep every custom field under 300 characters.
Activate the webhook and send a test
A webhook that was never activated is a documented reason for nothing firing, and it looks identical to a broken integration. Activate it, then use the Send test button in Expandi and confirm the test lead appears in the campaign. If you are building it through Zapier, the pairing is Catch Hook on the Zapier side and the custom webhook URL pasted into Expandi's Webhooks menu, with Test trigger on one end and Send test on the other.
Syncs that stay coherent
Four habits, all of them cheaper than repairing a CRM afterwards.
- Decide on the matching key before the first import. The Contact ID mapping is five minutes at the start and a cleanup project if you skip it.
- Use a real shared mailbox for exports, not a personal address typed from memory. Exports are emailed to whatever you type, and a typo loses the file without telling you.
- Keep custom fields short and check the long ones. The 300 character limit bites hardest on the fields you care about most, like a research note or an AI-written opening line.
- Test the webhook with Send test after every change to the placeholder set. Adding a field on one side and not the other is the most common way a working integration quietly starts dropping a column.
Expandi's webhook and API surface is genuinely capable, and for arbitrary routing between tools it is the right instrument. The cost is that you own it: the activation state, the placeholder definitions, the URL formats and the matching key are all yours to keep correct.
If the campaign itself is the thing that is stuck rather than the data, that is a different mechanism, covered in how to fix an Expandi campaign stuck in processing.
When the integration is not yours to maintain
Step back from the individual failures and they share a shape. Every one of them is a piece of plumbing you configured once and now have to remember: whether the webhook is switched on, whether the placeholder exists, whether the identifier is present, whether the field is short enough.
ReactIn takes the other default. Integrations are native rather than assembled, so the identifier mapping and the field definitions are handled on our side, and data moves without a webhook for you to activate or a placeholder to declare first. Lists are fed by signals, over twenty intent sources, so the inbound direction is not a CSV you maintain either.
The honest limit: a native integration is less flexible than a webhook by definition. If your routing is unusual, or you are wiring three tools together in a shape nobody shipped support for, Expandi's webhooks and API will do something ours will not, and that is a real reason to keep them.
What changes is the ordinary case. Getting LinkedIn activity into a CRM and keeping records matched should not require you to remember a 300 character limit, and for most teams that is the whole of what they need the integration to do.
For a feature-by-feature view of the two, see our ReactIn vs Expandi comparison.
Almost nothing here is a failure. It is a set of documented behaviours that happen quietly, and the fastest way through is to check the three quiet ones, the email, the deduplication and the field length, before you start rebuilding an integration that is probably fine.
Frequently Asked Questions
Sources & Further Reading
- Expandi documents the export flow in how to export data.
- The import rules, including the mandatory column, are in upload CSV.
- For the fields themselves, see create and edit placeholders.
- On the webhook side, when webhooks trigger and how to manage them covers activation and testing.
- And for the CRM direction, the HubSpot integration guide, which is where the Contact ID mapping is set out.
Related Articles
How to Fix Expandi Messages Not Sending (Pending Invites)
A connector campaign opens with a connection request, and a lead who already has one pending cannot receive a second. So the campaign has nothing it is allowed to do, and it says so in a tab most people never open.
How to Fix Phantombuster "Error During Loading of Chat Widget"
Phantombuster documents this one, and the documented fix is mostly to wait. The expensive part is a Phantom left looping against it, burning execution time on attempts that cannot succeed.
Working Around the Limitations on Salesflow (2026 Guide)
CSV import exists, so does a campaign type for contacts you already hold, and so do shared blacklists. The constraints that actually bite are narrower: rejected Sales Navigator URLs, per-route caps, and a deliberate block on duplicates.
How to Fix Dripify Lead Collection Stalls (2026 Guide)
Most stalled collections have finished or are waiting. The Lead Collection Report names the cause, the search cap ends runs silently, and working hours suspend lead loading as well as sending.