<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ahmed Ashour</title>
    <description>The latest articles on DEV Community by Ahmed Ashour (@ahmedashourdev).</description>
    <link>https://dev.to/ahmedashourdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4207453%2F97b264bd-075d-44b0-89ab-299e2b5cea75.png</url>
      <title>DEV Community: Ahmed Ashour</title>
      <link>https://dev.to/ahmedashourdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ahmedashourdev"/>
    <language>en</language>
    <item>
      <title>Why your App Store Connect and Google Play Console numbers never match (and never match your analytics)</title>
      <dc:creator>Ahmed Ashour</dc:creator>
      <pubDate>Mon, 26 Oct 2026 00:23:53 +0000</pubDate>
      <link>https://dev.to/ahmedashourdev/why-your-app-store-connect-and-google-play-console-numbers-never-match-and-never-match-your-3895</link>
      <guid>https://dev.to/ahmedashourdev/why-your-app-store-connect-and-google-play-console-numbers-never-match-and-never-match-your-3895</guid>
      <description>&lt;p&gt;I build a few apps on the side, and every morning I opened App Store Connect, Play Console and my analytics, and no two of them agreed.&lt;br&gt;
While building my own dashboard I had to find out why, one number at a time. These are the reasons I found.&lt;/p&gt;

&lt;h2&gt;
  
  
  The store counts downloads, your analytics counts opens
&lt;/h2&gt;

&lt;p&gt;The store counts a download when the app gets installed. Your analytics only sees someone after they open the app with your SDK running. Everyone who downloads and never opens it is in the store number and nowhere else.&lt;/p&gt;

&lt;p&gt;So your analytics "new users" will be lower than store downloads, and that's normal.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Downloads" means different things on each store
&lt;/h2&gt;

&lt;p&gt;On the App Store, first-time downloads and redownloads are separate numbers. Someone who deletes the app and gets it again is a redownload, not a new download. Updates are counted on their own too. Check which one your chart shows before you compare it with anything.&lt;/p&gt;

&lt;p&gt;On Google Play, users and devices are counted apart. A user is a Google account, a device is a phone or tablet. One person who installs on a phone and a tablet is one new user and two new devices. And the installed audience (devices that have the app right now) is a third thing again: it goes down when people uninstall, downloads never do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your analytics counts installs, not people
&lt;/h2&gt;

&lt;p&gt;A reinstall, a second phone, or logging out and back in gives the app a new install id. Count by install id and each of those is a new user.&lt;/p&gt;

&lt;p&gt;When I switched to counting signed-in people by account instead of by install, 8 of 114 people in one of my apps had been counted twice or more.&lt;/p&gt;

&lt;p&gt;Background wake-ups do it too. A silent push that wakes the app to schedule reminders can look like a visit. On one day, 6 of 83 phones my SDK saw had only been woken by a push, nobody opened the app. Now I only count a session where the app was actually open.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test phones look like real users
&lt;/h2&gt;

&lt;p&gt;Google Play runs every build you upload on its own test phones for the pre-launch report. In my data that's a burst right after each upload: OnePlus 8 Pro on Android 11 (API 30), a US IP, random en-XX locales.&lt;/p&gt;

&lt;p&gt;Apple's review opens your new version from a US iPhone, on a version that isn't on the App Store yet. And if your SDK runs in debug builds, simulators send events too. One day, 11 of one app's 28 "new people" were simulators, which was just me testing.&lt;/p&gt;

&lt;p&gt;Across my apps these were about 1 in 10 new people. They also made purchase errors that no real person had, and made the "came back" rate look worse.&lt;/p&gt;

&lt;p&gt;What I filter out now: emulators and simulators, the pre-launch devices, and any phone that only ever ran a version that isn't in the store yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Store data is late
&lt;/h2&gt;

&lt;p&gt;Today never has downloads. Store numbers show up a day or two late, and downloads can take 2 to 5 days to arrive (Play is the slow one).&lt;/p&gt;

&lt;p&gt;So if you put yesterday's store number next to yesterday's analytics, it almost always looks like a drop. Compare days that are a few days old, or compare today with a usual day at the same hour using your own events.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everyone has a different midnight
&lt;/h2&gt;

&lt;p&gt;Each tool ends the day at its own midnight, and it's not always yours.&lt;/p&gt;

&lt;p&gt;My own dashboard had this bug. The Today page started the day at Berlin midnight and every other page at UTC midnight, which is 1 or 2 am here. Same day, different people on two pages. A sale at 00:30 showed up on the day before.&lt;/p&gt;

&lt;p&gt;Daylight saving adds one more: the night the clocks go back, a day has 25 hours. That broke my "same time yesterday" math until I compared by clock time instead of by milliseconds since midnight.&lt;/p&gt;

&lt;p&gt;Before you compare a day across tools, check which timezone each one uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two analytics tools count the same person twice
&lt;/h2&gt;

&lt;p&gt;If an app sends events to two tools (I had Mixpanel and my own SDK side by side for a while), never add their numbers. My per-day table counted a signed-in person twice when both tools saw them. Pick one source for each number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reviews: each store gives you a different half
&lt;/h2&gt;

&lt;p&gt;Google Play's review export includes star-only ratings, but no country. You only get the reviewer's phone language, so "German" means a phone set to German, not a person in Germany.&lt;/p&gt;

&lt;p&gt;The App Store API only returns reviews that have text, with the reviewer's country. Star-only ratings can't be fetched by any tool. So anything that lists your iOS reviews will show fewer than your rating count.&lt;/p&gt;

&lt;h2&gt;
  
  
  App Store usage numbers are a sample
&lt;/h2&gt;

&lt;p&gt;Sessions, active devices and crashes in App Store Connect only come from people who agreed to share analytics with developers. They're a sample, so they'll be lower than what your SDK sees.&lt;/p&gt;

&lt;h2&gt;
  
  
  Money: what they paid vs what you get
&lt;/h2&gt;

&lt;p&gt;Apple's sales reports have both the customer price and your proceeds after Apple's cut. If one tool shows one and another shows the other, they'll never match. Check which one you're looking at.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I do now
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Downloads come from the stores, people come from my own events. I never subtract one from the other.&lt;/li&gt;
&lt;li&gt;People are counted by account, and only when the app is open.&lt;/li&gt;
&lt;li&gt;Test phones are out: pre-launch devices, simulators, unreleased versions.&lt;/li&gt;
&lt;li&gt;Store days only after they've settled. For today I compare with a usual day at the same hour.&lt;/li&gt;
&lt;li&gt;One midnight for everything.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I got tired of this enough that I built &lt;a href="https://apparent.fyi/?ref=devto" rel="noopener noreferrer"&gt;apparent.fyi&lt;/a&gt;, simple analytics that celebrates your app's small wins.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>android</category>
      <category>mobile</category>
      <category>analytics</category>
    </item>
  </channel>
</rss>
