Here’s a problem that doesn’t show up until it’s already cost you money. You wire up offline conversion tracking for your bootcamp, you start importing real enrollments back into Google Ads, and for a while it works beautifully. Then you notice the imports getting thin. Enrollments that you know happened never make it into the account. Smart Bidding starts acting like those students don’t exist, because as far as Google’s concerned, they don’t.
The cause is a window most people never read about. Google’s offline conversion import only accepts a conversion within roughly 90 days of the original ad click. A bootcamp consideration window runs 3 to 6 months, sometimes longer. So the exact thing that makes a bootcamp a bootcamp, a slow, expensive, deliberate decision, is the thing that quietly breaks offline conversion tracking on a long sales cycle. This post is the fix: how to bid to a milestone proxy that lands inside the window, how to capture the GCLID so the data has somewhere to go, and how to keep Smart Bidding learning when your real conversions are sparse and arrive late.
This is the implementation-depth companion to a point we make in the full guide to running Google Ads for bootcamps: you bid on enrollments, not form fills. Great. Now here’s what to do when the enrollment lands after Google has stopped listening.
Why the 90-day window is the real constraint
Offline conversion tracking exists because the form submit is the start of the conversion, not the end. Someone fills out an application, that’s a lead. Whether that lead becomes a $15,000 student is decided weeks later in your CRM, your admissions calls, your financing approvals. Offline conversion import is how you send that real outcome back to Google so Smart Bidding optimizes for students who pay, not people who fill out forms. We cover the full stack in our guide to conversion tracking for online course businesses, and a bootcamp is an online course business with a deadline bolted on.
The mechanism is simple. When someone clicks your ad, Google attaches a click identifier called a GCLID to the landing page URL. You capture it on the application form, store it with the lead, and when that lead converts in your CRM, you upload the GCLID, the conversion name, the time, and the value back to Google. Google matches the GCLID to the original click and credits the conversion. That match is the whole game.
And the match has an expiry. Per Google’s own documentation on importing offline conversions, the conversion has to be uploaded within 90 days of the click for most setups. Click on January 1, convert on March 1, you’re fine. Click on January 1, convert on April 15, the upload fails or the conversion never attributes. The click is too old. Google has moved on.
Now lay a bootcamp timeline over that. A prospect sees your YouTube ad in week one, sits on it, applies six weeks later, takes two admissions calls, sorts out financing or an income-share agreement, and finally pays a deposit in month four. The click that started everything is 110 days old by the time the money’s real. Your single most valuable conversion, the one you most want Smart Bidding to chase, is exactly the one that falls outside the window. That’s the 90-day problem in one sentence: your best conversions are also your latest ones, and late is what the window punishes.
Bid to a milestone proxy that lands inside the window
So you stop waiting for the enrollment. You find an earlier milestone that strongly predicts the enrollment, fires inside 90 days, and bid to that instead.
This is the move people miss. They think the choice is “bid on form fills” (too early, too noisy) or “bid on enrollments” (correct, but too late to import). There’s a middle layer. A bootcamp funnel has milestones between the form and the payment, and at least one of them usually lands comfortably inside the window while still being a serious signal of intent. The good candidates:
- Application submitted (not just a contact form, the real application with effort behind it).
- Admissions call attended or interview completed.
- Deposit paid or seat reserved, even a small refundable one.
- Financing approved or ISA signed.
You bid to the milestone that’s the best trade-off between two things: how predictive it is of a real enrollment, and how fast it happens. A deposit paid is the strongest proxy most bootcamps have, because someone who puts down even $500 has crossed a real line, and deposits usually land well within 90 days of the click. An application submitted fires earlier and gives Smart Bidding more volume, at the cost of being a weaker predictor. Pick based on where your funnel has both the signal and the timing.
The piece people get wrong is the value. You don’t import the deposit’s dollar amount, because $500 isn’t what a student is worth to you. You import the expected value of that milestone: the average enrollment value multiplied by the rate at which that milestone converts to a paid enrollment. If a paid student is worth $15,000 and 60% of deposits convert to enrollment, a deposit is worth $9,000 to your business. That’s the number you feed Google. Now Smart Bidding is optimizing toward the dollar value of a deposit that reliably becomes a student, and it’s doing it on a signal that actually arrives in time to count. Get the unit economics right here, because this proxy value is what the algorithm chases. We dig into the math behind that in our piece on why your school’s revenue depends on proper tracking.
One discipline that matters: keep the proxy honest as your funnel changes. If your deposit-to-enrollment rate drifts from 60% to 45% over two cohorts, your proxy value is now overstating reality and Smart Bidding is overbidding. Recompute it every cohort or two. The proxy is only as good as the conversion rate baked into it.
Capture the GCLID on the application, or none of this works
All of the above depends on one unglamorous step: capturing the GCLID at the moment of the application and storing it with the lead. No GCLID, no match, no import. It’s the conversion-tracking equivalent of writing down the customer’s order before you walk to the kitchen.
The setup, in plain terms:
- Make sure auto-tagging is on in your Google Ads account so the GCLID actually gets appended to your URLs. This is the default, but verify it, because someone turns it off more often than you’d think.
- Have your site read the GCLID from the URL and write it into a hidden field on the application form. A tag manager setup or a small script handles this.
- Push that GCLID into your CRM along with the lead, so it travels with them through every stage. When the deposit gets paid three months later, the GCLID is sitting right there on the record.
- Capture the click timestamp too, or at least the lead-creation time, so you can manage your uploads against the 90-day clock instead of finding out you missed it.
I’ve never met one bootcamp, or any client, whose tracking was perfect when we started. Not one, and I’m serious. The GCLID capture is usually where it’s broken: the form was built before anyone thought about ad attribution, the hidden field is empty, and so the most important leads arrive at the CRM with no way home. The fix is boring and it’s worth more than any bid adjustment you’ll ever make.
Enhanced conversions for leads vs offline import: when to use which
There’s a second method that gets confused with offline import, and the difference matters for a long sales cycle. Enhanced conversions for leads lets you match conversions using hashed first-party data, the lead’s email or phone, instead of the GCLID. You collect the email on the form, and later when that lead converts in your CRM, you upload the hashed email and Google matches it to the original signed-in user who clicked.

The practical pull of enhanced conversions for leads is that it’s simpler to wire up. You don’t have to capture and ferry a GCLID through your whole funnel; you key off data you’re already collecting. Per Google’s documentation on enhanced conversions for leads, it uses the same hashed-data matching as the rest of enhanced conversions, which means the privacy handling is built in.
Here’s how I think about the trade-off for a bootcamp:
- Enhanced conversions for leads is the lower-friction path and a strong default when your CRM workflow makes email the natural key and your dev resources are thin. Match rates depend on people being signed in to Google, so it’s not a guaranteed catch on every lead.
- GCLID-based offline import gives you a tighter, click-level match when the GCLID is present, and it’s the more precise tool when you care about attributing a specific late conversion back to a specific click.
- The hybrid is what we actually run when we can: capture the GCLID and the hashed email, use the GCLID as the primary match and the email as the fallback for the leads where the GCLID went missing. Higher match rate than either alone. You only set one method as the primary bidding signal per conversion action, so layer the rest as backup, not as a second primary.
Whichever you pick, both still answer to the same 90-day clock. Enhanced conversions for leads doesn’t get you a longer window. It changes how you match, not how long you have. So even on the simpler method, you’re still bidding to a milestone proxy that lands in time, not to the enrollment that lands in month four.
Keeping Smart Bidding learning when conversions are sparse and late
The deeper problem behind the window is volume. Smart Bidding is a learning system, and learning needs enough examples, arriving often enough, to find a pattern. A bootcamp running a few cohorts a year, with enrollments that trickle in late and in small numbers, can starve the algorithm even after you’ve fixed the window. Sparse and late is a hard combination.
A few things that keep it fed:
- Bid to the milestone with the most volume that still predicts well. This is the second reason to use a proxy, beyond the timing. Applications happen more often than enrollments, deposits happen more often than full payments. Optimizing on the proxy gives Smart Bidding more data points per month, which is what it needs to learn at all. As a rough floor, Smart Bidding wants somewhere around 30 conversions a month per campaign to optimize a target-CPA strategy well, and roughly 50 for a value-based one. A milestone proxy is often the difference between clearing that bar and sitting under it.
- Consolidate campaigns. Splitting a thin signal across 12 campaigns starves all of them. Fewer, broader campaigns pool the conversion data so each one actually learns. This is the same consolidation logic that runs through the bootcamp playbook and our breakdown of why scaling PPC fails: structure for signal density, not for tidy folders.
- Set your conversion window to fit the cycle. Google’s default click window is 30 days, and a bootcamp’s path to even the proxy milestone often runs longer. Widen the conversion window so a click that converts in week seven still gets credited. A good rule of thumb is at least twice your average days-to-conversion. If you leave it at 30 days and your deposits take 45, you’re throwing away attribution you actually captured.
- Don’t yank the targets around. When data is sparse, every big change to a CPA or ROAS target restarts the learning period, and a learning period on thin volume can take weeks to settle. Move targets in small increments, give each change time, and resist the urge to react to a single bad week.
The honest read: with a genuinely small number of cohorts and low monthly volume, you may not hit the thresholds where Smart Bidding shines, even after everything above. In that case the milestone proxy is doing double duty, it’s both your timing fix and your volume fix, and you lean on it harder. Sometimes the right answer is a simpler bidding strategy on the proxy until volume builds. That’s not a failure of the method. It’s matching the tool to the data you actually have.
Putting it together
The 90-day window isn’t a Google bug you can argue your way around. It’s a fixed constraint, and the whole job is building a measurement system that respects it. Capture the GCLID on the application so late conversions have a route home. Bid to a milestone proxy, usually a deposit or an application, that lands inside the window and carries the expected value of a real enrollment. Use enhanced conversions for leads as the lower-friction match method or as a fallback in a hybrid, and keep recomputing your proxy value as your funnel shifts. Then protect Smart Bidding’s learning by feeding it the densest predictive signal you’ve got.
None of it is glamorous. It’s the boring foundation that decides whether the money you spend on a cohort actually finds the people who enroll. For a bootcamp, where one student is worth five figures and the decision takes a season, that foundation is the difference between a channel that compounds and one that quietly leaks. Get the tracking right first, and everything you build on top of it finally counts.


