Taking engineering out of the campaign loop
The bottleneck at the demand gen layer was not technical difficulty. It was that every campaign asset — a landing page, an email, a variant of either — had to pass through an engineer, and engineers are a shared resource with a queue. The cost showed up in what the marketing team stopped attempting: when a second variant means waiting behind a sprint, you ship one variant and call it a test.
Challenge
Marketing operations could not launch a campaign without engineering. Every landing page and every email started as a ticket, which meant the pace of demand gen was set by an engineering queue rather than by the campaign calendar. Testing suffered first: when a variant costs a sprint slot, teams stop running variants.
Solution
I rebuilt the demand gen surface on go.pendo.io as a template system rather than a page factory. Marketo guided landing page templates and email templates were broken into modules marketing ops could assemble on their own, with custom JavaScript underneath for the behavior the templates could not express — form logic that filtered non-company email addresses at the point of entry, and Google Tag Manager data layer scripts that made every page report itself consistently. Mutiny sat on top for audience-segmented testing and personalization.
Outcome
Marketing ops stopped filing tickets to launch. Campaigns, variants, and audience-specific treatments shipped on the marketing team's own schedule, and the data coming back was clean enough to act on because the tracking was part of the template rather than added per page.
The build
So the work was to change who could build. I broke the Marketo guided landing page templates and the email templates into modules — hero, form, proof, offer, footer — that marketing ops could compose without touching markup. The constraint was that the modules had to be genuinely complete: a template system that covers only the easy cases still routes every interesting campaign back through engineering, which is the same bottleneck with extra steps.
Underneath the templates, custom JavaScript handled the things guided templates cannot express on their own. Form logic filtered out non-company email addresses at the point of submission, so the lead quality problem was solved at the source rather than in a downstream cleanup job. Google Tag Manager data layer scripts standardized what each page reported, which meant a campaign was instrumented because it used the template, not because someone remembered to instrument it.
That is the part that makes the loop work. Analytics hygiene is usually treated as a reporting problem, handled after the fact by the people who need the numbers. Building it into the template moves it upstream: every page emits the same events with the same names, so comparisons between campaigns are actually comparisons, and the funnel view is trustworthy without reconciliation.
With the build cost removed and the measurement trustworthy, testing became routine rather than exceptional. Mutiny handled audience segmentation and personalization on top of the same templates, so demand gen could run a treatment for a specific segment and read the result against a clean baseline. The team could form a hypothesis in the morning and have it live without a ticket.
The systems I build for marketing get judged on one thing: how long the team operates after I stop being involved. On the demand gen side at Pendo, the answer was that campaign launches simply stopped appearing in the engineering queue.


Built with
- Marketo
- Mutiny
- Google Tag Manager
- Segment
- JavaScript