Turn a conference attendee list into net new CRM contacts

Point the app at your attendee spreadsheet and get three clean tabs: who is genuinely new, who you already know, and who needs better data.

App
LushaHubSpotGoogle SheetsSalesOperationsLead EnrichmentData Sync
PromptCreate

Build me an app for triaging event attendee lists. After every conference or webinar I get handed a raw attendee spreadsheet and waste a day working out who is actually new to us. I want to point the app at a Google Sheet, have it enrich and match every row, and then work out of the results.

Setup: I paste a Google Sheet URL or ID and pick the tab and header row, and the app reads the attendees using the Google Sheets Get Values operation. Show me the detected columns and let me map which one holds full name, work email, company name, job title and LinkedIn URL. Save that mapping along with an event name so the next import remembers it. Each import is stored separately so I can reopen the list from a conference weeks later.

Enrichment: run every attendee through Lusha Enrich People (Bulk). That operation accepts at most 100 records per request, so chunk the list and show a progress indicator with a running count of records processed rather than a blank loading state. Lusha can match on name plus company, on work email, or on LinkedIn URL, so send whatever identifiers each row actually has. Important: a 404 from Lusha means no data was found for those identifiers, not a failure, so those rows belong in the could not be matched tab and must never surface as an error. Keep the per record isCreditCharged flag Lusha returns so I can see how many credits the import consumed.

CRM matching: for each enriched attendee, check HubSpot using Search Contacts, matching on the verified email first and falling back to name plus company when there is no email. HubSpot search is limited to roughly four requests per second, so pace the calls and batch where possible.

The main screen is three tabs, each showing its count in the label. Net new: enriched people with no HubSpot match, each row showing name, job title, employer, verified email and phone. Already in the CRM: attendees that matched an existing contact, showing the existing owner, lifecycle stage and a link through to the HubSpot record so I can see who already owns the relationship. Could not be matched: rows Lusha returned nothing for, plus rows whose source data was too thin to even attempt, with a plain reason on each row such as no email or company in the source row, or no data found for these details. Let me edit the identifiers on those rows and re-run enrichment on just that selection. This tab matters as much as the other two because it tells me which rows had bad input data instead of silently dropping them.

I work out of the net new tab. Every row has a checkbox, with select all and per row ticks. One button, Create in HubSpot, takes the ticked people and creates them using Batch Create Contacts in chunks of 100, writing first name, last name, email, phone, job title and company, plus the event name as the original source. Before creating anything, re-check the ticked emails against HubSpot with Search Contacts so a contact someone else added since the import cannot become a duplicate. Anything that turns out to already exist moves into the already in the CRM tab instead of being created, and tell me that happened.

For every contact created, file a follow-up task using Create Task, associated to the new contact, with a subject like Follow up: event name, a due date I choose when I hit the button (default three business days out) and a priority. Load the rep list with List Owners and let me choose how tasks are assigned: all to one rep, round robin across a set of reps I select, or by a simple rule such as employer size. Show me the resulting per row assignment before I confirm.

Write the enriched results back to the source sheet with Update Values so the list itself stays useful to everyone else. Add columns for verified email, phone, job title, employer, match status (net new, already in the CRM, or could not be matched), the HubSpot contact ID where one exists, and the date it was created. Write back to the same rows so the sheet keeps its original order, and let me trigger the write back manually as well as automatically after a create run.

Add a Build my call list button that starts a background agent. I keep an editable description of my ideal customer profile in the app settings. The agent takes the net new attendees, groups them by employer, enriches the top employers with Lusha Enrich Company (Single) to pull industry, headcount, revenue and technologies, then ranks the net new attendees by fit against my ICP description using both that company data and each person's seniority and role. It writes a prioritized call sheet back into the app as a fourth tab: one row per person in rank order with a one line reason for the ranking, for example VP of Operations at a 400 person logistics firm, matches your mid market ICP and they run the stack you integrate with. Show the run status while the agent works, and keep the last generated call list with the date it was generated so I can reopen it.

Persist everything from an import inside the app: the enriched rows, the tab assignments, my ticks, which contacts were created, and the generated call list, so reopening the app after the event picks up exactly where I left off. Show a header for each import with the event name, the total row count, and how many people landed in each of the three tabs.

What does this prompt do?

  • Reads your attendee spreadsheet and fills in each person's verified email, phone number, job title and employer
  • Sorts everyone into three tabs, net new, already in your CRM, and could not be matched, so no row gets silently dropped
  • Tick the people worth pursuing and create them in HubSpot in one click, each with a follow-up task filed on the right rep
  • Writes the enriched details back into the original sheet, and builds a prioritized call list ranked against your ideal customer

What do I need to use this?

  • A Google Sheet of attendees, with at least a name and company, or an email address, in each row
  • A Lusha account with enrichment credits available
  • A HubSpot login that can create contacts and tasks
  • A short description of your ideal customer, used to rank the call list

How can I customize it?

  • Change which spreadsheet columns map to name, email, company and job title, and save the mapping for next time
  • Set how follow-up tasks get assigned: everything to one rep, round robin across a group, or by a rule like company size
  • Rewrite the ideal customer description any time to re-rank the call list after a different kind of event

FAQs

What happens to attendees we cannot find any data for?
They land in the could not be matched tab with a plain reason next to each one, such as no company in the source row or no data found. That tab is there on purpose: those rows usually have a typo or a missing field rather than being bad leads, and you can correct the details and run enrichment again on just those people.
Will this create duplicate contacts in HubSpot?
No. Every attendee is checked against your CRM by email before anything is created, and the check runs a second time the moment you hit the create button, so someone added by a colleague since your import cannot slip through as a duplicate. Anyone found to already exist moves to the already in the CRM tab instead.
How large an attendee list can it handle?
Large lists are handled in batches with a progress indicator, so a few thousand rows is fine. You will see the count climb as it works rather than staring at a blank screen.
Does it work with webinar exports, not just conferences?
Yes. Any spreadsheet works as long as each row is one person. Webinar, trade show and event platform exports all work the same way, and each import is saved separately so you can reopen a list from weeks ago.
Do I have to add everyone to the CRM at once?
No. You tick individual rows in the net new tab and only the people you tick get created. You can come back later and work through the rest of the list in a second pass.

Related templates

Call overdue Xero customers with an AI collections agent

Every weekday at 10am, an AI voice agent phones your most overdue Xero accounts, logs what each customer promised, and reports back to finance in Slack.

LiveKit
Xero
Deepgram
+2
Agentic Task
Local listing health board for every location you manage

See every Google Maps listing you manage on one screen, ranked worst first, with an audit button that writes the fix list for you.

Local Business Data
Google Sheets
App
Let support send one-off Loops emails without an engineer

Your team picks a template, finds the customer, checks they are safe to email, then sends it, with every send logged where the whole team can see it.

Loops.so
Stripe
Google Sheets
App
Turn Mailjet email clicks into ranked HubSpot follow-ups

Twice a day we spot the people clicking your pricing and demo pages, create a follow-up task for their owner, and post a ranked recap to Slack.

Mailjet
HubSpot
Slack Bot
Agentic Task
Stop cold emails to anyone with a live deal in Pipedrive

Every night at 2am, pull the contacts on your open and won deals and block them from your cold outreach before the next send goes out.

Mailshake
Pipedrive
Google Sheets
Deterministic Code
iMessage campaign console with pre-flight checks and delivery board

Build every text campaign in one screen: check who is actually reachable, see a realistic send plan, then watch delivery land row by row.

LoopMessage
Google Sheets
HubSpot
App

Stop losing a day to every post-event attendee list.

Set this up once and every conference, webinar and trade show list gets triaged the same way, in minutes rather than a day.