Experience · Paid Media & Tracking

Getting a restricted store approved on Google, then tracking every sale

A store in one of the hardest verticals Google polices: suspended, mostly disapproved, and spending against a conversion signal that was quietly broken. Here is how I made it advertisable and measurable, and why the last decision I made was to not launch yet.

September 2026 · ~10 min read · Merchant Center, Performance Max, GTM

The end state of the tracking rebuild: real purchase value carried from the store all the way into value-based bidding.

Restricted verticals are where most advertisers either give up or get their account banned. This was a store selling research peptides, a category governed by Google's Healthcare and Medicines advertising policy, and it arrived with almost everything wrong at once: the Merchant Center account had been suspended, most of the catalog was disapproved, the product feed re-added non-compliant items on its own every day, and the shopping campaign was optimising against a purchase signal that carried no value. I worked it end to end, compliance, feed, campaign and tracking, and the piece I am proudest of is the one where I recommended spending nothing.

What I walked into

The brief was blunt: can we even advertise here, and can you set it up? The client had been given vague answers before. Underneath that question was a stack of problems that all had to be solved in the right order, because in a restricted vertical the wrong move does not disapprove a product, it suspends the whole account. My job was to make the store advertisable and measurable without ever gambling the account to do it, working alongside a separate team that ran the search text ads and owned some of the shared conversion actions.

First, what could legally run at all

Before touching a setting, I audited the whole catalog, 68 SKUs, against Google's Healthcare and Medicines policy. The important mental shift here is that restricted does not mean banned. It means some products, under specific conditions. So instead of a yes or no, I built a tiered map: Tier 1, prescription-class molecules that are prohibited for unauthorised sellers and had to leave the ad channel entirely; Tier 2, items flagged for supplement or claims reasons that could be recovered with work; Tier 3, items safe to keep. The certification programs Google recognises for online pharmacies were not available in the client's market, so Tier 1 had no unlock path and that had to be said plainly. I documented the reasoning per SKU in a spreadsheet the business side could read without a policy background. The client got a defensible answer with a written rationale behind every product, instead of a shrug.

Rebuilding the feed into something I controlled

The fix that made everything else stick: one feed I owned, submitting only what I chose.

Here was a trap that undoes a lot of restricted-vertical work: the store's feed plugin auto-generated an XML feed and re-submitted every SKU on the site each day, including the prescription-class items that had to stay out. Archiving them inside Merchant Center did nothing, because the daily feed pushed them straight back in, and the plugin gated per-product control behind its paid tier. So the fix could not live in the plugin. I rebuilt the feed as a self-owned Google Sheet, mapping the full Merchant Center attribute schema by hand, id, title, description, link, image link, availability, price, condition, brand, MPN, the identifier-exists flag, product type, shipping weight and the correct product category, normalised the price formatting so values parsed cleanly, and set the category to the right laboratory-chemicals taxonomy. The single most important setting was keeping the automatic website source switched off, so the sheet stayed the only source and nothing entered the account that I had not deliberately put there. The feed went from an automated liability to a controlled instrument, and the submitted set went on to full approval.

Turning disapprovals into approvals

The disapprovals were not random. They clustered into misrepresentation, unapproved pharmaceuticals or supplements, and misleading claims, with a landing-page mismatch on top. The obvious question was which variable actually triggered them, and guessing wrong risked escalating from a product-level to an account-level problem. So I isolated the variable rather than mass-appealing. I found that descriptions carrying dosing instructions, routes of administration, bioavailability language, or human-outcome claims were what tripped the misleading-claims and limited flags. I rewrote those into a strict research-only register, removing dosing, injection and human-use wording entirely, and left the categories and the rest of the listing intact. A clean natural experiment confirmed it: the same product at one strength was disapproved while at another strength it was approved, which isolated the description wording as the operative cause, not the stock status. The rewrite consistently moved items from flagged to approved, and the submitted set came back with zero limited and zero disapproved. Better than the result, I now had a repeatable rewrite pattern instead of a guess.

Keeping the account alive while I worked

The account had been suspended earlier under editorial and professional requirements tied to how the domain presented, and restricted verticals get reviewed at the whole-domain level, not just the individual product. That reframes the risk: one move resembling cloaking or circumventing systems could take down everything, not one listing. So dedicated ad landing pages were built at their own real URLs, not hidden swaps of live pages, so the destination a shopper reached matched the ad, and I turned final-URL expansion off so ads could never be served to pages that had not been cleaned to the same standard. I treated the domain, not just the feed, as the thing under review, and it stayed healthy through the whole rebuild.

Restructuring Performance Max without stepping on another team

The account was shared. A different team ran the text ads and owned some conversion actions, and the purchase actions were account-level and shared, so anything I did could ripple into their setup. I scoped my changes tightly to the Performance Max campaign: a campaign-specific goal of purchases only, the lead-form goals that belonged to the other team removed from this campaign, bidding set to maximise conversion value, targeting constrained to the right market and languages, and final-URL expansion off. I left the search campaigns and their lead-form conversions completely alone, and flagged the shared purchase actions as something to coordinate on rather than edit unilaterally. Correct structure, no collisions.

Fixing the signal the bidding actually runs on

A maximise-conversion-value strategy is only as good as the value you feed it, and the value here was fiction. The purchase event was firing, but with a $0 value, a "(not set)" transaction ID and zero items. The store was pushing an empty ecommerce object, so the signal looked alive while carrying nothing usable. Tracing the payload back, I installed GTM for WordPress in data-layer-only mode, so the existing GTM container stayed in charge and the plugin's only job was to populate the ecommerce data layer on purchase. In GTM I built Data Layer Variables for each field, a purchase trigger on the data-layer event, mapped value, currency and transaction ID into the Google Ads conversion tag, and turned on enhanced conversions with transaction-ID deduplication so a single sale could never be double-counted. The direct Ads tag became the primary source; the GA4-imported purchase stayed as a secondary source for analytics and cross-checking. Along the way I caught that the store had no shipping method configured, which meant checkout could not complete at all, I proved the whole chain fired in a controlled test, then handed the shipping decision back as a business gate.

Knowing when not to launch

The call that mattered most: hold, and spend the wait making launch day clean.

Then I walked the actual buyer path, and it did not have an end. The ad landing pages were saved as drafts, the main checkout was a dead end with card payments paused and only an off-site messaging hand-off available, and the one working cart lived on a separate subdomain as its own system. There was no completable, trackable on-site sale. The tempting move was to run the campaign anyway and count the off-site hand-off click, just to show activity. I reasoned it through instead. That click carries no purchase value, so value-based bidding would have nothing to optimise toward and would train on clickers, not buyers. Worse is the transition: when the real checkout goes live and the conversion action changes, Performance Max treats it as a new goal and restarts its learning, so the account pays for two learning phases and spends the first one training toward the wrong action. So I recommended holding paid spend and using the wait productively, finishing and validating tracking, completing the feed and ad pages, and confirming the full path, and I flagged the concrete unknowns to resolve before resuming. Not launching was the higher-value call, and I could show exactly why rather than just assert it.

What it came to

The honest outcome, because this is a foundation, not a victory-lap revenue chart. The catalog is audited and tiered with a defensible rationale; the account was recovered and kept healthy through the rebuild; the submitted products came back fully approved, zero limited and zero disapproved, via a repeatable rewrite pattern; the feed is a self-owned, single controlled source that never leaks a non-compliant item; Performance Max is correctly structured inside a shared account without disturbing the other team; and the conversion tracking reports real value, currency and transaction ID with enhanced conversions and deduplication, validated end to end in test. Everything is staged so the day the real checkout goes live, the campaign switches on into one clean learning phase on genuine purchase value.

What this did not solve

The honest limit: there is no performance number yet, and there should not be, because the paid checkout was not live during the engagement. The value delivered is the foundation and the judgment, an advertisable, compliant, fully measurable store ready to scale, not a revenue figure I could dress up. Two things also stay true going forward. Tier 1 stays off the ad channel permanently, because the certification path Google requires does not exist in this market, so the strategy is to sell those off-channel and never advertise them. And policy in this vertical shifts, so the research-only standard and the whole-domain posture are things to monitor, not set once and forget.

What I'd carry forward

Four things. In a restricted vertical, "impossible" is almost always wrong; the real answer is which products, under which conditions, and it is worth the audit to say so precisely. Own the feed, because a source you do not control will quietly undo your compliance work. Isolate the variable before you mass-appeal, one confirmed cause beats fifty hopeful resubmissions that can escalate the problem. And never point value-based bidding at a valueless signal; if the sale is not trackable with real value yet, the highest-value move can be to wait and stage, not to spend.

Stacks involved

Google Merchant CenterGoogle Ads (Performance Max / Shopping)Google Tag ManagerGA4GTM for WordPress (GTM4WP)WooCommerceGoogle Sheets feedsenhanced conversions
← more of my work