<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sales List Rescue</title>
    <description>The latest articles on DEV Community by Sales List Rescue (@saleslistrescue).</description>
    <link>https://dev.to/saleslistrescue</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4203230%2F4e238a0b-e531-47e2-963e-2ccda7f6a45b.png</url>
      <title>DEV Community: Sales List Rescue</title>
      <link>https://dev.to/saleslistrescue</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saleslistrescue"/>
    <language>en</language>
    <item>
      <title>Merging Mailchimp audiences? Dedupe your exports first (5 Google Sheets checks)</title>
      <dc:creator>Sales List Rescue</dc:creator>
      <pubDate>Sun, 25 Oct 2026 20:22:21 +0000</pubDate>
      <link>https://dev.to/saleslistrescue/merging-mailchimp-audiences-dedupe-your-exports-first-5-google-sheets-checks-4nfj</link>
      <guid>https://dev.to/saleslistrescue/merging-mailchimp-audiences-dedupe-your-exports-first-5-google-sheets-checks-4nfj</guid>
      <description>&lt;p&gt;Mailchimp recommends one primary audience, but plenty of accounts end up with three or four. The catch: Mailchimp dedupes only &lt;em&gt;inside&lt;/em&gt; an audience. In its own words, "If the same person's email is in two audiences, we see that as two people" (&lt;a href="https://mailchimp.com/help/remove-duplicates-and-bounces-with-excel/" rel="noopener noreferrer"&gt;Mailchimp Help&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The built-in Combine Audiences tool is quick, but it moves only subscribed contacts and doesn't transfer tags, groups, opt-in timestamps, signup sources or GDPR permissions. The safer route is to export every audience, stack the CSVs, clean them, and import back into your primary audience one status at a time. Here are the checks to run on the stacked file in Google Sheets before you import.&lt;/p&gt;

&lt;h2&gt;
  
  
  0. Before you stack: add two columns to every export
&lt;/h2&gt;

&lt;p&gt;A Mailchimp export can come as a ZIP with separate CSVs for subscribed, unsubscribed, non-subscribed and cleaned contacts. Before stacking, add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Audience&lt;/code&gt;: the old audience's name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Status&lt;/code&gt;: subscribed, unsubscribed, non-subscribed or cleaned (from the file name)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stack your &lt;strong&gt;primary audience first&lt;/strong&gt;, so its rows win when you dedupe.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Clean up email case and spaces, then find same-email duplicates
&lt;/h2&gt;

&lt;p&gt;Case and stray spaces hide duplicates. In a helper column:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=LOWER(TRIM(A2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then count each cleaned email:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=COUNTIF($H$2:$H,H2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything above 1 is the same person in two audiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Catch consent conflicts before they become a compliance problem
&lt;/h2&gt;

&lt;p&gt;The dangerous duplicate is someone subscribed in one audience and unsubscribed in another. Flag emails that appear with more than one status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(COUNTIFS($H$2:$H,H2,$B$2:$B,"&amp;lt;&amp;gt;"&amp;amp;B2)&amp;gt;0,"CONFLICT","")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resolve these by hand. Unsubscribed and cleaned addresses should go in as suppression, not as subscribers.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Don't lose tags when you merge rows
&lt;/h2&gt;

&lt;p&gt;When two rows share an email but carry different &lt;code&gt;TAGS&lt;/code&gt; or &lt;code&gt;Audience&lt;/code&gt; values, decide which to keep before you delete the second row. A quick way to see them side by side:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=TEXTJOIN(" | ",TRUE,UNIQUE(FILTER($C$2:$C,$H$2:$H=H2)))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Flag invalid and blank emails
&lt;/h2&gt;

&lt;p&gt;Mailchimp won't import broken addresses. A rough format check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(REGEXMATCH(H2,"^[^@\s]+@[^@\s]+\.[^@\s]+$"),"","CHECK")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This only checks the format. It doesn't verify that the mailbox exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Split by status before importing
&lt;/h2&gt;

&lt;p&gt;Mailchimp imports one status at a time ("You can only import 1 status at a time"), and unmatched columns are dropped. Filter the cleaned sheet by &lt;code&gt;Status&lt;/code&gt;, save each as its own UTF-8 CSV, and tick "Update any existing contacts" on import.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two warnings from Mailchimp's docs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Combining is permanent: "This process is permanent and cannot be undone." Keep every export, including the primary audience's.&lt;/li&gt;
&lt;li&gt;Pause welcome automations first, because the combine tool "will trigger the automation for all contacts moved from the original audience."&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Rather not do it by hand?&lt;/strong&gt; Stack your exports into one CSV and we'll clean it: same-email duplicates merged, possible duplicates and consent conflicts flagged, every change logged, your original file returned, back within 24h. &lt;a href="https://buy.stripe.com/cNi7sK3JS8Z50915Me73G0d?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=mailchimp-merge&amp;amp;utm_content=devto-mailchimp-merge-audiences&amp;amp;client_reference_id=devto-mailchimp-merge-audiences" rel="noopener noreferrer"&gt;Quick Clean, $25 for up to 200 rows&lt;/a&gt;. We never log in to your Mailchimp account. Full walkthrough of both merge routes: &lt;a href="https://pureservices.store/mailchimp-merge-audiences?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=mailchimp-merge&amp;amp;utm_content=devto-mailchimp-mcdupe#mailchimp-duplicate-contacts" rel="noopener noreferrer"&gt;Mailchimp merge audiences guide&lt;/a&gt;. Or check your stacked file free in the browser first with the &lt;a href="https://pureservices.store/tools/csv-preflight?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=mailchimp-merge&amp;amp;utm_content=devto-mailchimp-merge-preflight" rel="noopener noreferrer"&gt;CSV Preflight Checker&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>mailchimp</category>
      <category>emailmarketing</category>
      <category>googlesheets</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Which contacts are missing from your CRM? 5 Google Sheets formulas to compare two lead lists</title>
      <dc:creator>Sales List Rescue</dc:creator>
      <pubDate>Sat, 24 Oct 2026 20:16:14 +0000</pubDate>
      <link>https://dev.to/saleslistrescue/which-contacts-are-missing-from-your-crm-5-google-sheets-formulas-to-compare-two-lead-lists-2o3a</link>
      <guid>https://dev.to/saleslistrescue/which-contacts-are-missing-from-your-crm-5-google-sheets-formulas-to-compare-two-lead-lists-2o3a</guid>
      <description>&lt;p&gt;You have a fresh lead list and a CRM export, and you need to know which people are new, which are already in, and which changed. Eyeballing two sheets does not scale past a few dozen rows. These five formulas do it in Google Sheets with no add-ons. Put the new list on a tab called &lt;code&gt;New&lt;/code&gt; and your CRM export on a tab called &lt;code&gt;CRM&lt;/code&gt;, with email in column B on both.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Build a match key on both tabs
&lt;/h2&gt;

&lt;p&gt;"&lt;a href="mailto:Jane@Acme.com"&gt;Jane@Acme.com&lt;/a&gt; " and "&lt;a href="mailto:jane@acme.com"&gt;jane@acme.com&lt;/a&gt;" are the same person, but a plain lookup says they are not. Add a key column (Z here) to each tab.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=LOWER(TRIM(B2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fill it down on both &lt;code&gt;New&lt;/code&gt; and &lt;code&gt;CRM&lt;/code&gt;, and match on Z from now on, never on the raw email.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Flag who is missing from the CRM
&lt;/h2&gt;

&lt;p&gt;On the &lt;code&gt;New&lt;/code&gt; tab, one column tells you whether each row already exists.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(Z2="","NO EMAIL",IF(COUNTIF(CRM!$Z:$Z,Z2)=0,"MISSING","IN CRM"))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the same formula on the &lt;code&gt;CRM&lt;/code&gt; tab pointed at &lt;code&gt;New!$Z:$Z&lt;/code&gt; to see the reverse: contacts you have that the new list dropped.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Pull every missing row onto its own tab
&lt;/h2&gt;

&lt;p&gt;Filtering by hand is where rows get lost. This spills the full missing rows into a new tab in one go.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=FILTER(New!A2:F,New!Z2:Z&amp;lt;&amp;gt;"",COUNTIF(CRM!Z2:Z,New!Z2:Z)=0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adjust &lt;code&gt;A2:F&lt;/code&gt; to cover your columns. This tab is what you import, so nothing already in the CRM gets created twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Fall back to name plus company when email is blank
&lt;/h2&gt;

&lt;p&gt;Rows with no email still need a key. Strip punctuation and common company suffixes so "Acme, Inc." and "acme inc" line up.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=LOWER(TRIM(A2))&amp;amp;"|"&amp;amp;TRIM(REGEXREPLACE(REGEXREPLACE(LOWER(C2),"[.,]",""),"\b(inc|llc|ltd|corp|co|gmbh)\b",""))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A is the full name and C is the company here. Use this key only for the NO EMAIL rows from step 2, and review those matches by eye, because two people can share a name.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Spot changed fields on rows that already exist
&lt;/h2&gt;

&lt;p&gt;A contact can be in your CRM with an old phone number or title. Compare one field at a time; D is the phone column on both tabs in this example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFERROR(IF(TRIM(XLOOKUP(Z2,CRM!$Z:$Z,CRM!$D:$D))=TRIM(D2),"SAME","CHANGED"),"NOT IN CRM")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filter to CHANGED and decide row by row whether the new value should overwrite the old one. Do not bulk-overwrite; sometimes the CRM value is the one a rep fixed by hand.&lt;/p&gt;

&lt;p&gt;Run all five on copies of both files, import only the step 3 tab as new contacts, and handle the CHANGED rows as updates.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Before you import the missing contacts, clean them.&lt;/strong&gt; Drop your step 3 tab into the free &lt;a href="https://pureservices.store/tools/csv-preflight?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=listcompare" rel="noopener noreferrer"&gt;CSV preflight checker&lt;/a&gt; to see what will break, right in your browser. Or send up to 200 rows to the &lt;a href="https://buy.stripe.com/cNi7sK3JS8Z50915Me73G0d" rel="noopener noreferrer"&gt;$25 Quick Clean&lt;/a&gt; and get back a cleaned CSV (same-email duplicates merged, possible duplicates flagged) plus a change log within 24 hours, no tool login needed. Prefer to do it yourself? The &lt;a href="https://buy.stripe.com/4gMdR84NW5MT4phgqS73G0b" rel="noopener noreferrer"&gt;HubSpot/Salesforce Import Checklist ($9)&lt;/a&gt; has every pre-import check on one page. Bigger lists and pricing at &lt;a href="https://pureservices.store/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=listcompare" rel="noopener noreferrer"&gt;pureservices.store&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>sales</category>
      <category>googlesheets</category>
      <category>productivity</category>
      <category>crm</category>
    </item>
    <item>
      <title>"Sr. VP Sales &amp; Mktg" won't segment itself: 5 Google Sheets fixes for job titles before your CRM import</title>
      <dc:creator>Sales List Rescue</dc:creator>
      <pubDate>Sat, 24 Oct 2026 15:19:52 +0000</pubDate>
      <link>https://dev.to/saleslistrescue/sr-vp-sales-mktg-wont-segment-itself-5-google-sheets-fixes-for-job-titles-before-your-crm-2f3i</link>
      <guid>https://dev.to/saleslistrescue/sr-vp-sales-mktg-wont-segment-itself-5-google-sheets-fixes-for-job-titles-before-your-crm-2f3i</guid>
      <description>&lt;p&gt;Job titles are the column everyone wants to segment on and nobody cleans. One export gives you "VP Sales", "V.P., Sales", "Sr. Mgr - Marketing" and "n/a", and your "Directors and above" list quietly misses half of them. These five fixes run in Google Sheets before you import into HubSpot, Salesforce, Pipedrive, or your sequencer. Assume the raw title is in E and you work in F.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Clean the whitespace first
&lt;/h2&gt;

&lt;p&gt;Exports carry double spaces, line breaks and non-breaking spaces that make identical titles look different.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=TRIM(REGEXREPLACE(CLEAN(E2),"[\s\x{00A0}]+"," "))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put this in F and run every later step on F, not E.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Expand common abbreviations
&lt;/h2&gt;

&lt;p&gt;"Sr.", "Mgr" and "Dir." should read the same as the long form so filters catch them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(F2,"(?i)\bsr\.?\s","Senior "),"(?i)\bmgr\b\.?","Manager"),"(?i)\bdir\b\.?","Director")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add more pairs the same way (Eng to Engineering, Mktg to Marketing) once you see which ones your list uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Bucket seniority
&lt;/h2&gt;

&lt;p&gt;One column you can filter on beats fifty spellings. VP is checked before C-level so "Vice President" doesn't land in the president bucket.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFS(REGEXMATCH(LOWER(G2),"\b(vp|v\.p|vice president|svp|evp|head of)\b"),"VP/Head",REGEXMATCH(LOWER(G2),"\b(ceo|cfo|cto|coo|cmo|cro|chief|founder|co-founder|owner|president)\b"),"C-level/Owner",REGEXMATCH(LOWER(G2),"\bdirector\b"),"Director",REGEXMATCH(LOWER(G2),"\b(manager|lead|supervisor)\b"),"Manager",TRUE,"IC/Other")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;G is the output of step 2. Spot-check the "IC/Other" rows; that is where odd titles like "Partner" or "Principal" end up, and you decide where they belong.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Bucket department
&lt;/h2&gt;

&lt;p&gt;Seniority without function still mixes your CFO with your CMO.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFS(REGEXMATCH(LOWER(G2),"sales|account exec|business development|\bsdr\b|\bbdr\b|revenue"),"Sales",REGEXMATCH(LOWER(G2),"marketing|growth|demand gen|brand|content"),"Marketing",REGEXMATCH(LOWER(G2),"engineer|developer|\bit\b|technology|software"),"Engineering/IT",REGEXMATCH(LOWER(G2),"operations|\bops\b|finance|\bhr\b|people"),"Ops/Finance/HR",TRUE,"Other")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the raw title too. The buckets are for filtering, and the original is what you show in a personalized line.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Flag junk titles for review
&lt;/h2&gt;

&lt;p&gt;Blank cells, placeholders, pasted emails or URLs, and whole bios stuffed into the title field should never reach a merge field.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(OR(LEN(TRIM(E2))=0,REGEXMATCH(LOWER(TRIM(E2)),"@|http|^(n/?a|none|test|-+|\.+)$"),LEN(E2)&amp;gt;80),"REVIEW","OK")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filter to REVIEW, fix or blank those rows, and leave title out of your opener for anything you blank.&lt;/p&gt;

&lt;p&gt;Run all five on a copy, sort by the seniority column to eyeball each bucket, then import only the cleaned sheet with the two bucket columns mapped to custom properties.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Rather hand off the cleanup?&lt;/strong&gt; Drop your file into the free &lt;a href="https://pureservices.store/tools/csv-preflight?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=jobtitles" rel="noopener noreferrer"&gt;CSV preflight checker&lt;/a&gt; to see what will break, right in your browser. Or send up to 200 rows to the &lt;a href="https://buy.stripe.com/cNi7sK3JS8Z50915Me73G0d" rel="noopener noreferrer"&gt;$25 Quick Clean&lt;/a&gt; and get back a cleaned CSV (same-email duplicates merged, possible duplicates flagged) plus a change log within 24 hours, no tool login needed. Prefer to do it yourself? The &lt;a href="https://buy.stripe.com/4gMdR84NW5MT4phgqS73G0b" rel="noopener noreferrer"&gt;HubSpot/Salesforce Import Checklist ($9)&lt;/a&gt; has every pre-import check on one page. Bigger lists and pricing at &lt;a href="https://pureservices.store/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=jobtitles" rel="noopener noreferrer"&gt;pureservices.store&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>sales</category>
      <category>googlesheets</category>
      <category>crm</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Hi {{first_name}}, ACME INC. LLC: 5 Google Sheets fixes for merge fields before your cold email tool sends them</title>
      <dc:creator>Sales List Rescue</dc:creator>
      <pubDate>Sat, 24 Oct 2026 14:26:41 +0000</pubDate>
      <link>https://dev.to/saleslistrescue/hi-firstname-acme-inc-llc-5-google-sheets-fixes-for-merge-fields-before-your-cold-email-5g3p</link>
      <guid>https://dev.to/saleslistrescue/hi-firstname-acme-inc-llc-5-google-sheets-fixes-for-merge-fields-before-your-cold-email-5g3p</guid>
      <description>&lt;p&gt;A list can pass every bounce check and still embarrass you on the first send. Shouting caps, "Hi ," with a blank name, and "ACME HOLDINGS, INC." in the middle of a sentence all come from the merge fields, not the addresses. These five fixes run in Google Sheets before you upload to Instantly, Smartlead, lemlist, or any sender that uses variables. Assume first name is in B, company in D, email in C.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Fix first-name casing
&lt;/h2&gt;

&lt;p&gt;Exports mix "JOHN", "john" and "John". Normalize to proper case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=PROPER(TRIM(B2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Watch for names like "McDonald" or "O'Neil"; PROPER handles the apostrophe but not "Mc", so scan anything starting with "Mc" or "Mac" by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Give blank or junk names a safe fallback
&lt;/h2&gt;

&lt;p&gt;A missing name sends "Hi ,". So does a placeholder like "-", "n/a" or "test". This is a Google Sheets formula (REGEXMATCH is Sheets-only):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(OR(LEN(TRIM(SUBSTITUTE(B2,CHAR(160)," ")))&amp;lt;2,REGEXMATCH(LOWER(TRIM(SUBSTITUTE(B2,CHAR(160)," "))),"^(n/?a|none|test|unknown|-+)$")),"there",PROPER(TRIM(SUBSTITUTE(B2,CHAR(160)," "))))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why the SUBSTITUTE: CRM and LinkedIn exports can contain invisible non-breaking spaces (CHAR(160)) that TRIM does not remove, so a name that looks blank can still print "Hi  ,".&lt;br&gt;
Now every row reads "Hi John" or "Hi there", never "Hi ,".&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Strip legal suffixes from company names
&lt;/h2&gt;

&lt;p&gt;Nobody says "I saw ACME HOLDINGS, INC. is hiring." Drop the suffix and fix the caps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=PROPER(TRIM(REGEXREPLACE(D2,"(?i)[,.]?\s*\b(inc|llc|ltd|limited|corp|corporation|co|gmbh|plc|pty)\.?$","")))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then eyeball acronyms like "IBM" or "NASA" that PROPER turns into "Ibm"; keep a short exceptions list and fix those rows by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Catch a first name that is actually a full name
&lt;/h2&gt;

&lt;p&gt;Some forms put "John Smith" in the first-name field, so your opener reads "Hi John Smith".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(REGEXMATCH(TRIM(B2),"\s"),REGEXEXTRACT(TRIM(B2),"^\S+"),TRIM(B2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it before step 1 and step 2 so the fallback and casing apply to the cleaned value.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Fill a missing company from the email domain
&lt;/h2&gt;

&lt;p&gt;If company is blank but the email is a work address, the domain is a decent stand-in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(LEN(TRIM(D2))&amp;gt;0,D2,IF(REGEXMATCH(LOWER(C2),"@(gmail|yahoo|hotmail|outlook|icloud|aol)\."),"",PROPER(REGEXEXTRACT(LOWER(C2),"@([^.]+)\."))))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Free-mail addresses stay blank, so you can route them to a sequence that doesn't mention a company at all.&lt;/p&gt;

&lt;p&gt;Run all five on a copy, preview three or four rows in your tool's variable preview, then upload only the cleaned sheet.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Rather not fix it by hand?&lt;/strong&gt; Drop your file into the free &lt;a href="https://pureservices.store/tools/csv-preflight?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=mergefields" rel="noopener noreferrer"&gt;CSV preflight checker&lt;/a&gt; to see what will break, right in your browser. Or send up to 200 rows to the &lt;a href="https://buy.stripe.com/cNi7sK3JS8Z50915Me73G0d" rel="noopener noreferrer"&gt;$25 Quick Clean&lt;/a&gt; and get back a cleaned CSV (same-email duplicates merged, possible duplicates flagged) plus a change log within 24 hours, no tool login needed. Prefer to do it yourself? The &lt;a href="https://buy.stripe.com/4gMdR84NW5MT4phgqS73G0b" rel="noopener noreferrer"&gt;HubSpot/Salesforce Import Checklist ($9)&lt;/a&gt; has every pre-import check on one page. Bigger lists and pricing at &lt;a href="https://pureservices.store/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=mergefields" rel="noopener noreferrer"&gt;pureservices.store&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>sales</category>
      <category>googlesheets</category>
      <category>emailmarketing</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Duplicate contacts sneaking into your CRM import? 5 Google Sheets checks to catch them first</title>
      <dc:creator>Sales List Rescue</dc:creator>
      <pubDate>Sat, 24 Oct 2026 10:18:37 +0000</pubDate>
      <link>https://dev.to/saleslistrescue/duplicate-contacts-sneaking-into-your-crm-import-5-google-sheets-checks-to-catch-them-first-4adf</link>
      <guid>https://dev.to/saleslistrescue/duplicate-contacts-sneaking-into-your-crm-import-5-google-sheets-checks-to-catch-them-first-4adf</guid>
      <description>&lt;p&gt;HubSpot dedupes on email, Salesforce on whatever matching rule you set, and Pipedrive barely at all. None of them catch "Jon Smith, &lt;a href="mailto:jon@acme.com"&gt;jon@acme.com&lt;/a&gt;" and "Jonathan Smith, &lt;a href="mailto:JON@Acme.com"&gt;JON@Acme.com&lt;/a&gt; " as the same person. Every dupe that slips through means split activity history, double sequences, and reps stepping on each other. These five Google Sheets checks find duplicates before you upload. Assume email is in column C, first name in A, last name in B, company in D, and phone in E.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Build a clean email key
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=LOWER(TRIM(C2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put this in a helper column (say F). Case and stray spaces are the most common reason two identical emails look different to a sheet but identical to your CRM's dedupe, or the other way round.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Flag exact email duplicates
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(F2="","NO EMAIL",IF(COUNTIF(F$2:F,F2)&amp;gt;1,"DUPE","OK"))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filter for DUPE and keep the row with the most filled-in fields. &lt;code&gt;=COUNTA(A2:E2)&lt;/code&gt; in another column makes picking the winner fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Catch Gmail dot and plus variants
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;j.smith+leads@gmail.com&lt;/code&gt; and &lt;code&gt;jsmith@gmail.com&lt;/code&gt; are the same inbox. In column G:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(REGEXMATCH(F2,"@(gmail|googlemail)\.com$"),SUBSTITUTE(REGEXEXTRACT(F2,"^[^@+]*"),".","")&amp;amp;"@gmail.com",REGEXREPLACE(F2,"\+[^@]*",""))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gmail addresses lose dots and plus tags; everything else just loses the plus tag. Re-run check 2 against column G.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Match people without an email on name + company
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=LOWER(TRIM(A2))&amp;amp;"|"&amp;amp;LOWER(TRIM(B2))&amp;amp;"|"&amp;amp;LOWER(REGEXREPLACE(TRIM(D2),"(?i)[,.]?\s*(inc|llc|ltd|limited|corp|co|gmbh)\.?$",""))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then &lt;code&gt;=COUNTIF(H$2:H,H2)&amp;gt;1&lt;/code&gt; flags rows where "Acme Inc." and "acme" are the same company. Review these by hand; two real people can share a name.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Match on phone digits as a tiebreaker
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=RIGHT(REGEXREPLACE(E2,"\D",""),10)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Last 10 digits strips country codes and formatting, so "+1 (555) 010-2233" and "555.010.2233" line up. Flag with COUNTIF the same way.&lt;/p&gt;

&lt;p&gt;Run all five on a copy, merge or delete the flagged rows, then import only the cleaned sheet. A quick final count, &lt;code&gt;=COUNTIF(I2:I,"DUPE")&lt;/code&gt; on your final flag column, should read 0.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Rather hand off the cleanup?&lt;/strong&gt; Send up to 200 rows to the &lt;a href="https://buy.stripe.com/cNi7sK3JS8Z50915Me73G0d?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=dupcontacts" rel="noopener noreferrer"&gt;$25 Quick Clean&lt;/a&gt; and get back a cleaned CSV (same-email duplicates merged, possible duplicates flagged) plus a change log within 24 hours. No CRM login needed: email us your CSV (reply to your receipt or send it to &lt;a href="mailto:slrescue@mail.grokbot.com"&gt;slrescue@mail.grokbot.com&lt;/a&gt;). Bigger list? &lt;a href="https://buy.stripe.com/9B600idksb7d2h9eiK73G03?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=dupcontacts" rel="noopener noreferrer"&gt;Intro $99&lt;/a&gt; covers up to 500 rows, and Growth ($299, up to 2,000) and Bulk ($499, up to 5,000) are on &lt;a href="https://pureservices.store/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=dupcontacts" rel="noopener noreferrer"&gt;pureservices.store&lt;/a&gt;. Want to check the file first? The free &lt;a href="https://pureservices.store/tools/csv-preflight?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=dupcontacts" rel="noopener noreferrer"&gt;CSV preflight checker&lt;/a&gt; runs in your browser.&lt;/p&gt;

</description>
      <category>crm</category>
      <category>sales</category>
      <category>googlesheets</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Country and state columns breaking your CRM import? 5 Google Sheets fixes for addresses</title>
      <dc:creator>Sales List Rescue</dc:creator>
      <pubDate>Sat, 24 Oct 2026 08:20:34 +0000</pubDate>
      <link>https://dev.to/saleslistrescue/country-and-state-columns-breaking-your-crm-import-5-google-sheets-fixes-for-addresses-2odg</link>
      <guid>https://dev.to/saleslistrescue/country-and-state-columns-breaking-your-crm-import-5-google-sheets-fixes-for-addresses-2odg</guid>
      <description>&lt;p&gt;"USA", "United States", "U.S.", and "us" are four different countries as far as your CRM is concerned. State columns are worse: "Calif.", "CA", "california ", and a stray ZIP code in the state field. HubSpot and Salesforce both validate country/state picklists, so one messy column either rejects rows or quietly breaks territory routing. These five Google Sheets fixes clean it up before you upload. Assume country is in column D, state in E, and ZIP/postal code in F.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Normalize spacing and case first
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=PROPER(TRIM(REGEXREPLACE(D2,"[.\s]+"," ")))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This alone collapses most variants ("u.s." becomes "U S", "united  states" becomes "United States"), so the next step has far fewer cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Map countries to one standard with a lookup tab
&lt;/h2&gt;

&lt;p&gt;Make a tab called &lt;code&gt;country_map&lt;/code&gt; with lowercase variants in column A and the CRM-accepted name (or ISO code) in column B:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFERROR(VLOOKUP(LOWER(TRIM(D2)),country_map!A:B,2,FALSE),"UNMAPPED")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seed it with &lt;code&gt;=SORT(UNIQUE(LOWER(TRIM(D2:D))))&lt;/code&gt; so you only map values you actually have.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Convert full state names to two-letter codes
&lt;/h2&gt;

&lt;p&gt;Put full names in &lt;code&gt;states!A&lt;/code&gt; and codes in &lt;code&gt;states!B&lt;/code&gt;, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(LEN(TRIM(E2))=2,UPPER(TRIM(E2)),IFERROR(VLOOKUP(LOWER(TRIM(E2)),states!A:B,2,FALSE),"CHECK"))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Already-correct codes pass through; everything else gets mapped or flagged.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Rescue ZIP codes that lost their leading zero
&lt;/h2&gt;

&lt;p&gt;Sheets turns 02134 into 2134. For US rows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(AND(G2="United States",ISNUMBER(--F2)),TEXT(F2,"00000"),F2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Format the column as Plain text before you export so the zeros survive the CSV.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Count what's left before you import
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=COUNTIF(G2:G,"UNMAPPED")+COUNTIF(H2:H,"CHECK")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Import when this reads 0, using the cleaned columns instead of the originals.&lt;/p&gt;

&lt;p&gt;Run these on a copy, fix the flagged rows, then map the cleaned columns in your importer.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Rather hand off the cleanup?&lt;/strong&gt; Send up to 200 rows to the &lt;a href="https://buy.stripe.com/cNi7sK3JS8Z50915Me73G0d?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=country-state" rel="noopener noreferrer"&gt;$25 Quick Clean&lt;/a&gt; and get back a cleaned CSV (same-email duplicates merged, possible duplicates flagged) plus a change log within 24 hours. No CRM login needed: email us your CSV (reply to your receipt or send it to &lt;a href="mailto:slrescue@mail.grokbot.com"&gt;slrescue@mail.grokbot.com&lt;/a&gt;). Bigger list? &lt;a href="https://buy.stripe.com/9B600idksb7d2h9eiK73G03?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=country-state" rel="noopener noreferrer"&gt;Intro $99&lt;/a&gt; covers up to 500 rows, and Growth ($299, up to 2,000) and Bulk ($499, up to 5,000) are on &lt;a href="https://pureservices.store/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=country-state" rel="noopener noreferrer"&gt;pureservices.store&lt;/a&gt;. Want to check the file first? The free &lt;a href="https://pureservices.store/tools/csv-preflight?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=country-state" rel="noopener noreferrer"&gt;CSV preflight checker&lt;/a&gt; runs in your browser.&lt;/p&gt;

</description>
      <category>crm</category>
      <category>sales</category>
      <category>googlesheets</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Picklist errors killing your CRM import? 5 Google Sheets fixes for lead source, stage, and owner columns</title>
      <dc:creator>Sales List Rescue</dc:creator>
      <pubDate>Sat, 24 Oct 2026 07:26:09 +0000</pubDate>
      <link>https://dev.to/saleslistrescue/picklist-errors-killing-your-crm-import-5-google-sheets-fixes-for-lead-source-stage-and-owner-d78</link>
      <guid>https://dev.to/saleslistrescue/picklist-errors-killing-your-crm-import-5-google-sheets-fixes-for-lead-source-stage-and-owner-d78</guid>
      <description>&lt;p&gt;"Invalid value for Lead Source" is the import error that eats an afternoon. Your CSV says "linkedin", "LinkedIn Ads", and "LI" while your CRM only accepts "LinkedIn". Same story for deal stage, industry, country, and record owner. These five Google Sheets fixes map every messy value to an allowed one before you upload. Assume the messy value is in column F.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. See every distinct value you actually have
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=SORT(UNIQUE(TRIM(F2:F)))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This short list is your cleanup to-do, usually 20 to 40 variants instead of thousands of rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Build a mapping tab
&lt;/h2&gt;

&lt;p&gt;Make a tab called &lt;code&gt;map&lt;/code&gt; with the messy value in column A and the CRM-allowed value in column B. Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFERROR(VLOOKUP(LOWER(TRIM(F2)),map!A:B,2,FALSE),"UNMAPPED")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put lowercase values in &lt;code&gt;map!A&lt;/code&gt; so "LinkedIn " and "linkedin" hit the same row.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Flag values the CRM will reject
&lt;/h2&gt;

&lt;p&gt;Paste the CRM's allowed picklist into &lt;code&gt;allowed!A:A&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(COUNTIF(allowed!A:A,G2)=0,"REJECT","")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Map owners by email, not name
&lt;/h2&gt;

&lt;p&gt;Importers match owners on user email. Turn "Sam K." into the login:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFERROR(VLOOKUP(TRIM(H2),owners!A:B,2,FALSE),"default-owner@yourco.com")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pick a real default owner so nothing lands unassigned.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Count what's left before you import
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=COUNTIF(G2:G,"UNMAPPED")+COUNTIF(I2:I,"REJECT")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Import when this reads 0.&lt;/p&gt;

&lt;p&gt;Run these on a copy, fix the UNMAPPED and REJECT rows, then import only the mapped columns.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Rather hand off the cleanup?&lt;/strong&gt; Send up to 200 rows to the &lt;a href="https://buy.stripe.com/cNi7sK3JS8Z50915Me73G0d?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=picklist" rel="noopener noreferrer"&gt;$25 Quick Clean&lt;/a&gt; and get back a cleaned CSV (same-email duplicates merged, possible duplicates flagged) plus a change log within 24 hours. No CRM login needed: email us your CSV (reply to your receipt or send it to &lt;a href="mailto:slrescue@mail.grokbot.com"&gt;slrescue@mail.grokbot.com&lt;/a&gt;). Bigger list? &lt;a href="https://buy.stripe.com/9B600idksb7d2h9eiK73G03?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=picklist" rel="noopener noreferrer"&gt;Intro $99&lt;/a&gt; covers up to 500 rows, and Growth ($299, up to 2,000) and Bulk ($499, up to 5,000) are on &lt;a href="https://pureservices.store/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=picklist" rel="noopener noreferrer"&gt;pureservices.store&lt;/a&gt;. Want to check the file first? The free &lt;a href="https://pureservices.store/tools/csv-preflight?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=picklist" rel="noopener noreferrer"&gt;CSV preflight checker&lt;/a&gt; runs in your browser.&lt;/p&gt;

</description>
      <category>crm</category>
      <category>sales</category>
      <category>googlesheets</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Dates breaking your CRM import? 5 Google Sheets fixes for close dates, birthdays, and last-contacted fields</title>
      <dc:creator>Sales List Rescue</dc:creator>
      <pubDate>Sat, 24 Oct 2026 06:14:55 +0000</pubDate>
      <link>https://dev.to/saleslistrescue/dates-breaking-your-crm-import-5-google-sheets-fixes-for-close-dates-birthdays-and-2of2</link>
      <guid>https://dev.to/saleslistrescue/dates-breaking-your-crm-import-5-google-sheets-fixes-for-close-dates-birthdays-and-2of2</guid>
      <description>&lt;p&gt;A CSV that says 03/04/2026 means March 4 to HubSpot and 3 April to a European Salesforce org. Mixed date formats are the quiet reason imports "succeed" but your close dates, renewal dates, and last-contacted fields come out wrong or blank. These five Google Sheets fixes get every date into one safe format before you upload. Assume the raw date is in column D.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Find the dates that are really text
&lt;/h2&gt;

&lt;p&gt;Sheets left-aligns text and right-aligns real dates. Flag the text ones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(ISNUMBER(D2),"date","TEXT - fix me")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Convert text dates to real dates
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFERROR(DATEVALUE(TRIM(D2)),"")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Blanks in the result are the rows a human needs to look at.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Fix day/month swaps from European exports
&lt;/h2&gt;

&lt;p&gt;If the source was DD/MM/YYYY, rebuild it explicitly instead of trusting your locale:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=DATE(RIGHT(D2,4),MID(D2,4,2),LEFT(D2,2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Output ISO format for the importer
&lt;/h2&gt;

&lt;p&gt;Most CRMs accept YYYY-MM-DD without guessing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=TEXT(E2,"yyyy-mm-dd")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Catch impossible values
&lt;/h2&gt;

&lt;p&gt;Close dates in 1900, birthdays in the future, last-contacted dates after today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(OR(E2&amp;lt;DATE(2000,1,1),E2&amp;gt;TODAY()+730),"CHECK","")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run all five on a copy, filter for "TEXT", blanks, and "CHECK", fix those by hand, then import only the ISO column.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Rather hand off the cleanup?&lt;/strong&gt; Send up to 200 rows to the &lt;a href="https://buy.stripe.com/cNi7sK3JS8Z50915Me73G0d?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=dates" rel="noopener noreferrer"&gt;$25 Quick Clean&lt;/a&gt; and get back a cleaned CSV (same-email duplicates merged, possible duplicates flagged) plus a change log within 24 hours. No CRM login needed: email us your CSV (reply to your receipt or send it to &lt;a href="mailto:slrescue@mail.grokbot.com"&gt;slrescue@mail.grokbot.com&lt;/a&gt;). Bigger list? &lt;a href="https://buy.stripe.com/9B600idksb7d2h9eiK73G03?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=dates" rel="noopener noreferrer"&gt;Intro $99&lt;/a&gt; covers up to 500 rows, and Growth ($299, up to 2,000) and Bulk ($499, up to 5,000) are on &lt;a href="https://pureservices.store/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=dates" rel="noopener noreferrer"&gt;pureservices.store&lt;/a&gt;. Want to check the file first? The free &lt;a href="https://pureservices.store/tools/csv-preflight?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=dates" rel="noopener noreferrer"&gt;CSV preflight checker&lt;/a&gt; runs in your browser.&lt;/p&gt;

</description>
      <category>crm</category>
      <category>sales</category>
      <category>googlesheets</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Messy names and company fields? 6 Google Sheets fixes before your next CRM import</title>
      <dc:creator>Sales List Rescue</dc:creator>
      <pubDate>Sat, 24 Oct 2026 05:21:09 +0000</pubDate>
      <link>https://dev.to/saleslistrescue/messy-names-and-company-fields-6-google-sheets-fixes-before-your-next-crm-import-2jn3</link>
      <guid>https://dev.to/saleslistrescue/messy-names-and-company-fields-6-google-sheets-fixes-before-your-next-crm-import-2jn3</guid>
      <description>&lt;p&gt;"Hi JOHN," and "Acme Inc" next to "ACME, Inc." are the two fastest ways to look sloppy in outreach and split one account into three in your CRM. These six formulas clean name and company columns in Google Sheets before you import. Assume full name is in A and company is in C.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Fix capitalization
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;PROPER&lt;/code&gt; handles ALL CAPS and all-lowercase names in one pass.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=PROPER(TRIM(A2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spot-check names like McDonald, O'Neil, and van der Berg afterwards; no formula gets every one right.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Split full name into first and last
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;First: =IFERROR(LEFT(B2,FIND(" ",B2)-1),B2)
Last:  =IFERROR(REGEXEXTRACT(B2,"\s(\S+)$"),"")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Middle names drop out of both columns, which is usually what a CRM import wants.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Strip titles and suffixes
&lt;/h2&gt;

&lt;p&gt;Dr., Mr., Ms., Jr., III, and PhD end up in the first or last name field and break personalization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=TRIM(REGEXREPLACE(B2,"(?i)^(dr|mr|mrs|ms|prof)\.?\s+|,?\s+(jr|sr|ii|iii|phd|mba)\.?$",""))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Flag placeholder names
&lt;/h2&gt;

&lt;p&gt;Scraped and form-fill lists are full of "Test", "N/A", "asdf", and email addresses typed into the name box.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(REGEXMATCH(LOWER(B2),"^(test|n/?a|none|asdf|unknown|-)$|@"),"placeholder","")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Normalize company suffixes
&lt;/h2&gt;

&lt;p&gt;So "Acme Inc", "ACME, Inc.", and "Acme Incorporated" match as one account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=TRIM(REGEXREPLACE(PROPER(C2),"(?i),?\s+(inc|incorporated|llc|ltd|limited|corp|corporation|co|gmbh)\.?$",""))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the original column too, and import the cleaned one as a matching key rather than the display name if your legal names matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Find company duplicates
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(COUNTIF(D$2:D2,D2)&amp;gt;1,"dup company","")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Duplicate companies aren't always wrong (several contacts per account is normal), but they tell you where your CRM will create duplicate company records unless you match on domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you import
&lt;/h2&gt;

&lt;p&gt;Map first name, last name, and the cleaned company to separate CRM fields, and match companies on website domain where your CRM allows it. Name matching alone will still miss "IBM" versus "International Business Machines".&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Rather hand off the cleanup?&lt;/strong&gt; Send up to 200 rows to the &lt;a href="https://buy.stripe.com/cNi7sK3JS8Z50915Me73G0d?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=names" rel="noopener noreferrer"&gt;$25 Quick Clean&lt;/a&gt; and get back a cleaned CSV (same-email duplicates merged, possible duplicates flagged) plus a change log within 24 hours. No CRM login needed: email us your CSV (reply to your receipt or send it to &lt;a href="mailto:slrescue@mail.grokbot.com"&gt;slrescue@mail.grokbot.com&lt;/a&gt;). Bigger list? &lt;a href="https://buy.stripe.com/9B600idksb7d2h9eiK73G03?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=names" rel="noopener noreferrer"&gt;Intro $99&lt;/a&gt; covers up to 500 rows, and Growth ($299, up to 2,000) and Bulk ($499, up to 5,000) are on &lt;a href="https://pureservices.store/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=names" rel="noopener noreferrer"&gt;pureservices.store&lt;/a&gt;. Want to check the file first? The free &lt;a href="https://pureservices.store/tools/csv-preflight?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=names" rel="noopener noreferrer"&gt;CSV preflight checker&lt;/a&gt; runs in your browser.&lt;/p&gt;

</description>
      <category>crm</category>
      <category>sales</category>
      <category>googlesheets</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Cold email list bouncing? 6 Google Sheets checks before you import it into your CRM or sender</title>
      <dc:creator>Sales List Rescue</dc:creator>
      <pubDate>Sat, 24 Oct 2026 03:25:35 +0000</pubDate>
      <link>https://dev.to/saleslistrescue/cold-email-list-bouncing-6-google-sheets-checks-before-you-import-it-into-your-crm-or-sender-273b</link>
      <guid>https://dev.to/saleslistrescue/cold-email-list-bouncing-6-google-sheets-checks-before-you-import-it-into-your-crm-or-sender-273b</guid>
      <description>&lt;p&gt;High bounce rates burn your sending domain fast, and most bad addresses are visible in the spreadsheet before you ever upload. Run these six checks in Google Sheets first. Assume the email column is A.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Trim and lowercase
&lt;/h2&gt;

&lt;p&gt;Hidden spaces and mixed case create fake duplicates and failed matches.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=LOWER(TRIM(A2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Flag broken syntax
&lt;/h2&gt;

&lt;p&gt;Catches missing @, spaces inside the address, and missing domain endings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(REGEXMATCH(B2,"^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,}$"),"ok","bad syntax")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Catch common domain typos
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;gmial.com&lt;/code&gt;, &lt;code&gt;gmail.co&lt;/code&gt;, &lt;code&gt;hotmial.com&lt;/code&gt;, and &lt;code&gt;yahooo.com&lt;/code&gt; show up in every scraped list.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(REGEXMATCH(B2,"@(gmial|gmai|gnail|hotmial|yahooo)\.|@gmail\.co$"),"typo","")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix the obvious ones by hand; delete anything you can't be sure of.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Separate role addresses
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;info@&lt;/code&gt;, &lt;code&gt;sales@&lt;/code&gt;, &lt;code&gt;support@&lt;/code&gt;, and &lt;code&gt;admin@&lt;/code&gt; rarely reach a decision-maker and often trigger spam complaints.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(REGEXMATCH(B2,"^(info|sales|support|admin|contact|hello|office|team|noreply|no-reply)@"),"role","")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Remove duplicates
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(COUNTIF(B$2:B2,B2)&amp;gt;1,"duplicate","")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the first row, filter on "duplicate", and delete the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Keep personal and work addresses apart
&lt;/h2&gt;

&lt;p&gt;For B2B outreach, tag free-mail domains so you can decide whether to keep them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(REGEXMATCH(B2,"@(gmail|yahoo|hotmail|outlook|aol|icloud)\."),"free mail","work")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Then verify a sample
&lt;/h2&gt;

&lt;p&gt;Syntax checks can't tell you whether a mailbox exists. Run a small sample through your verifier of choice, and if more than a few percent fail, verify the whole list before sending.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Rather hand off the cleanup?&lt;/strong&gt; Send up to 200 rows to the &lt;a href="https://buy.stripe.com/cNi7sK3JS8Z50915Me73G0d?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=coldemail" rel="noopener noreferrer"&gt;$25 Quick Clean&lt;/a&gt; and get back a cleaned CSV (same-email duplicates merged, possible duplicates flagged) plus a change log within 24 hours. No CRM login needed: email us your CSV (reply to your receipt or send it to &lt;a href="mailto:slrescue@mail.grokbot.com"&gt;slrescue@mail.grokbot.com&lt;/a&gt;). Bigger list? &lt;a href="https://buy.stripe.com/9B600idksb7d2h9eiK73G03?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=coldemail" rel="noopener noreferrer"&gt;Intro $99&lt;/a&gt; covers up to 500 rows, and Growth ($299, up to 2,000) and Bulk ($499, up to 5,000) are on &lt;a href="https://pureservices.store/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=coldemail" rel="noopener noreferrer"&gt;pureservices.store&lt;/a&gt;. Want to check the file first? The free &lt;a href="https://pureservices.store/tools/csv-preflight?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=coldemail" rel="noopener noreferrer"&gt;CSV preflight checker&lt;/a&gt; runs in your browser.&lt;/p&gt;

</description>
      <category>crm</category>
      <category>sales</category>
      <category>googlesheets</category>
      <category>emailmarketing</category>
    </item>
    <item>
      <title>Phone numbers breaking your CRM import or dialer? 5 Google Sheets fixes for E.164 format</title>
      <dc:creator>Sales List Rescue</dc:creator>
      <pubDate>Sat, 24 Oct 2026 02:17:54 +0000</pubDate>
      <link>https://dev.to/saleslistrescue/phone-numbers-breaking-your-crm-import-or-dialer-5-google-sheets-fixes-for-e164-format-4g0c</link>
      <guid>https://dev.to/saleslistrescue/phone-numbers-breaking-your-crm-import-or-dialer-5-google-sheets-fixes-for-e164-format-4g0c</guid>
      <description>&lt;p&gt;Phone columns are the quietest way to wreck a lead list. HubSpot, Salesforce, Pipedrive, and most dialers want one consistent format, usually E.164 (&lt;code&gt;+14155550123&lt;/code&gt;). Exports give you &lt;code&gt;(415) 555-0123&lt;/code&gt;, &lt;code&gt;415.555.0123 ext 4&lt;/code&gt;, and &lt;code&gt;00 44 20 7946 0958&lt;/code&gt; in the same column. Fix it in Sheets before you import.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Strip everything that isn't a digit or a leading plus
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=REGEXREPLACE(TRIM(A2),"[^\d+]","")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Split off extensions first
&lt;/h2&gt;

&lt;p&gt;Extensions get glued onto the number once punctuation is removed. Pull them into their own column before step 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IFERROR(REGEXEXTRACT(LOWER(A2),"(?:ext\.?|x)\s*(\d+)$"),"")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and remove them from the main value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=TRIM(REGEXREPLACE(LOWER(A2),"(?:ext\.?|x)\s*\d+$",""))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Convert 00 international prefixes to +
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(LEFT(B2,2)="00","+"&amp;amp;MID(B2,3,20),B2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Add a country code where it's missing
&lt;/h2&gt;

&lt;p&gt;For a US/Canada list, a bare 10-digit number gets &lt;code&gt;+1&lt;/code&gt;; an 11-digit number starting with 1 gets &lt;code&gt;+&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(LEFT(C2,1)="+",C2,IF(LEN(C2)=10,"+1"&amp;amp;C2,IF(AND(LEN(C2)=11,LEFT(C2,1)="1"),"+"&amp;amp;C2,C2)))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use your own country's code if the list is mostly local numbers, and use the Country column when you have one.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Flag anything that still looks wrong
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(REGEXMATCH(D2,"^\+\d{8,15}$"),"ok","check")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filter on "check" and fix or blank those rows by hand. A blank phone field is better than a wrong one that your reps dial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test ten rows first
&lt;/h2&gt;

&lt;p&gt;Import ten rows, open the records, and click-to-call one. If it dials correctly, import the rest.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Rather hand off the cleanup?&lt;/strong&gt; Send up to 200 rows to the &lt;a href="https://buy.stripe.com/cNi7sK3JS8Z50915Me73G0d?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=phones" rel="noopener noreferrer"&gt;$25 Quick Clean&lt;/a&gt; and get back a cleaned CSV (same-email duplicates merged, possible duplicates flagged) plus a change log within 24 hours. No CRM login needed: email us your CSV (reply to your receipt or send it to &lt;a href="mailto:slrescue@mail.grokbot.com"&gt;slrescue@mail.grokbot.com&lt;/a&gt;). Bigger list? &lt;a href="https://buy.stripe.com/9B600idksb7d2h9eiK73G03?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=phones" rel="noopener noreferrer"&gt;Intro $99&lt;/a&gt; covers up to 500 rows, and Growth ($299, up to 2,000) and Bulk ($499, up to 5,000) are on &lt;a href="https://pureservices.store/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=phones" rel="noopener noreferrer"&gt;pureservices.store&lt;/a&gt;. Want to check the file first? The free &lt;a href="https://pureservices.store/tools/csv-preflight?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=phones" rel="noopener noreferrer"&gt;CSV preflight checker&lt;/a&gt; runs in your browser.&lt;/p&gt;

</description>
      <category>crm</category>
      <category>sales</category>
      <category>googlesheets</category>
      <category>dataquality</category>
    </item>
    <item>
      <title>Exported leads from Apollo or a scraper? 6 cleanup steps before they touch your CRM</title>
      <dc:creator>Sales List Rescue</dc:creator>
      <pubDate>Sat, 24 Oct 2026 01:24:06 +0000</pubDate>
      <link>https://dev.to/saleslistrescue/exported-leads-from-apollo-or-a-scraper-6-cleanup-steps-before-they-touch-your-crm-22gd</link>
      <guid>https://dev.to/saleslistrescue/exported-leads-from-apollo-or-a-scraper-6-cleanup-steps-before-they-touch-your-crm-22gd</guid>
      <description>&lt;p&gt;Lead exports from Apollo, ZoomInfo, LinkedIn tools, or a scraper look tidy in the preview, then make a mess the moment they hit HubSpot, Salesforce, or Pipedrive. Spend ten minutes on these six steps in Google Sheets first.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Drop the columns you will never use
&lt;/h2&gt;

&lt;p&gt;Exports often ship 40+ columns. Keep only what maps to a real CRM property: first name, last name, email, company, title, phone, website, country, and source. Every extra column is another mapping you can get wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Normalize emails and remove repeats
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=LOWER(TRIM(C2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then flag duplicates with &lt;code&gt;=COUNTIF($D$2:D2,D2)&lt;/code&gt; and keep rows where it equals 1. Run the same check against an export of your current CRM contacts so you don't re-import people you already have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=IF(COUNTIF(CRM!A:A,D2)&amp;gt;0,"already in CRM","new")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Filter out risky emails
&lt;/h2&gt;

&lt;p&gt;Remove rows marked "guessed", "unverified", or "catch-all" if your tool provides a status column. Also drop role inboxes you don't want in sequences:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=REGEXMATCH(D2,"^(info|sales|support|admin|hello|contact)@")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bounces from a bad batch hurt your sending domain far more than a smaller list does.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Fix name casing
&lt;/h2&gt;

&lt;p&gt;Exports mix &lt;code&gt;JOHN&lt;/code&gt;, &lt;code&gt;john&lt;/code&gt;, and &lt;code&gt;John&lt;/code&gt;. One formula fixes the first-name field in emails and greetings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=PROPER(TRIM(A2))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spot-check names like McDonald or O'Neil afterwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Make company names match your accounts
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Acme Inc.&lt;/code&gt;, &lt;code&gt;ACME&lt;/code&gt;, and &lt;code&gt;Acme, Inc&lt;/code&gt; become three companies in your CRM. Strip common suffixes before import so association rules can match:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=TRIM(REGEXREPLACE(PROPER(E2),"(?i),?\s*(inc|llc|ltd|corp|co)\.?$",""))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better still, match on website domain when your CRM supports it.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Tag the source and import date
&lt;/h2&gt;

&lt;p&gt;Add a &lt;code&gt;Lead Source&lt;/code&gt; column (for example "Apollo export") and an import date. When a batch turns out to be bad, you can find and remove exactly those records in one filter instead of guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test ten rows first
&lt;/h2&gt;

&lt;p&gt;Import ten rows, open a few records, and confirm every mapped field filled and no duplicate was created. Then import the rest.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Rather hand off the cleanup?&lt;/strong&gt; Send up to 200 rows to the &lt;a href="https://buy.stripe.com/cNi7sK3JS8Z50915Me73G0d?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=apollo" rel="noopener noreferrer"&gt;$25 Quick Clean&lt;/a&gt; and get back a cleaned CSV (same-email duplicates merged, possible duplicates flagged) plus a change log within 24 hours. No CRM login needed: email us your CSV (reply to your receipt or send it to &lt;a href="mailto:slrescue@mail.grokbot.com"&gt;slrescue@mail.grokbot.com&lt;/a&gt;). Bigger list? &lt;a href="https://buy.stripe.com/9B600idksb7d2h9eiK73G03?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=apollo" rel="noopener noreferrer"&gt;Intro $99&lt;/a&gt; covers up to 500 rows, and Growth ($299, up to 2,000) and Bulk ($499, up to 5,000) are on &lt;a href="https://pureservices.store/?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=apollo" rel="noopener noreferrer"&gt;pureservices.store&lt;/a&gt;. Want to check the file first? The free &lt;a href="https://pureservices.store/tools/csv-preflight?utm_source=devto&amp;amp;utm_medium=post&amp;amp;utm_campaign=quick-clean&amp;amp;utm_content=apollo" rel="noopener noreferrer"&gt;CSV preflight checker&lt;/a&gt; runs in your browser.&lt;/p&gt;

</description>
      <category>crm</category>
      <category>sales</category>
      <category>productivity</category>
      <category>dataquality</category>
    </item>
  </channel>
</rss>
