SaaS · Product-Led GrowthLifecycle & Revenue Measurement

The growth engine was working.
The architecture underneath it wasn't built to answer the questions that came next.

Apimio had built a serious growth operation — significant paid spend across Meta, TikTok, and Google Ads, a scaling trial base, healthy product engagement. The stack was modern and well-chosen. What it hadn't been designed to do was connect acquisition, product behavior, and subscription revenue into a single signal layer — the kind that lets a team answer not just "are we growing?" but "which growth is worth keeping?"

Client
Apimio
Vertical
SaaS · Product-Led Growth
Environment
Next.js · Sanity · Shopify · Stripe · Heap · ContentSquare · BigQuery
Core problem
Disconnected lifecycle — acquisition, product, and revenue measured independently with no shared signal layer
Signal environment
Three well-chosen layers with no governing connection — ad platforms, product analytics, and Stripe each accurate in isolation, none readable as a lifecycle
The architectural gap
No signal path from subscription revenue back to acquisition source — ad platforms optimizing on trial volume because that was the only signal they could receive
What changed
A unified signal layer connecting acquisition through product usage through subscription revenue — campaigns evaluated on LTV, not trial counts

The issue wasn't the stack or the team. It was that the architecture hadn't been built to connect them — and that gap only becomes visible when the questions get precise enough to need it.

A modern, well-chosen stack. Built to grow fast — not yet built to measure the growth that mattered most.

Apimio operates a headless SaaS platform. The frontend ran on Next.js and Sanity. Commerce extensions lived in Shopify. Subscriptions ran through Stripe. Product analytics sat across Heap and ContentSquare. The warehouse was BigQuery.

Each layer was chosen deliberately and worked correctly for its purpose. The issue wasn't the tools — it was that no governing signal layer had been built to connect them across the lifecycle. That's not a failure of judgment. It's the architecture gap most SaaS companies hit when the growth questions get more precise than the infrastructure was originally designed to answer.

The paid acquisition engine was spending significantly across Meta, TikTok, and Google Ads. Trials were scaling. Product engagement was healthy. Subscriptions were converting. None of those facts were connected in a way that supported a confident decision about where to spend next.

The system was doing what it was built to do. The business had started asking it to do something more.

Trials were increasing. Campaigns were scaling. Product engagement looked healthy. The growth story held together well — until the business reached the point where volume metrics weren't enough and the question became which channels were actually driving revenue, not just signups. That's a different question. It needs a different architecture to answer it.

Ad platforms were optimizing toward trial starts because that was the signal they were receiving — and they were doing exactly what they're designed to do with it. The problem is that trial starts and paid subscriptions are different events, with different economics, driven by users with different profiles. The gap between them is where acquisition efficiency actually lives. Without a signal layer that surfaces that gap, the platforms have no way to see it — and no way to optimize against what actually matters.

Product analytics showed what users did inside the platform. Stripe held the actual revenue figures. The signal layer that would have connected either of those back to an acquisition source hadn't been built. It's a common architecture state for fast-growing SaaS companies — the individual systems are sound, the connective tissue between them gets built reactively rather than by design.

Every stage of the journey was being tracked somewhere. The signal layer to connect them hadn't been built.

The data existed. Acquisition events in the ad platforms. Behavioral data in Heap and ContentSquare. Revenue events in Stripe. Downstream records in BigQuery. Each system was doing its job accurately. What hadn't been built was the governing signal layer that connected them across the full lifecycle — the architecture that would let a campaign dollar trace all the way through to a retained subscriber.

Trial signups had no persistent connection to subscription revenue events — the same user appeared twice with no shared identity across the lifecycle
Product behavior in Heap and ContentSquare was measured independently of acquisition source — no channel could be credited with what users did after signup
Stripe lifecycle events — subscription start, upgrade, churn — were not feeding into the measurement layer or back to ad platforms
Ad platforms received only shallow funnel signals — trial starts — and optimized accordingly, driving volume rather than value
BigQuery held the warehouse but couldn't reconcile acquisition, behavior, and revenue into a single lifecycle view because the upstream signal architecture didn't support it

A growth model can be genuinely working and still be unmeasurable at the precision investment decisions require. That's not a measurement failure — it's an architecture gap that only becomes visible once the business is asking more precise questions than the infrastructure was built to answer.

Building the signal layer the stack was missing — from acquisition through to revenue.

The work was framed as a lifecycle measurement problem from the start. The stack had all the components. What it needed was a governing signal layer that connects them: one the business could read from, make decisions on, and maintain as the product and stack evolved.

Lifecycle mapping
Define the full journey before touching a single tagMapped the complete user path — ad click → trial → activation → subscription → upgrade — identifying every point where signal was generated, where it stopped, and what the gap meant for downstream decisions. This became the governing document for everything that followed.
Server-side signal layer
Replace shallow browser signals with durable server-side eventsImplemented server-side GTM and Conversion APIs for Meta, Google, and TikTok. Moved conversion signals off the browser and onto the server. Match rates improved. Browser-dependency dropped. Deeper funnel events reached ad platforms reliably for the first time.
Stripe integration
Connect revenue back into the signal layerIntegrated Stripe subscription, upgrade, and churn events into the measurement architecture. Revenue lifecycle events stopped being a separate reporting universe and became part of the signal layer the business and its ad platforms could actually read.
Product analytics alignment
Connect behavior to outcomesMapped Heap and ContentSquare behavioral events to activation milestones and subscription outcomes. Product engagement stopped being a usage metric and became interpretable in terms of revenue contribution.
Warehouse truth layer
One unified view of acquisition, behavior, and revenueUnified the BigQuery data layer so marketing, product, and revenue data resolved into a single lifecycle model. The warehouse became the governed truth layer — the source the business operated from, rather than a place where fragmented signals accumulated.
Governance layer
Architecture that holds as the stack evolvesProduced a measurement blueprint covering event definitions, data flows, integration points, and validation rules. The documentation was written so the team could maintain the system without us present — not a handover deck, a working reference.

The signal layer connected. Growth decisions stopped being an argument about which number to trust.

Campaigns could be evaluated on revenue and LTV. Ad platforms started optimizing toward users who converted and retained — because that was the signal they were now receiving.

With acquisition, product behavior, and subscription revenue connected in a single governed layer, the team could trace a channel's contribution to revenue directly. CAC stopped being a marketing metric and became a business metric — understood against actual subscription revenue, not trial volume. The conversation between marketing, product, and leadership changed because all three were reading from the same source.

When questions came up about which cohort retained best, which campaign drove the highest LTV, or which activation moment predicted subscription, the warehouse truth layer had the answer without a reconciliation run. Questions that previously required a cross-functional meeting to agree on the data became single-query questions.

The growth model didn't change. The ability to measure it accurately did — and those are different problems with different solutions.

If your growth model spans acquisition, product, and revenue — your measurement layer needs to connect all three.

Most SaaS stacks have the data. The signal layer that connects it across the lifecycle is usually what's missing. The Assessment starts with your lifecycle signal flow and maps exactly where it breaks down, and why that specific break is costing you measurement precision at the level that matters for investment decisions.

Start here

The Measurement Architecture Assessment — a 30-minute call, a fixed-fee diagnostic, a clear picture of where your signal layer breaks and what to do about it.