RL
Senior Web Platform Engineer
RLRodney L. Lewis
All case studies

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 campaign path before and after the template system, and where engineering sat in itTwo chains of four boxes, drawn at the same positions so they can be compared. The upper chain, labelled “Before: engineering gated”, runs Marketing ops, Engineering, Landing page, Marketo, with Engineering shown as a solid grey box marking it as the bottleneck. The lower chain, labelled “Built: no ticket required”, runs Marketing ops, Modules, Landing page, Marketo. Engineering is absent from the chain, with an unbroken tracking bar beneath it and a single return arrow labelled “test, read, iterate” running from Marketo back to Marketing ops.Before: engineering gatedMarketing opsEngineeringLanding pageMarketoBuilt: no ticket requiredMarketing opsModulesLanding pageMarketotest, read, iterate
Above, every campaign asset passes through engineering, and instrumentation is added page by page, so it is only as complete as whoever remembered it. Below, marketing ops composes from template modules and the tracking comes with the template, which is what makes the return arrow worth having: a hypothesis can be formed, shipped, and read against a clean baseline without a ticket.

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.

Archived screenshot of a Pendo demo-request landing page with no site navigation: a heading and paragraph on the left above a three-column statistics row and a row of four customer logos, and a five-field form card with a consent checkbox and submit button on the right.
A demand gen landing page on go.pendo.io, October 2022. The statistics row, logo row and form are template modules, not page markup. Note that the figures shown are Pendo's own product claims from the campaign, not measurements of this work.
Archived screenshot of an earlier, teal-accented Pendo demo-request landing page: a heading and paragraph on the left, a five-field form card headed "Get started today!" on the right, and below them a two-column section pairing a diagram with a heading and paragraph.
The prior-generation template, December 2022, shown for contrast. Two landing page systems running side by side is the condition the module set was built to consolidate.

Built with

  • Marketo
  • Mutiny
  • Google Tag Manager
  • Segment
  • JavaScript
Contact

If you're hiring a platform owner, let's talk.

Currently open to senior roles owning marketing web platforms, Bay Area or remote. I reply within one business day.

Reach out

Other ways to connect