⟨ BLOGPLAYBOOKSAUDIENCES & AD TARGETING

Closed-lost HubSpot contacts → Meta custom audience for winback

Every HubSpot contact on a closed-lost deal from the last 12 months, minus current customers, becomes Meta custom audience <name> on your connected ad account, match rate reported.

PlaybookHubSpotAudiencesMeta AdsRUN BY THE AUDIENCE AGENT →

The problem this solves

A deal marked closed-lost in March is a warm contact by autumn. The evaluation happened, the champion knows your product, and the reason recorded on the deal, budget, timing, a competitor, is usually a reason that expires. Most teams never go back to those contacts because the list lives across hundreds of deal records in HubSpot, and nobody wants to export it by hand every quarter.

The risk in a winback audience is who ends up inside it. A contact whose company later bought through a different deal is a customer now, and paying to show them winback ad copy is wasted budget and an awkward conversation for the account owner. The suppression has to happen against the CRM as it is today, before anything reaches the ad account.

This playbook pulls the closed-lost contacts from the last 12 months, removes current customers, and creates a Meta custom audience called <name> on your connected Meta Ads account, with the match rate reported once Meta finishes processing.

How the mission runs

  1. Pull closed-lost deals and their contacts from HubSpot. The Audience Agent queries HubSpot for deals in a closed-lost stage with a close date inside the last 12 months, then follows the deal-to-contact associations to collect every person attached. Each row keeps the deal name, close date, amount and closed-lost reason, so the audience can be split later by why the deal was lost.
  2. Suppress current customers and open opportunities. Any contact whose company holds a customer lifecycle stage or a closed-won deal is removed, and so is anyone attached to a deal that is open right now, since those belong to sales rather than paid. The counts removed at each step are shown before anything moves on.
  3. Normalize and hash for Meta. Email, phone, first name, last name, city, state, zip and country are each normalized the way Meta documents, lowercased and trimmed with phone numbers in international format, then hashed before upload. Sending several keys per person raises the chance of a match beyond what email alone achieves, and the plaintext stays in the workspace.
  4. Stage the audience <name> for approval. The agent presents the audience name, the ad account it will be created on, the number of contacts going in, the number removed as customers or open opportunities, and a sample of rows. Nothing is created on the connected Meta Ads account until you approve.
  5. Create, wait for processing, and report the match rate. After approval the custom audience is created, and the agent checks back until Meta finishes matching. It then reports the audience size and the match rate as the platform states them, alongside the counts from every earlier step, so a low match rate can be traced to its cause, usually old emails from long-lost deals.

The prompt

This is the exact objective the agent receives. Swap the obvious placeholders for your own domain, segment or channel and run it as-is from the console, Slack, or the API.

⟨ THE MISSION PROMPT · PASTE AND RUN ⟩

Pull every HubSpot contact on a deal marked closed-lost in the last 12 months, remove current customers, and create a Meta custom audience called <name> on my connected ad account for a winback campaign, reporting the match rate when it is ready.

What comes back

A Meta custom audience named <name> on your connected Meta Ads account, built from every contact on a closed-lost deal in the last 12 months with current customers and open opportunities removed. The mission result carries the counts at each step, the closed-lost reasons represented in the audience, the match rate and size as Meta reported them, and the audience id ready for a winback campaign.

Make it yours

  • Split the audience by closed-lost reason, one for pricing and one for timing, so the ad copy for each group speaks to the objection recorded on the deal.
  • Restrict to deals above a certain amount, or to a single pipeline, when the winback budget should chase the largest lost opportunities first.
  • Build the same audience on Reddit Ads or LinkedIn Ads in the same run, and receive every match rate in one summary.
  • Add a HubSpot write-back that tags each contact with a winback-audience property, staged for approval, so reps can see who is being reached.

Frequently asked questions

How does the agent decide who is a current customer?

It uses your HubSpot data as it stands: the customer lifecycle stage on the contact or company, and any closed-won deal associated with the company. If your team marks customers differently, name the property in the prompt and the agent uses that instead.

What about a contact attached to several lost deals?

They appear once. The agent deduplicates on email and keeps the most recent deal's close date and reason on the row, so the audience counts people rather than deal records.

Why might the match rate be low?

Winback audiences skew old, and people change employers and email addresses. Adding phone numbers and names to the upload lifts matching, and running email verification or the Enrichment Agent before the push replaces dead addresses with current ones.

Does anything change in HubSpot?

As written, HubSpot is only read. Any write-back, such as a property on each contact, is staged for approval as a separate step.

Go deeper

⟨ RUN IT INSTEAD OF READING IT ⟩

This mission runs minutes after signup.

Open a workspace, paste the prompt, and the Audience Agent carries it end to end on your plan's monthly credits - evidence attached.

⟨ RELATED PLAYBOOKS ⟩