Approve every cold outbound list before a single email sends

Stage every prospect batch in one grid, see who is already a customer or has an open deal, and enroll only the rows you approve.

App
LeadsForgeHubSpotGoogle SheetsSalesLead EnrichmentEmail Automation
PromptCreate

Build me a staging desk for cold outbound where I approve a prospect list before a single email goes out. Bad rows in a cold sequence burn a sending domain and embarrass us in front of customers, so nothing reaches a sequence until I have looked at the batch and ticked the rows myself.

Batch intake, two ways. On a New batch screen I either pull people I already have or paste in a fresh list. Path one uses LeadsForge List Contacts with its tag and validation status filters, so I can stage, for example, every contact tagged saas-uk whose validation status is valid. Path two uses Google Sheets Get Values against a spreadsheet ID and an A1 range I supply, then lets me map the sheet columns onto email, first name, last name, company and job title before importing. Either path creates a named batch stored in the app with its rows, its source, and the filters or range it came from.

The review grid is the heart of the app. Every staged row shows the contact's validation status and tags from LeadsForge, using Get Contact to fill in detail on a row when I expand it. Alongside that, run a live check against our CRM: HubSpot Search Contacts by email address, and HubSpot Search Deals for deals associated with any contact that matches. Classify each row into one of three states and show it as a clear badge: Existing customer, Open deal, or Net new. When there is a match, show me which HubSpot record it hit and the deal name and stage, so the classification is never a mystery. Cache the CRM verdict on the row with the time it was checked, and give me a Recheck CRM action on both a single row and the whole batch.

Make the CRM conflict a hard block, not a soft warning. Rows classified as Existing customer or Open deal cannot be ticked for enrollment. Their checkbox is visibly disabled with the reason attached rather than hidden from the grid, because I still want to see who got caught. The only way past it is to change the blocking rule on a Settings page, which is deliberate friction. Never enroll a person who already has an open HubSpot deal or is an existing customer.

Give the grid a Screen this batch button that starts a background agent. The agent reads my written ICP definition, which lives as an editable block of text on a Settings page, and works down the staged rows one at a time. For each row it decides on profile or off profile and writes a one line reason back onto the row, things like wrong seniority, free mail domain, or an account someone is already working. It can call LeadsForge Get Contact for fuller detail on a person, and HubSpot Search Contacts and Search Deals to see whether a rep is already engaged with that account. Its verdict, reason and run time land on the row so the grid can display and sort by them. Rows it flags off profile get automatically unticked but stay visible, and I can always tick one back on if I disagree. Show progress while it runs, since a big batch takes a while.

Then I enroll. After I have unticked what I do not want, an Enroll approved rows action opens a confirmation step. I pick the destination sequence from a list built with LeadsForge List Sequences, and before I confirm you show me what that sequence already holds using Get Sequence Contact Count, how many rows I am about to add, and the resulting total, compared against a capacity ceiling I set per sequence. If the batch would push the sequence past that ceiling, say so plainly and make me acknowledge it, so I can see I am not oversubscribing a sequence beyond what my sending capacity can carry.

Route the enrollment by what each row actually is. Rows that already exist as LeadsForge contacts go in with Assign Contacts To Sequence. New people from a spreadsheet go in with Bulk Create Contacts in chunks of at most 100 per call, which is the documented cap, followed by Assign Contacts To Sequence. Use Create Contact for a one-off single addition, and Import Lead Into Sequence when I want create and enroll handled in a single step for an individual row. Show per chunk progress and finish with a summary of how many were enrolled, skipped and failed, keeping any failures on the batch so I can retry just those.

One important constraint to respect. LeadsForge exposes validation status only as a read filter on List Contacts. There is no documented operation to run a validation job or to add someone to a do-not-contact list, so the app displays and filters on validation status but must never claim to verify addresses itself and must not offer a do-not-contact action. Rows with no validation status stay visible and filterable rather than being silently dropped or shown as safe.

Persist batches with their name, source, creation date and status of staging, screened or enrolled. Persist each row with its contact fields, validation status, tags, CRM classification and matched record, the agent verdict and reason, and my approval tick. Persist the ICP text and the per sequence capacity ceilings. Keep a history of past batches so I can look back at exactly which rows I approved, which the agent flagged, and which sequence they went into.

What does this prompt do?

  • Build a batch two ways: pull people you already have in LeadsForge using its tag and validation filters, or read a fresh list straight out of a Google Sheet.
  • Every staged row shows its validation status and tags next to a live check of your HubSpot CRM, so you can see at a glance who is already a customer, who has an open deal, and who is genuinely net new.
  • Press Screen this batch and a background assistant reads your written ideal customer profile, works row by row, and writes a one line reason onto anything off profile, like wrong seniority, a free mail address, or an account someone is already working.
  • Uncheck what you do not want, then load only the approved rows into the sequence you pick, with that sequence's current size on screen so you never oversubscribe your sending capacity.

What do I need to use this?

  • A LeadsForge account holding the contacts and sequences you send from
  • A HubSpot login so the app can check who is already a customer and who has an open deal
  • A Google account if you want to build batches from a spreadsheet
  • A written description of your ideal customer, pasted into the app once and edited whenever it changes

How can I customize it?

  • Rewrite the ideal customer profile at any time. The screening assistant uses whatever is saved the moment you press the button.
  • Set a capacity ceiling per sequence so the app warns you before a batch pushes a sequence past what your mailboxes can comfortably carry.
  • Change the default intake filters, such as which tags and validation statuses pull into a new batch.
  • Redefine what counts as a blocking CRM match, for example whether a long stalled deal should still stop someone from being enrolled.

FAQs

Does this verify whether an email address is real?
No, and it does not pretend to. The app shows the validation status LeadsForge already holds against each contact and lets you filter on it, so you can stage only validated people if you want. It never runs its own verification job, so an address that has never been checked shows up as exactly that rather than being quietly marked safe.
What stops someone from cold emailing an existing customer?
Any row that matches an existing customer or an open deal in your HubSpot CRM is blocked by default and cannot be ticked for enrollment. It is a hard block rather than a warning you can click past, so a cold sequence never lands in the inbox of an account your team is already winning.
Can I build a batch from a spreadsheet instead of LeadsForge?
Yes. Point the app at a Google Sheet and the range you want, map the columns to name, email, company and title, and every row is staged for review exactly like a batch pulled from LeadsForge.
How large a list can I stage at once?
Large batches are loaded and enrolled in chunks behind the scenes, so a few thousand rows is comfortable. The screening pass takes longer on bigger batches because the assistant reads every row individually, and it runs in the background so you can keep working.
Do I have to use the screening assistant?
No. It is one button, not a gate. You can review the grid, untick the rows you do not want and enroll entirely by hand. The assistant is there for the batches too big to read carefully yourself.

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 launching cold sequences on a list nobody checked.

Stage the batch, see the CRM conflicts, and approve every row before a single email leaves your domain.