BRCG Case Study

6× more demo bookings. Personalized at HubSpot scale.
Owner.com's outbound team needed personalized images at HubSpot's scale, thousands of prospects, each with a chart pulled from their own market data. HubSpot couldn't reach external APIs at send time. So we built a three-layer rendering engine that pre-bakes the personalization upstream and lets HubSpot send a single static URL that looks bespoke to every recipient.
6×
Demo bookings in the first quarter
<2s
Render time per unique image
3
Rendering layers behind one URL
0
HubSpot API calls at send time
The Challenge
HubSpot can't call external APIs.
Owner.com is the all-in-one platform for independent restaurants. Their outbound team needed email that proved Owner already understood an operator's market, menu, and delivery competition before the first reply. But traditional personalization stops at merge tags. You can insert a first name, you can't fetch live data or render a competitor comparison, and HubSpot can't make a single external API call to get it.
Merge tags hit a ceiling
Standard personalization stops at a first name. Owner.com needed each email to show a live competitor map, a real-time business score, and a brand preview, none of which a merge tag can render.
HubSpot can't reach out
HubSpot cannot make external API calls at send time. So live business data could not be fetched inside the email itself, ruling out the obvious approach.
Personalized at scale
The outbound team was reaching thousands of restaurant operators. Every prospect needed a unique render built from their own market data, generated fast enough to send at volume.
Our Approach
Move the work upstream.
We split the job into three layers, each owning one task and handing off cleanly to the next. HubSpot never fetches anything. It sends a signed URL that resolves to an image already built from the recipient's own data.
Layer 1 · Owner.com APIs
Rich per-business data pulled from Owner.com's REST APIs as the input to every render.
- Business profile: branding images, logo, map
- Competitor analysis: local competitors, ratings, gaps
- Performance metrics and business scores
- Static CDN assets served from static-content.owner.com
Layer 2 · Rendering engine
The bridge between raw data and a finished image. Fetch, merge, render server-side, rasterize.
- Merge brand_id and pipeline_id per recipient
- Server-side HTML rendered with Tailwind CSS
- Alpine.js for template interactivity before capture
- MD5-signed URLs to block unauthorized image requests
Layer 3 · OpenGraphImage delivery
Final-mile optimization and delivery so the image lands cleanly in any inbox.
- Web crop and email-safe formatting for email clients
- Automatic compression and screenshot optimization
- Global CDN hosting with image caching
- Mobile and desktop device scaling
The handoff to HubSpot
HubSpot never fetches anything. It sends one static URL that resolves to a bespoke image.
- HubSpot merge tags become URL parameters at send time
- One signed image URL per recipient
- A unique render returned in under two seconds
- Zero HubSpot API calls
The Result
Demo bookings, up 6×.
Demo bookings
6×
The three-layer engine renders a unique image for every recipient in under two seconds, each with real competitor data, business scores, and a restaurant preview. Zero HubSpot API calls at send time. Owner.com's outbound went from merge-tag emails to renders prospects actually cared about, and demo bookings rose 6× in the first quarter.
Proof of Work
What the engine renders.
Real renders from live Owner.com API data for Fleurie in Charlottesville, VA. In production, every email carries a freshly generated image like these, pulled per recipient in under two seconds.
Click to enlargePerformance overview
Live business metrics and a visual score, rendered per recipient from Owner.com data. Fleurie, Charlottesville VA.
Click to enlargeCompetitor leaderboard
Local competitors ranked with rating comparisons, generated at send time.
Click to enlargeCompetitor map
Nearby competitors on an interactive map, rasterized to an email-safe image.
Click to enlargeTop strengths
Personalized insight cards surfacing where the restaurant already wins.
Click to enlargeRecent brand images
Brand photography pulled from the business's own CDN assets.
From the BRCG Team
“HubSpot couldn't call an API at send time, so we moved the personalization upstream. Every prospect got an image rendered from their own market data off a single static URL, and demos ran 6× in the first quarter.”

Kodie Critzer
Founder & CEO, BRCG · Ran the Owner.com engagement
Stack
FAQ
Questions, answered.
What did BRCG build for Owner.com?
BRCG built a three-layer rendering engine that generates a unique, data-driven image for every outbound email. Owner.com's HubSpot merge tags become URL parameters that resolve to a server-rendered image built from live business data, so each prospect sees their own competitor map, performance score, and brand preview.
Why couldn't HubSpot do this on its own?
HubSpot can't make external API calls at send time, so it can't fetch live data or render custom visuals inside an email. We pre-bake the personalization upstream and hand HubSpot a single signed image URL, which keeps HubSpot API calls at zero.
What results did Owner.com see?
Demo bookings increased 6x in the first quarter after switching from merge-tag emails to hyper-personalized renders. Each image is generated in under two seconds from the recipient's own market data.
What platforms did the engagement use?
Owner.com's REST APIs for business and competitor data, a custom server-side rendering engine built with Tailwind CSS and Alpine.js, OpenGraphImage.com for email-safe delivery over a global CDN, and HubSpot for the sends.
More Work
Related case studies.
Want dynamic personalization for your platform?
Let's talk about how BRCG builds API integrations and custom rendering engines that work around platform limitations.
Book a growth call

