Context
RizenEstate sells live-transferred buyer and seller appointments to real-estate teams and brokerages across the U.S. They run Meta ads in each team's market, an inside sales team calls every lead, and the agent gets a live transfer of a buyer or seller who is ready to talk.
Every new client team needs the same three things, fast: ads for their city and price point, a CRM set up to catch the leads, and campaigns that go live without a wiring mistake. In August 2026 each video was cut by hand in CapCut, and the brief for a new client was five images and five videos. With new teams signing every week, hand-editing could not keep up.

The Challenge
- Volume. Every team needs its own creative: their city, their price band, houses that look like their market. Dozens of teams at ten ads each, refreshed whenever ads tire.
- Accuracy at speed. A wrong price on screen or a misspelled city costs money the moment it goes live. Editing by hand at this volume makes those mistakes a matter of time.
- Launch risk. Campaigns, CRM workflows and conversion tracking were configured by hand for each client, and every manual step is a chance to wire something wrong.
What I Built
The video engine. A Python pipeline that replaced the CapCut edit. A market file (city, price band) and a script template go in. It generates the voiceover with ElevenLabs, picks b-roll that matches the market's price band, draws the captions, and assembles the cut with ffmpeg. A 58-second ad renders in about 30 seconds. By October it held 34 script templates and had voiced 54 markets, with Higgsfield image-to-video adding generated b-roll to the library.

Image ads from masters. The first image ads were HTML templates rendered by headless Chrome. From mid-August each design became a master poster that a script re-cuts per market through an image-edit model, swapping the city, the neighborhoods and the price, so one master serves dozens of markets.

Three designs, six markets. The city and price change per market; the design is never redrawn by hand.
Campaign automation. Scripts on the Meta Marketing API build each client's lead campaign from a blueprint. Every campaign is created paused, then read back and checked against the blueprint before anyone switches it on. The first campaign was built through the API on August 19, paused; the first client campaign followed the next night.
CRM onboarding. About 130 scripts, roughly half of them against the GoHighLevel API: setting up a new client, copying the conversion-tracking (CAPI) workflows, adding form notifications, and moving clients between sub-accounts with a backup taken first. On August 18 the conversion-tracking workflows were installed and verified in 27 of 27 sub-accounts. Between September 25 and October 13, 22 client accounts moved onto one shared sub-account, each with its own backup file.
The dialer. RizenEstate's inside sales team calls every lead from their own dialer, a React app on Supabase and Twilio. I've shipped about 60 merged changes to it: faster stats, the team-line "press 1" flow, the hold message, a never-dial list that protects internal and client numbers, caller-number rotation, and callback fixes.
Ledger, reporting and audits. A live-transfer ledger that charges exactly one credit per lead, reconciled for 37 of 37 clients. A nightly job that posts each day's KPIs to the team's ClickUp. Routing audits that found four lead forms no automation was listening to, and recovered the 95 leads waiting in them in a single day.
I build with Claude Code as my pair: I design each system, direct the sessions, review the changes and ship them.
The Output

684 finished ads between August 3 and October 17, 2026: 393 videos and 291 images for more than 40 agent teams. Counted from the delivery folders, with duplicates removed. The first five weeks carried the load, about 112 ads a week while the client roster filled up. After that, proven winners were reused instead of rebuilt, and new creative tracked what new markets needed.
The ads also got cheaper to run. In August, campaigns launched from August 2 onward averaged a cost per lead about 20% lower than the campaigns before them, across the agency's ad accounts. Not all of that is mine, since markets and budgets moved too. In one ad account's August data, video, the pipeline's main output, came in at less than half the cost per lead of image ads.
Timeline
- August 3, 2026. First pipeline-rendered video ads delivered.
- Week of August 10. The busiest week: 188 finished ads.
- August 18. Conversion-tracking workflows verified in 27 of 27 sub-accounts.
- August 19. First campaign built through the Marketing API, paused; the first client campaign followed the next night.
- September 22 – October 16. About 60 merged changes to the live dialer.
- September 25 – October 13. 22 client accounts moved onto one shared sub-account, each backed up first.
- October 2026. Ongoing: nightly KPI reporting, the ledger, and the dialer.
What I'd repeat
Turn the work into a file. Once a market is a file and a design is a template, the hundredth ad takes the same effort as the first. That is the whole difference between ten ads per client and 188 in a week.
Paused by default, verified by read-back. Nothing a script builds goes live until a second script has read it back and compared it to what it was meant to be. It is a dull rule, and it is why automation can touch real ad accounts without anyone holding their breath.

