Full-Funnel Attribution for eCommerce: How We Connected Paid Ads, Form Submissions, CRM Data, and Closed Deals Into One Reporting Layer

Full-Funnel Attribution for eCommerce: How We Connected Paid Ads, Form Submissions, CRM Data, and Closed Deals Into One Reporting Layer

Vanja K.
Vanja K.
April 28, 2026
13 min read

Every marketing team knows what its ad spend is. Very few know what it actually produces beyond a click or a purchase. The gap in the middle, the leads who submit a form, enter a sales process, and eventually convert weeks later, is where most attribution strategies completely fall apart. We built a system for one of our eCommerce clients that closes that gap entirely, using tools they already had, and the architecture is replicable for any business running a CRM alongside an online store.

The Attribution Wall Nobody Wants to Talk About

Here is the standard situation for a growing eCommerce business with a sales component. A prospect clicks a targeted Google CPC ad, lands on the website, browses your store for a while, and fills out a contact form instead of buying directly. That form submission fires a confirmation, the lead lands in a CRM, and a sales rep takes over. The marketing platform records a conversion event. Everyone moves on.

What nobody records is the connection between that specific Google campaign, that specific keyword, that specific ad creative, and the deal that closed three weeks later when the rep finally got the prospect on a call. The CRM has the deal. Google Ads has the click data. There is nothing linking them. If a campaign drives a hundred qualified leads and every one of them eventually closes, but the attribution window expired before the deals did, did that campaign even work? Like the tree falling in the forest with nobody around to hear it, the revenue happened, but as far as your reporting is concerned, it made no sound. The marketer does not know. The sales rep does not know. The manager pulling the budget does not know. Everyone is staring at their own slice of data, completely disconnected from everyone else’s, and the only honest response any of them can give is the same one Detective McNulty muttered to himself in a Baltimore field office, some ball lost in tall grass shit unit: “What the f*** did I do?” And in this case, everybody but him knows what happened. When the client asks which campaigns are actually driving revenue and not just traffic, the honest answer, without a system like this, is that nobody knows.

The problem compounds across channels. Organic search, social campaigns, influencer partnerships tracked through custom codes, referral traffic; all of these produce leads that behave the same way. They fill out a form. They enter the sales process. They either close or they do not. And at no point does the marketing data and the sales data speak to each other. Budgeting decisions get made on assumptions. Campaigns get cut based on last-click attribution that misrepresents how demand was actually built. Good channels get defunded because their contribution only becomes visible weeks after the original touchpoint, long after the attribution window closed.

What We Were Working With

Our client runs a WooCommerce-based automotive aftermarket store. The product catalog is deep, the purchase decisions are rarely impulse buys, and the customer questions before buying are relentless in the best possible way. Will this fit my specific build? Will installing this void my OEM warranty? Can I still run my stock tires? Is this street legal in my region? Can I track this on a closed circuit? Over 60% of visitors were not clicking “add to cart” on first contact. They were filling out a contact form to get answers before committing, which is completely rational behavior for a high-consideration purchase, and exactly the kind of lead flow that breaks standard eCommerce attribution models.

For lead capture, they were using Contact Form 7, though everything we built here works with any form system, whether that is Gravity Forms, Typeform, a custom-built form, or a native checkout inquiry field. On the CRM side, they were running Close.com, but the architecture is CRM-agnostic. We can implement the same approach with HubSpot, Salesforce, Pipedrive, and others. If the CRM accepts a webhook or API-based access can be utilized, it works. The same logic extends to ERP systems as well; for clients who manage inventory, fulfillment, or sales operations through a platform like SAP, NetSuite, or Cin7, we can connect the attribution data upstream so that closed deals and their originating marketing touchpoints are visible at the operations layer, not just in the marketing dashboard.

Each marketing channel the client was running, whether it be Google CPC, organic search they had invested heavily in, social ads, or a growing influencer program, had its own reporting silo. None of them talked to each other beyond the top of the funnel. The Looker Studio dashboards looked busy, but could not answer the only question that actually mattered: which marketing activity is producing closed revenue, and specifically, which channels were generating the informed, high-intent buyers who asked the right questions first and then converted?

The goal we set was specific. Capture every attribution signal at the moment of form submission, route that data into the CRM and every downstream platform simultaneously, then stitch it back to the original lead record when a purchase eventually occurs. Finally, surface it all in a unified reporting layer that connects ad spend to closed deals, with a full timeline in between, including the consultation period when a sales rep answered the fitment questions that no product page could. I mean, it could. But most people buying aftermarket parts for their cars had at least one question which, even though answered in every F.A.Q. on the site, needed to be asked. It’s just how the online sales of automotive aftermarket products work.

High-Performance E-commerce Infrastructure vs. Cheap Hosting

Technical Obstacle One: Forms Do Not Capture Marketing Data by Default

Contact Form 7, like most form plugins, captures exactly what the form fields contain. Name, email, phone number, message. That is it. The session context that surrounds the submission, the UTM parameters in the URL, the Google Click Identifier attached to the visit, and the page the visitor was on when they submitted, none of that is captured unless you build the mechanism to capture it.

The resolution here was a JavaScript layer that runs on page load before the form is ever submitted. The script reads the current URL and session data, extracts the GCLID, the full set of UTM parameters (source, medium, campaign, term, and content), the page name, the full page URL, and a timestamp including both date and time. It then writes all of those values into hidden fields inside the Contact Form 7 form. The visitor never sees them. The form submits them automatically alongside the visible fields.

One specific obstacle within this: UTM parameters often disappear between the landing page and the form page if a visitor navigates internally before submitting. We solved this by storing the UTM and GCLID values in session storage on first touch, then reading from session storage rather than the live URL at submission time. This preserves the original attribution source even if the visitor browses through five pages before filling out the form.

Technical Obstacle Two: Getting the Data to Multiple Destinations Reliably

The form data needed to reach three platforms simultaneously: Close.com for CRM lead creation, Klaviyo for email segmentation and newsletter flows, and Stape.io for server-side tracking. Sending three separate webhooks directly from Contact Form 7 created reliability problems. If one destination experienced a timeout or a temporary error, the others were unaffected, but there was no retry logic, no error logging, and no single place to monitor what was being sent and whether it landed.

The resolution was routing everything through Zapier as a central orchestration layer. The form fires a single webhook to Zapier. Zapier handles the fan-out to Close.com; then the Klaviyo connector fires; and finally, all is tracked in Stape.io, with built-in error handling and retry logic at each step. This also gave us a single audit trail. Every form submission is logged in Zapier’s history with the full payload, so when something breaks (and it always eventually does), diagnosing the failure takes minutes instead of hours of cross-platform debugging.

The Stape.io integration specifically addresses a problem that has gotten worse as browser-based tracking degrades. Ad blockers, iOS privacy updates, and third-party cookie restrictions all reduce the reliability of pixel-based tracking. Routing form submission events through Stape.io for server-side processing gives the signal a clean path to Google Analytics and Google Ads, without relying on the browser to cooperate. The hit rate on tracked events improved meaningfully once server-side handling was in place.

Technical Obstacle Three: Connecting the Closed Deal Back to the Original Lead

Capturing data at form submission is only half the job. The other half is closing the loop when a purchase actually happens, which could be days or weeks later, through a completely different session with no UTM parameters present at all.

When an order is placed on the site, the same JavaScript layer captures whatever attribution data is present in that session and passes it along with the order. Zapier then runs a lookup in Close.com using the customer’s first name, last name, and email address, with phone number and address as secondary match criteria when available. When the match is confirmed, two things happen. The order data and any new attribution signals get written back to the existing lead record in Close.com, connecting the purchase to the original form submission. And the metadata about the sales process, which rep worked the lead, how many touchpoints occurred, and how long the process took from first contact to close, gets pushed back to the website’s data layer so it can be included in reporting.

The first-touch-to-last-touch delay deserves particular attention here because it is one of the most useful metrics this system produces. For some channels, particularly branded search and direct organic traffic, leads tend to close quickly, often within a week. For cold social ads and influencer-driven traffic, the delay is frequently three to six weeks. This changes how you should evaluate those channels entirely. A social campaign that appears inefficient over a 7-day attribution window looks very different when measured over a 30-day window and when counting closed revenue instead of form submissions.

Technical Obstacle Four: Influencer Campaigns Had No Measurable Return

The client’s influencer program was generating traffic. Whether it was generating revenue was genuinely unknown. Influencer campaigns are typically measured by reach, impressions, and engagement, none of which directly correlate with sales. The client was spending real budget on these partnerships with no quantitative basis for deciding which ones to renew.

The resolution was systematic UTM discipline. Each influencer partnership gets a unique UTM campaign value and, where applicable, a unique landing page. When a visitor arrives through an influencer link, the session storage layer captures that UTM campaign value at first touch. If they submit a form days later through a direct visit, the original influencer source is still recorded. If they eventually purchase, the Zapier lookup connects the closed deal back to that specific campaign value. For the first time, the client can calculate an actual cost-per-acquisition for each influencer relationship and make renewal decisions on revenue contribution rather than follower count.

The Reporting Layer: What Gets Measured, and Why It Changes Decisions

All of this data feeds into a Google Looker Studio dashboard built on a structured data layer that combines input from Close.com, Google Ads, and the site’s own data layer. The dashboard surfaces CPC spend broken down by campaign alongside the leads and closed revenue each campaign produced, organic traffic contribution to lead volume and pipeline, influencer campaign performance by partner with first-touch attribution, sales rep activity mapped to lead source so you can see which channels generate leads that actually close versus leads that stall, and the full distribution of first-touch to last-touch delay by channel.

The budget conversations the client now has are qualitatively different from what was possible before. When a campaign is underperforming, the data shows whether the problem is lead volume, lead quality, or sales follow-up. When organic traffic produces a lead that closes six weeks later, that conversion is attributed correctly rather than counted as a direct or unattributed sale. When an influencer partnership is generating traffic but no pipeline, that is visible within one reporting cycle instead of being discovered at contract renewal.

What This System Is, and What It Is Not

This is not a perfect attribution solution, and anyone who tells you otherwise is selling you something. Multi-device journeys are the most honest example of where the gaps live. A customer discovers the product on their phone during a commute, bookmarks it, asks a fitment question via the mobile contact form, then returns three days later on a desktop to place the order. Those two sessions look like two different people to most tracking systems. The UTM parameters from the original mobile visit are gone. The desktop session shows up as direct traffic. The sale gets attributed to nothing, or worse, to whatever the last click happened to be.

Where we recover ground is in the identity layer. Because the form captured first name, last name, email address, and phone number at the point of inquiry, the Zapier lookup on the order side has enough to make the match even when the session data does not align. It is not a perfect stitch. There are cases where the email used at checkout differs from the one on the inquiry form, or where a customer submits under a nickname and checks out under their full legal name. But a partial match is enormously more useful than no match at all. We connect enough of the dots to build a picture that is directionally accurate and operationally actionable, which is a completely different situation than staring at a dashboard that shows clicks on one side and revenue on the other with nothing in between.

The honest framing is this: the system is significantly better than not having it, and it is nowhere near perfect. Attribution never is. What it replaces is pure guesswork, and that replacement alone changes how the client allocates budget, evaluates campaigns, and measures the contribution of channels that work on longer consideration cycles. Imperfect data with a known margin of uncertainty beats confident-looking data built on flawed assumptions every single time.

What this system delivers is a structured, defensible basis for marketing decisions that did not exist before. The client went from having four separate reporting tools with no connective tissue between them to a single view of how marketing spend flows into closed revenue, with the sales process and the consultation period visible in the middle. The tools involved, WooCommerce, Contact Form 7, Zapier, Close.com, Klaviyo, Stape.io, and Looker Studio, are tools most businesses at this stage already pay for. The investment is in building the architecture correctly and maintaining UTM discipline consistently across every campaign.

If your business runs any volume of leads through a form before they purchase, and your current reporting cannot tell you which campaigns produced closed revenue rather than just clicks or submissions, this is the problem worth solving first. Everything else in your marketing stack performs better when the measurement layer is honest. And the next time someone asks why a campaign that was quietly driving half the pipeline was cut, nobody on your team has to shrug and say they had no idea. That particular crime scene gets a detective.

OUR BLOGS
We got more related posts, check them out! Related Posts