K
Karthik the Marketer
Persona · Campaign ID + Web/Client analytics + Latency
Chapter 1 of 6 · Microsoft Store Discoverability

Meet Karthik,
the Marketer.

Indie dev. Free productivity app, live 6 months. Unlike the dev who doesn't know what to optimise — Karthik knows. He's running a Reddit AMA Tuesday, posting on X Wednesday, and a thread in r/productivity Thursday, each with its own ?cid= tag. He's doing the work.

Partner Center will eventually show him an install count per campaign — 3 to 4 hours late. But the Page views column shows "—". The Conversions chart doesn't match the table. And nothing tracks the web PDP view that happens between his Reddit click and the eventual install. He has the start of the funnel and a delayed end — nothing in the middle to interpret either.

App live 6 months
3 channels/week with ?cid=
Page views per cid: "—"
Install latency: 3–4 hr
Karthik · indie dev · running real marketing
feeling: spending without seeing
Karthik's marketing week
Tue 10am
Reddit AMA in r/productivity. ~500 clicks in the first hour. Uses apps.microsoft.com/...?cid=reddit-ama link.
Tue 11am
Refreshes Partner Center. Installs column: 0. Refreshes again. Still 0. (Doesn't know it's just lag.)
Tue 2pm
3 hrs later: Installs tab shows 2. Switches to Page views tab to see how many actually loaded the page. Column header still reads "Installs". Value still reads "2". Switches to Conversions tab. "2" again. 500 Reddit clicks landed somewhere; he has no idea where.
Wed
Posts on X with ?cid=twitter-launch. ~200 clicks.
Thu
r/productivity thread with deep-link (ms-windows-store://). Captures installs cleanly — if users have the Store client open.
Sat
Reviews the week. Reddit: 2 installs. Twitter: 1 install. The Page views tab and Conversions tab show the same numbers as the Installs tab. Was Twitter low traffic (audience small) or low conversion (audience wrong)? He can't tell. Cuts Twitter for next week — not because it failed, but because he can't tell if it didn't.

"Page view is missing
in campaignid."

"Page view is missing in campaignid." — Dave Smits, established Microsoft Store dev, 4 June 2026 (one of three concrete gaps he raised)

Three tabs. Same column. Same numbers. The data table never changes — only the chart does. Karthik gets one answer to three different questions.

Add the latency layer — installs arrive 3–4 hrs late, daily reports +1–2 days — and his entire week of marketing produces a single ambiguous number, after the moment is already over.

All three tab headers: "Installs"
Web PDP views: 0 captured
Install latency: 3–4 hr
Partner Center · Custom campaign performance · Page views tabThe column header reads "Installs"
Real Microsoft Partner Center Custom campaign performance Page views tab — column header still labeled Installs, same two values 2 and dash as the Installs tab. Only the chart line is different.
DEV VOICE · KARTHIK PERSONA
"I drove 500 clicks to my Store page from Reddit. Partner Center eventually shows 2. Click the Page views tab? Still 2. Click Conversions? Still 2. Same column, same number, three tabs. I'm getting one answer to three different questions."
Synthesised from VoD Pulse free-text + r/microsoftdevs recurring complaints; phrasing aligned with Dave Smits' verbatim "Page view is missing in campaignid."
MS OWN REASONING · INTERNAL EXPLANATION
"Analytics captures only the Store client usage, not web Store usage."
Microsoft Store engineering response when asked why ?cid= click telemetry on apps.microsoft.com isn't surfaced.
THE TWO-LINK PROBLEM
"The link a dev intuitively grabs (the share button on the app's web page) is the wrong link for marketing analytics. The correct link — the ms-windows-store:// deep link — is undocumented in the Partner Center share flow."
A pure DX gap, no engineering cost to fix.

The dashboard that doesn't actually show
what Karthik needs.

These are real screenshots of Custom campaign performance in Partner Center, today. Two custom campaigns — focusdropcampaign and spotifyweb-store-button — tracked across a 30-day window. Click the tabs in order to see the broken state on each metric.

Partner Center · Custom campaign performance · Installs30-day window, 9 May → 8 Jun 2026
Microsoft Partner Center Custom campaign performance: Installs tab. Two campaigns listed (focusdropcampaign = 2 installs, spotifyweb-store-button = dash). Single spike in chart on one day.
WHAT'S BROKEN HERE
2 installs in 30 days for an entire campaign. A single lumpy spike on one day, flat zeros the other 29. spotifyweb-store-button reads as "—" — no signal at all. Karthik cannot tell if the campaign failed, or if Partner Center simply isn't measuring it. This tab is correctly labeled. The other two tabs aren't.
Partner Center · Custom campaign performance · Page viewsNote the column header still says "Installs"
Microsoft Partner Center Custom campaign performance: Page views tab. Column header reads 'Installs' (wrong - this is the Page views tab). spotifyweb-store-button column shows '-' yet the chart clearly shows it had page views in early June.
WHAT'S BROKEN HERE
Page views tab. Column header reads "Installs." Same column data as the Installs tab. Only the chart line changes — the table never relabels and never updates. There is no per-campaign page-view number visible anywhere.
Partner Center · Custom campaign performance · Conversions"Installs by Page views"
Microsoft Partner Center Custom campaign performance: Conversions tab. focusdropcampaign shows '2'; spotifyweb-store-button shows '-'. A 67-point spike appears on the chart with no labelled data point.
WHAT'S BROKEN HERE
A 67-point spike on one day on the chart — with the table column reading "Installs" (not "Conversions") and showing "2". The same column wearing three different tab hats. Karthik can't tell which metric he's reading.

Karthik's funnel today — the dark middle

Step 1 · CLICK
500
Reddit clicks measured on the Reddit side (his own analytics)
Step 2 · PAGE VIEW PER CID
"2"
Page views tab shows the same column ("Installs") with the same value as the Installs tab. Indistinguishable.
Step 3 · INSTALL (3–4 hr late)
2
Eventually visible per cid. Without page views, the rate is uncomputable.

Installs per cid do arrive, just late. What's actually missing is the denominator: page views per cid, conversion rate per cid. Without page views, Karthik can't tell a low-traffic / high-conversion channel apart from a high-traffic / low-conversion one — both look like "2 installs". He turns one off without knowing which one.

Apple gives him attribution in 24 hours.
Google gives him attribution in real time.
We give him two installs out of "—".

Apple App Store
24 hr
Campaign Links
attribution latency · free apps
Google Play
real-time
Install Referrer API
server-pushed · free apps
Microsoft Store
3–4 hr
Custom campaign IDs
undocumented · web PDP not captured
The campaign attribution surface itself
Campaign ID / referrer tracking for free apps
°
Publicly documented (devs can find it)
Web PDP-view telemetry (pre-install funnel)
Latency — can he iterate while the campaign is live
Real-time / near-real-time install attribution
°
Server-push API for events (vs dashboard scraping)

What Google actually shows a real dev today

Google Play Console · Store analysis · Acquisition splitReal production data, Sports category app
Google Play Console showing acquisitions split into Google Play explore (27,158) vs Paid and direct (402,071), with detailed timeline and source-level breakdowns

Per-source acquisitions, separated cleanly: Google Play explore (organic browse) at 27,158 vs Paid and direct (web/ad-driven traffic) at 402,071 — that's a 15× ratio Karthik would love to see for his own app. The point isn't the numbers; it's that Google distinguishes the source of every install and reports it next-day at worst. Microsoft Partner Center aggregates everything into a single "Custom campaign performance" widget that today reads "2" or "—".

What this screenshot actually does
User lands on listing
Every install event is tagged at acquisition time with its source path.
PATH A · Inside Play
27,158
"Google Play explore" — organic browse, search, related apps.
+
PATH B · Outside Play
402,071
"Paid and direct" — web links, ads, badges, social, blogs.
Microsoft today: the same install would land in one undifferentiated column labelled "Installs" with no clean separation of organic Store browse vs off-Store traffic. Karthik can't tell whether his Reddit AMA actually moved his organic ranking, because he can't separate the two streams.
Google Play Console · Promotional content reports176 countries × event × acquisitions / opens / updates
Google Play Console promotional content reports for a BGMS X Rooter event showing 4.35M viewers, 924 converters, 0.02% conversion, broken down across 176 countries

4.35M viewers, 924 converters, 0.02% CR, broken by 176 countries. Google doesn't just track installs — it gives Karthik a LiveOps-grade view of every promotional event he runs, with funnel metrics at each step. Microsoft Store has no concept of a promotional event tied to listing analytics.

What this screenshot actually does
Layer 1 · Viewers
4.35M
How many users saw the event card.
Layer 2 · Converters
924
How many acted (0.02% CR — computable here because both numbers exist).
Layer 3 · Action × Geo
176 × 3
Acquisitions / Opens / Updates across 176 countries.
Microsoft today: a Reddit AMA Tuesday is just another ?cid=reddit-ama tag — not a tracked entity. No viewers number. No event window. No action-type split. No geo breakdown. Karthik gets one ambiguous "2" on three tabs, 3-4 hours after the AMA is over.

Four moves.
Three of them are documentation.

The capability already half-exists. Custom campaign IDs work for free apps. The web PDP has a URL. The deep-link scheme is implemented. What's missing is documentation, telemetry, and a faster pipeline — not new product.

Move 1 · ship the docs
Document ?cid= for free apps.
A single Partner Center docs page: "Tracking custom campaigns for your free app." Cite the URL format, where to find the dashboard, the latency, and the known gap on web PDP views. Karthik learned ?cid= exists by accident; every other dev should learn from docs.
Move 2 · fix the broken UI
Relabel the Page views & Conversions columns.
All three tabs today share one column labeled "Installs" showing one set of values. Page views tab should show page views per cid. Conversions tab should show conversion rate per cid. The chart already changes between tabs — the table just needs to follow. Same telemetry, different roll-up. Add web-PDP view capture so cross-platform marketing links land in the same surface.
Move 3 · cut the latency
Near-real-time campaign events.
Apple ships 24-hour. Google ships real-time push. Today MS shows installs 3–4 hours late in Recent Data, 1–2 days late in Daily Views. For a Reddit AMA that's over in 3 hours, that's functionally no data. A streaming or 30-min batch pipeline lets Karthik double down on what's converting while the moment is hot.
Move 4 · fix the share flow
Two-link problem — surface the right link.
Partner Center's share flow today gives the web URL. The deep-link ms-windows-store:// link is undocumented. A single dropdown in the share UI — "Web link (broad reach) / Deep link (full analytics)" — ends a five-year DX gap. Pure copy + UI change. No telemetry work.

What ships when

P0 · THIS SPRINT
Ship Move 1 + Move 4.
Docs page for ?cid=. Share-flow dropdown for web vs deep link. Zero engineering — pure content + UI.
P1 · 1Q
Fix the broken UI bugs.
Column header on Page views tab. Aggregation for campaigns with "—". Mismatched chart totals. Get the current surface back to working first.
P2 · 2Q
Ship Move 2.
Web PDP view telemetry on apps.microsoft.com. Same source, device, OS slicing as the client. Closes the dark-middle funnel gap.
P3 · 3Q
Ship Move 3.
30-min batch → eventual real-time push. Brings MS to Apple's 24-hour bar; Move 3 is what closes the gap to Google.

Measure → iterate → spend more →
a healthier Store.

Karthik's pain isn't a measurement problem. It's a discovery problem one layer deep. If devs can't measure off-Store campaigns, they can't double down on what works — so Microsoft Store stops being a destination they invest in, and the algorithm has less external signal to reward listings with.

Today's flywheel · spinning backwards

1 · Karthik can't measure
Web PDP dark. Latency too high. Campaign IDs undocumented.
2 · He stops investing
Cuts Reddit + X for next week — not because they failed, but because he can't tell if they didn't.
3 · Less external signal
Microsoft Store algorithm receives weaker external-traffic signals for his app.
4 · Catalog stagnates
Devs who tried to drive traffic give up. "Just publishing here, marketing on iOS/Android."

If we ship the four moves · flywheel forward

1 · Karthik measures
Web PDP captured. ~30-min latency. ?cid= documented.
2 · He doubles down
Triples spend on Reddit (high CR), iterates X messaging, scales MS Ads. 3× installs next month per the source flywheel doc.
3 · Algorithm gets stronger signal
More external installs → algorithm correctly weights his listing higher in organic search & browse.
4 · Catalog wakes up
Karthik tells five other indie devs the loop works. Word-of-mouth in r/microsoftdevs flips from "don't bother" to "actually measurable now".