Expandi alternative
The Expandi alternative that books the call
Keep what works. Add live signals, lists that refill themselves and replies drafted for you.
Why teams switch
Why people leave Expandi.
Replies are on you
We didn't find AI reply drafting on Expandi's pricing page. Gelee drafts every reply.
No buying signals
Gelee reaches out when someone is hiring, raised or changed jobs, not just when they're next on a list.
Webhooks, but no full API
Expandi documents webhooks. Gelee has a full API and an MCP, so your tools can write back.
What you get
Everything, on every plan.
Side by side
Gelee vs Expandi.
| Feature | |||
|---|---|---|---|
| Finding buyers | |||
| Live buying signals (hiring, funding, job changes) | ✓ | ✕ | |
| Evergreen lists that add new matches every day | ✓ | ✕ | |
| Every lead enriched automatically | ✓ | ✕ | |
| ICP filters checked before every send | ✓ | ✕ | |
| Scores every lead before reaching out | ✓ | ✕ | |
| Reaching them | |||
| Routes your best accounts to your best prospects | ✓ | ✕ | |
| Per-account limits for invites, messages, reads, likes and comments | ✓ | Some actions | |
| Smart warm-up and ramp-up | ✓ | ✕ | |
| Post engager campaigns | ✓ | ✕ | |
| Keyword and follower campaigns | ✓ | ✕ | |
| Free InMails to Open Profiles | ✓ | ✕ | |
| Blacklist | ✓ | ✓ | |
| Replies and booking | |||
| AI drafts replies and sends your booking link | ✓ | ✕ | |
| One inbox for every account | ✓ | ✓ | |
| Custom Slack notifications | ✓ | ✕ | |
| Setup and plumbing | |||
| Set up for you by our team | ✓ | ✕ | |
| CRM integrations | ✓ | ✓ | |
| Public API and webhooks | ✓ | Webhooks only | |
| MCP for Claude and ChatGPT | ✓ | ✓ | |
How to switch
8 steps. We do them with you.
Export your Expandi contacts
Export each campaign's contacts to CSV from Expandi. Keep the LinkedIn profile URL, name, company, title, tags and any custom placeholders you use in messages, plus each contact's status so you know who has been reached.
Bring your do-not-contact list over first
Do this first. Before a single lead goes in. Export your Expandi blacklist and add everyone already contacted that you do not want to hear from Gelee.
Then send it over in one call, or add it in the app's Settings. People and whole companies both work, and sending the same list twice won't break anything. Gelee checks it when someone joins a campaign and again right before every message.
curl -X POST "https://www.gelee.ai/api/v1/blacklist" \ -H "Authorization: Bearer gk_your_key" \ -H "Content-Type: application/json" \ -d '{"entries":[ {"value":"https://www.linkedin.com/in/janedoe","type":"account"}, {"value":"Acme Corp","type":"company"} ]}'Connect your LinkedIn seats
Whoever sends the outreach connects their LinkedIn in the Gelee app, under Accounts. It takes a minute.
One rule matters more than the rest: don't let Expandi and Gelee both run campaigns from the same seat at the same time. Neither tool knows what the other sent, and LinkedIn sees both. Pause that seat's Expandi campaigns first, then switch it on in Gelee.
Brand new or rested account? Turn on warm-up and it starts slow.
Swap your message variables
Paste your Expandi messages into Gelee steps and swap the variables. If a variable comes back empty, Gelee drops that sentence instead of sending a blank, so you don't need a fallback on every one.
Anything of your own, like a report link or a finding, becomes a custom field:
{{custom.field_name}}. If a step needs a field that isn't there yet, it waits for it (up to a day). Handy if you write the link onto the lead when they accept.- first name →
{{firstName}} - company name →
{{company}} - a custom placeholder →
{{custom.field_name}}
- first name →
Rebuild the campaign
Rebuild the main path of each Expandi campaign as Gelee steps: the invite note, then each message with its wait. Profile visits, follows, likes and endorsements are not Gelee steps.
If you used Expandi's interest status to route replies, Gelee's AI SDR sorts replies for you and flags them interested or not, and needs_human tells you when one needs a person.
Add your leads
Make the campaign, then add people however's easiest: upload the CSV, push them with the API, or point Zapier or Clay at the campaign's intake URL. All Gelee needs is the LinkedIn URL.
Leave out anyone Expandi already reached, unless you actually want a second touch. Gelee won't put the same person in two of your campaigns anyway.
If tools post into an Expandi reversed webhook today, point them at the Gelee campaign's intake URL instead: it accepts the same kind of pasted URL and reads profile_link as the LinkedIn URL.
curl -X POST "https://www.gelee.ai/api/v1/campaigns/CAMPAIGN_ID/leads" \ -H "Authorization: Bearer gk_your_key" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: import-batch-1" \ -d '{"leads":[{"linkedin_url":"https://www.linkedin.com/in/janedoe", "first_name":"Jane","company":"Acme","title":"VP Sales", "custom_fields":{"report_link":"https://acme.example/r/5d70"}, "tags":["imported"]}]}'Repoint your integrations
Map each Expandi webhook to the Gelee event in the table above.
In Gelee, add a webhook under Settings, Event Destinations (or
POST /webhooks). Every event comes with the person, the seat that sent and the campaign. Hit Test to get a full sample before anything real flows.Leave the Expandi one running until you cut over, so your CRM doesn't have a gap.
Run both for a bit, then cut over
Don't move everything on day one. Start with a seat or two, run them next to Expandi for a few weeks, and look at accepts, replies and booked calls. Split by seat, never by person.
Happy? Pause the rest of Expandi, export one last time, move the remaining seats. Keep that last export. It's your record of who was contacted before.
Let AI do it
Let our AI move it.
The Gelee MCP already knows Expandi. Connect it to Claude or ChatGPT and ask it to move you over. It checks with you before anything sends.
Set up the MCPQuestions
Good to know.
What replaces Expandi's reversed webhooks?
Each Gelee campaign has an intake URL you can paste into any tool, with no key or headers, and POST /campaigns/{id}/leads for code. To pause or resume one lead, use POST /prospects/{id}/pause and /resume.
Does Gelee have an equivalent of Expandi's 'Contact replied' webhook?
Yes: reply_received, plus reply_positive and reply_negative sorted by sentiment, each with the person, the seat that sent and the campaign.
Can I run Expandi and Gelee at the same time?
Yes. Just don't run both on the same LinkedIn seat at once, and don't let them message the same people. Split by seat and you're fine.
Will I lose my Expandi conversation history?
No. The conversations live on LinkedIn, so they show up in Gelee once the seat connects. What doesn't come over is the other tool's own notes, tags and stats. Export those before you cancel.
Do I need the API to switch?
No. You can do all of this in the app. The API is there if you'd rather your own systems do it.
For developers: API calls, webhooks and variables
Expandi's help center documents two ways to automate. Webhooks, set under LinkedIn Settings, Webhooks, send a POST to your URL on 25 events, from replies and accepted invites to email opens and "account has nothing scheduled". "Reversed webhooks" are per-campaign URLs that add a lead (by profile_link) or pause and resume one.
Its help center notes that leads sent by webhook cannot enter a campaign that uses Signals. We did not find a broader public REST API in Expandi's own documentation.
Their words, our words
| Expandi | Gelee | Notes |
|---|---|---|
| Campaign | Campaign | |
| LinkedIn account | Seat | |
| Contact / prospect | Lead | |
| Tags and interest status | Tags and inbox flags | interested, lost, referral, follow-up. |
| Reversed webhook URL | Intake URL, or POST /campaigns/{id}/leads | The intake URL also takes a pasted URL with no key. |
| Smart inbox | Inbox | With the AI SDR drafting or sending replies. |
| Blacklist | Blacklist |
API calls
| Expandi | Gelee | Notes |
|---|---|---|
Reversed webhook: add lead (profile_link) | POST /campaigns/{id}/leads, or the campaign's intake URL | The intake URL reads loose field names, so profile_link works as is. |
Reversed webhook: pause / resume lead | POST /prospects/{id}/pause, /resume | Or POST /inbox/stop with LinkedIn URLs. |
(not in Expandi's docs) | GET /prospects, /people, /inbox, /campaigns | Read everything back with the whole story per lead. |
(not in Expandi's docs) | POST /inbox/{chat_id}/messages, POST /conversations | Send from your own code. |
(not in Expandi's docs) | PATCH /prospects/{id} | Custom fields, tags, flags, outcomes. |
Webhooks
| Expandi | Gelee webhook | Notes |
|---|---|---|
| Contact replied, Contact replied to campaign message | reply_received | Plus reply_positive / reply_negative. |
| Contact replied first time since start | reply_received | Check timeline.first_reply_at. |
| Connection request accepted (by contact in active campaign) | connection_accepted | |
| Connection request sent | invite_sent | Pick by name. |
| Message sent | message_sent | Pick by name. |
| Contact revoked | invite_withdrawn | |
| Contact tagged, Contact interest status changed | lead_updated | Fires for changes made through the API or the assistant. |
| Contact added to campaign | lead_accepted (API pushes) | Fires once the verdict on a pushed lead lands. |
| Campaign finished | campaign_completed | |
| LinkedIn account has nothing / no messages / no invites scheduled | GET /health | Planned versus sent, with the reasons for any gap. |
| Visit, follow, like, endorsement sent; email events | No webhook |
Message variables
| Value | Gelee variable |
|---|---|
| First name | {{firstName}} |
| Full name | {{fullName}} |
| Company | {{company}} |
| Job title | {{role}} |
| Industry | {{industry}} |
| Your own per-lead field | {{custom.your_field}} |
| A fallback when empty | {{custom.your_field|default text}} |
| Sender's name | {{senderName}} |
Discovery call
Moving from Expandi? We'll plan it with you.
A quick call. We learn about your market, and if it's a fit we'll move you over.
