Personalized video campaign builder for HeyGen and HubSpot

By General Input

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.

Integrations

  • HeyGen
  • HubSpot
  • Gmail

Type

App

Categories

  • Sales
  • Marketing

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.

Related prompts

Explore more prompts
Win back LiveChat visitors whose chats went unansweredTurn Mailjet email clicks into ranked HubSpot follow-upsiMessage campaign console with pre-flight checks and delivery boardA searchable RFP answer library your bid team drafts fromSee which target accounts just started advertising on LinkedInAccount health board that puts product usage next to your CRMLook up a customer's full chat history mid conversationChase the paperwork every new client and vendor still owesLusha prospecting workbench with credit-safe revealsWhich companies your LinkedIn ads reach, matched to your CRM