← GTM Recipes

CSV · Event · Agent → Your CRM

Duplicate check before the import: who's already in your CRM?

Before new contacts reach the CRM, ListPlus looks up every row in your HubSpot – contacts by email, companies by domain – and writes Yes or No into a column. Your agent fetches the new ones as JSON or hands over only them; existing contacts stay untouched. HubSpot today.

One call from Claude Code, n8n or ChatGPT

Trade show November · 24 contacts1 credit per 100 rows
emily.carter@brightpath-software.comBrightpath SoftwareIn HubSpot · Yes
michael.reyes@bluewater-logistics.comBluewater LogisticsNo · new
sarah.bennett@redwood-analytics-co.comRedwood AnalyticsNo · new
james.hughes@ironclad-mfg.comIronclad ManufacturingIn HubSpot · Yes

query_records · “In HubSpot” = No → 15 new contacts as JSON

Example · fictional contacts, real prices

Watch it

Setup

Build this workflow.

Contacts with an email address (companies with a domain), a connected HubSpot account in the workspace and a list shared with your connection (Edit). For the column the connection needs the Set up right.

What does a run cost?

The column asks HubSpot in bundles: 1 credits per request, one request checks up to 100 rows – 500 contacts cost 5 credits ($0.18 on Pro). List, column and query cost nothing else; a pipeline handoff is charged per record.

  1. Your agent by call

    Rows into the list

    add_records puts the contacts into the shared list. Duplicate rows inside the file are caught on the way in.

  2. Your agent by call

    Add the HubSpot column

    add_column with kind “hubspot” – contacts by email, companies by domain. The column looks up every row in your HubSpot and writes Yes or No.

  3. ListPlus runs automatically

    New rows are looked up too

    Whatever enters the list later is looked up as well – within the list's daily budget. After an export the column asks again for the rows it handed over.

  4. Your agent by call

    Fetch only the new ones

    query_records with the filter “In HubSpot” = “No” returns the new contacts as JSON – for your stack, or send_to_pipeline hands only them to your CRM pipeline.

  5. Your team manual in ListPlus

    Or export in the app

    Export to HubSpot with “only create new ones”: existing contacts stay unchanged, and companies are found by domain before a new one is created.

With your agent

Give your agent this brief.

A HubSpot account in the workspace (Pro, or on Basic as your one tool), the list shared with Edit and the Set up right for the column.

The same call from Claude Code, ChatGPT, Cursor or an n8n HTTP node – MCP and REST offer the same tools.

Agent guide (.md) ↗
Agent prompt

Put my trade show leads (CSV) into the list “Trade show November”. Add a HubSpot column “In HubSpot” for contacts by email. Then give me every row with “No” as JSON (name, company, email) and tell me how many HubSpot already has. Don't write anything to HubSpot.

Tools and sample call

add_records · describe_setup · add_column · query_records · send_to_pipeline

add_records({
  "list_id": "<shared_list_id>",
  "records": [
    {
      "first_name": "Markus",
      "last_name": "Brandt",
      "email": "markus.brandt@nordwind-logistik.de",
      "company_name": "Nordwind Logistik"
    }
  ]
})
add_column({
  "list_id": "<shared_list_id>",
  "columns": [
    {
      "kind": "hubspot",
      "title": "In HubSpot",
      "object": "contacts",
      "account_id": "<hubspot_account_id>"
    }
  ]
})
query_records({
  "list_id": "<shared_list_id>",
  "filter": {
    "In HubSpot": "No"
  },
  "columns": [
    "first_name",
    "last_name",
    "company_name",
    "email"
  ]
})

Try it with your data

Matching is by email or domain – a person with a different address in HubSpot is not recognised. Rows without an email count as “not in HubSpot”. Other CRMs don't work this way yet.

Connect your AI