Personalized video campaign builder for HeyGen and HubSpot

Build a batch of personalized sales videos from a HubSpot list, review every script before it renders, then send each one and log the touch.

App
HeyGenHubSpotGmailSalesMarketingContent GenerationEmail Automation
PromptCreate

I want an app my sales team opens to run personalized video campaigns, instead of rendering one video at a time by hand. The main surface is a campaign builder where a rep picks a video template, pulls a target list out of our CRM, reviews the exact script each person will hear, and then renders and sends the whole batch from one screen.

The landing view is a simple list of saved campaigns showing the campaign name, the template it uses, how many rows it has, how many videos have rendered, how many have been sent, and when it was last opened. From there a rep opens an existing campaign or starts a new one.

Building a campaign starts with the template. Load my HeyGen templates with List Templates and show them as a pickable list. When one is selected, call Retrieve Template Details to read its variable definitions and scenes, and display every variable that template exposes, since those variables are what the rest of the builder maps onto.

Next, build the audience. Use HubSpot Search Contacts with filters the rep sets in the UI: lifecycle stage, contact owner, last activity date, and free text search. Show the matching contacts as rows in a table. Use HubSpot List Owners to resolve each contact's owner into a name and an email address, so the app knows which rep owns each row and can send from them later.

Then map HubSpot fields onto the template variables. Give the rep a mapping panel where each template variable is bound either to a HubSpot contact property, such as first name, company, or job title, or to a static value that is the same for everyone. Every row must preview the fully resolved script exactly as it will be spoken, so a rep reads the real text before spending a render. Rows with an unmapped or empty required variable should be flagged and excluded from generation until they are fixed.

Each row has a Personalize with agent button. Pressing it kicks off a background agent for that single contact. The agent reads that contact's HubSpot properties with Get Contact, including job title, company, lifecycle stage, lead status, last activity date and any other populated properties, and rewrites the custom line variable for that person in our voice, keeping it to roughly one or two sentences. It writes the result back into that row. The row shows a pending state while the agent runs and fills in with the new line when it finishes, and the rep can freely edit the text afterward. The agent only proposes copy, it never renders anything itself. Reps can run it on one row, on selected rows, or on the whole list, and each row's agent run is independent so one failure does not block the others.

Pressing Generate sends only the approved rows to HeyGen Generate Video from Template, one call per row, and stores the returned video id on the row. Cap how many renders are in flight at once. Make the cap configurable and default it to a small number, because HeyGen limits concurrent renders per plan. Queue the remaining rows and start them as earlier renders finish, so a large campaign drains safely instead of erroring out.

After Generate, the screen becomes a live render queue. Poll Retrieve Video Status / Details for each in-flight video id every five to ten seconds and show each row's state as queued, processing, completed, or failed. Renders typically take between thirty seconds and three minutes. As a video completes, show its thumbnail in the row and call Retrieve Shareable Video URL to get a share link for it. Show failed rows with the error message HeyGen returned, and give each failed row its own Retry button that re-renders just that row, without re-running the campaign or touching rows that already succeeded.

From the finished list, a rep can send each video. Sending uses Gmail Send a Message from the mailbox of the rep who owns that contact, with an editable subject and body that includes the share link and a default template the rep can change. After a successful send, log the touch on the contact with HubSpot Create Note associated to that contact, recording which template was used and the link that was sent. Show the send state and the note state on each row so nobody double sends to the same person.

Persist campaigns so a rep can leave and come back later: the selected template, the filters, the variable mapping, the rows with their personalized copy, and each row's video id, render state, send state, and note state. Do not cache HeyGen video URLs, thumbnail URLs, or share links, because HeyGen expires all of them after seven days. Store only the video id, and refetch the video status and the share URL every time a campaign is opened, so the links on screen are always live.

Several reps use this app, so show who created each campaign, and default the audience filter to the current rep's own contacts while still letting them widen it to the whole team.

What does this prompt do?

  • Pick one of your saved HeyGen video templates and see exactly which lines of the script change from person to person.
  • Pull a target list out of HubSpot using filters like lifecycle stage, contact owner, or last activity date, and match contact details to the parts of the script that change, so every row previews the real text that will be spoken.
  • Hit Personalize on any row to put an AI assistant to work rewriting that one person's custom line from their CRM record, then edit what it wrote before anything renders.
  • Watch the whole batch render live with thumbnails as they land, then email each finished video from the rep who owns the contact and log the touch on their record automatically.

What do I need to use this?

  • A HeyGen account on a paid plan with at least one video template saved
  • A HubSpot login with your contacts and contact owners set up
  • A Gmail account for each rep who will be sending videos

How can I customize it?

  • Change the contact filters that build your target list, such as lifecycle stage, owner, last activity date, or any property you already use
  • Set how many videos render at the same time so you stay inside the limit on your HeyGen plan
  • Adjust the tone and length the personalization assistant writes to, and edit the email that goes out alongside each video

FAQs

Do I have to approve every script before a video renders?
Yes. The builder shows you the fully resolved script for every person on the list, and you can edit any line by hand. Nothing is sent to HeyGen until you press Generate, so you never spend a render on copy you have not read.
What happens if one video fails to render?
That row stays in the queue marked as failed with the reason HeyGen gave, and it gets its own Retry button. You fix or retry just that one person without re-running the campaign or re-rendering anyone who already succeeded.
Why does the app fetch the video links fresh each time instead of saving them?
HeyGen expires video, thumbnail, and share links after seven days. The app saves the video itself rather than the link, and pulls a current link every time you open a campaign, so a link you hand to a customer is never a dead one.
Can my whole sales team work out of the same app?
Yes. Campaigns are saved and shared, and each video is emailed from the mailbox of the rep who owns that contact in HubSpot, so the message lands from a familiar name rather than a shared inbox.
Will this work on a free HubSpot account?
The contact list and the note logging work on HubSpot's free tier. The video rendering side is what needs a paid HeyGen plan, since template rendering and API access are not part of the free HeyGen tier.

Related templates

Client-by-client cold email pipeline review for agencies

Pick a client and a date range to see sent, replies, meetings booked and the real deal value your cold email produced, campaign by campaign.

Instantly
HubSpot
Slack Bot
App
Partner tier review board for quarterly promotion calls

Work every partner tier decision from one board, with the revenue and commission numbers, clear promotion thresholds, and AI review briefs.

Introw
HubSpot
Slack
App
Reconcile partner commissions between HubSpot and Introw

Open one board at month end to find every closed deal missing a commission, every commission with no deal behind it, and every amount that does not add up.

Introw
HubSpot
Slack
App
Hiring signal board for your customers and open pipeline

Open one board each morning to see which of your accounts are hiring, what they are building, and where your product fits the roles they just opened.

JobsPipe
HubSpot
App
Run your nutrition clients' weekly meal plans from one console

See who is due, build a week of dinners on demand, swap anything you do not like, then send the recipe and grocery links yourself.

Instacart
Airtable
Gmail
App
Placement pricing desk for recruiting and staffing agencies

Open a live deal, see the market pay range for that role and city, set your markup, and write the agreed numbers straight back onto the deal.

Job Salary Data
HubSpot
App

Stop rendering sales videos one at a time.

Build the whole campaign, read every script before you spend a render, and send the batch from a single screen.