@rawdash/connector-google-play-console 0.28.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -20,17 +20,19 @@ Authenticate against the Play Developer Reporting API and the Android Publisher
20
20
  1. In Google Cloud, create a service account at IAM & Admin -> Service Accounts and download a JSON key.
21
21
  2. Enable both the "Google Play Developer Reporting API" and the "Google Play Android Developer API" on the Cloud project.
22
22
  3. In Google Play Console open Setup -> API access, link the same Cloud project, then invite the service account email and grant it at least the "View app information and download bulk reports" permission for the app you want to sync.
23
- 4. Store the service account JSON as a secret and reference it as serviceAccountJson: secret("GPLAY_SA_JSON").
24
- 5. Set packageName to the reverse-DNS application id of the app (e.g. com.example.app).
23
+ 4. For the `gplay_installs_*` resources, grant bucket access inside Play Console, not Google Cloud IAM: the install reports live in a Google-managed Cloud Storage bucket provisioned for your developer account. In Play Console -> Users & permissions, give the service account the account-level "View app information and download bulk reports" permission set to Global (changes can take a few hours to propagate), then copy the bucket id from the Download reports page (the Cloud Storage URI starts with `gs://pubsite_prod_...`) into installsBucketId.
24
+ 5. Store the service account JSON as a secret and reference it as serviceAccountJson: secret("GPLAY_SA_JSON").
25
+ 6. Set packageName to the reverse-DNS application id of the app (e.g. com.example.app).
25
26
 
26
27
  ## Configuration
27
28
 
28
- | Field | Type | Required | Description |
29
- | -------------------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
30
- | `packageName` | string | Yes | Reverse-DNS application id of the Android app (e.g. com.example.app). Visible in the Play Console URL and on Google Play under "About". |
31
- | `serviceAccountJson` | secret | Yes | Contents of the JSON key file for a Google service account that has been granted access to your Play Console developer account with at least the "View app information and download bulk reports" permission. Create one at Google Cloud -> IAM & Admin -> Service Accounts. |
32
- | `lookbackDays` | number | No | How many calendar days to fetch on a full sync. Defaults to 30. The Play Developer Reporting API exposes daily metrics with a typical 2-3 day reporting lag. |
33
- | `reviewLimit` | number | No | How many of the most-recent user reviews to emit as gplay_app_ratings samples. Defaults to 200. Reviews are fetched then ranked newest-first before this cap is applied. The Android Publisher reviews API only surfaces reviews from roughly the past week, so this is a rolling sample, not a full history. |
29
+ | Field | Type | Required | Description |
30
+ | -------------------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
31
+ | `packageName` | string | Yes | Reverse-DNS application id of the Android app (e.g. com.example.app). Visible in the Play Console URL and on Google Play under "About". |
32
+ | `serviceAccountJson` | secret | Yes | Contents of the JSON key file for a Google service account that has been granted access to your Play Console developer account with at least the "View app information and download bulk reports" permission. Create one at Google Cloud -> IAM & Admin -> Service Accounts. |
33
+ | `lookbackDays` | number | No | How many calendar days to fetch on a full sync. Defaults to 30. The Play Developer Reporting API exposes daily metrics with a typical 2-3 day reporting lag. |
34
+ | `reviewLimit` | number | No | How many of the most-recent user reviews to emit as gplay_app_ratings samples. Defaults to 200. Reviews are fetched then ranked newest-first before this cap is applied. The Android Publisher reviews API only surfaces reviews from roughly the past week, so this is a rolling sample, not a full history. |
35
+ | `installsBucketId` | string | No | Cloud Storage bucket id that holds your Play Console reports (e.g. `pubsite_prod_rev_01234567890987654321`), shown via "Copy Cloud Storage URI" on the Play Console Download reports page. Required only for the `gplay_installs_*` resources, which read the monthly stats/installs CSV reports. The bucket is Google-managed; the service account is granted access through Play Console (Users & permissions -> "View app information and download bulk reports", set to Global), not Google Cloud IAM. |
34
36
 
35
37
  ## Resources
36
38
 
@@ -56,6 +58,55 @@ Authenticate against the Play Developer Reporting API and the Android Publisher
56
58
  - Unit: stars
57
59
  - Dimensions: `package_name`, `review_id`, `reviewer_language`, `device`, `app_version_name`, `android_os_version`
58
60
  - Not the lifetime average shown on the Play Store. The reviews API only returns reviews from roughly the past week, so this is a rolling sample; average over a time window downstream for a smoothed rating.
61
+ - **`gplay_installs_overview_by_day`** _(metric)_ - Daily install statistics for the app from the Play Console monthly installs report (stats/installs overview CSV). Primary value is Daily Device Installs; uninstalls, upgrades, active-device installs and user-keyed counts are carried as additional attributes.
62
+ - Endpoint: `GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_overview.csv`
63
+ - Unit: installs
64
+ - Granularity: day
65
+ - Dimensions: `date`, `package_name`
66
+ - Measures: `daily_device_installs`, `daily_device_uninstalls`, `daily_device_upgrades`, `current_device_installs`, `active_device_installs`, `current_user_installs`, `total_user_installs`, `daily_user_installs`, `daily_user_uninstalls`
67
+ - Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
68
+ - **`gplay_installs_by_country`** _(metric)_ - Daily install statistics broken down by country/region from the Play Console monthly installs report (stats/installs country CSV).
69
+ - Endpoint: `GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_country.csv`
70
+ - Unit: installs
71
+ - Granularity: day
72
+ - Dimensions: `date`, `package_name`, `country`
73
+ - Measures: `daily_device_installs`, `daily_device_uninstalls`, `daily_device_upgrades`, `current_device_installs`, `active_device_installs`, `current_user_installs`, `total_user_installs`, `daily_user_installs`, `daily_user_uninstalls`
74
+ - Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
75
+ - **`gplay_installs_by_app_version`** _(metric)_ - Daily install statistics broken down by app version code from the Play Console monthly installs report (stats/installs app_version CSV).
76
+ - Endpoint: `GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_app_version.csv`
77
+ - Unit: installs
78
+ - Granularity: day
79
+ - Dimensions: `date`, `package_name`, `app_version_code`
80
+ - Measures: `daily_device_installs`, `daily_device_uninstalls`, `daily_device_upgrades`, `current_device_installs`, `active_device_installs`, `current_user_installs`, `total_user_installs`, `daily_user_installs`, `daily_user_uninstalls`
81
+ - Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
82
+ - **`gplay_installs_by_device`** _(metric)_ - Daily install statistics broken down by device from the Play Console monthly installs report (stats/installs device CSV).
83
+ - Endpoint: `GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_device.csv`
84
+ - Unit: installs
85
+ - Granularity: day
86
+ - Dimensions: `date`, `package_name`, `device`
87
+ - Measures: `daily_device_installs`, `daily_device_uninstalls`, `daily_device_upgrades`, `current_device_installs`, `active_device_installs`, `current_user_installs`, `total_user_installs`, `daily_user_installs`, `daily_user_uninstalls`
88
+ - Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
89
+ - **`gplay_installs_by_os_version`** _(metric)_ - Daily install statistics broken down by Android OS version from the Play Console monthly installs report (stats/installs os_version CSV).
90
+ - Endpoint: `GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_os_version.csv`
91
+ - Unit: installs
92
+ - Granularity: day
93
+ - Dimensions: `date`, `package_name`, `android_os_version`
94
+ - Measures: `daily_device_installs`, `daily_device_uninstalls`, `daily_device_upgrades`, `current_device_installs`, `active_device_installs`, `current_user_installs`, `total_user_installs`, `daily_user_installs`, `daily_user_uninstalls`
95
+ - Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
96
+ - **`gplay_installs_by_language`** _(metric)_ - Daily install statistics broken down by language from the Play Console monthly installs report (stats/installs language CSV).
97
+ - Endpoint: `GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_language.csv`
98
+ - Unit: installs
99
+ - Granularity: day
100
+ - Dimensions: `date`, `package_name`, `language`
101
+ - Measures: `daily_device_installs`, `daily_device_uninstalls`, `daily_device_upgrades`, `current_device_installs`, `active_device_installs`, `current_user_installs`, `total_user_installs`, `daily_user_installs`, `daily_user_uninstalls`
102
+ - Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
103
+ - **`gplay_installs_by_carrier`** _(metric)_ - Daily install statistics broken down by carrier from the Play Console monthly installs report (stats/installs carrier CSV).
104
+ - Endpoint: `GET /storage/v1/b/{installsBucketId}/o/stats%2Finstalls%2Finstalls_{packageName}_{YYYYMM}_carrier.csv`
105
+ - Unit: installs
106
+ - Granularity: day
107
+ - Dimensions: `date`, `package_name`, `carrier`
108
+ - Measures: `daily_device_installs`, `daily_device_uninstalls`, `daily_device_upgrades`, `current_device_installs`, `active_device_installs`, `current_user_installs`, `total_user_installs`, `daily_user_installs`, `daily_user_uninstalls`
109
+ - Sourced from the Play Console monthly stats/installs CSV in Cloud Storage. Files are monthly with daily rows and arrive a few days in arrears; the connector refetches the months overlapping the sync window.
59
110
 
60
111
  ## Example
61
112
 
@@ -108,7 +159,7 @@ The Play Developer Reporting API enforces a per-project quota (default 60 reques
108
159
  - Daily vitals (crash rate, ANR rate, error counts) have a 2-3 day reporting lag on the Play Developer Reporting API; incremental syncs refetch the trailing 3 days. Metric days are reported on the America/Los_Angeles calendar, the only timezone the API supports for daily aggregation.
109
160
  - gplay_app_ratings is a rolling sample of recent reviews from the Android Publisher reviews API (default 200, configurable via reviewLimit). Each sample carries one review with its star rating (1-5) as the value; this is not the lifetime average shown on the Play Store, and the reviews API only surfaces reviews from roughly the past week.
110
161
  - The apps entity carries only the configured package name; the Play Store listing title is available solely through an Android Publisher edit, which this connector does not create.
111
- - Install counts and earnings are not exposed through the Reporting API - Google delivers them only as monthly CSV reports in a private Cloud Storage bucket. Those metrics are out of scope for this connector and will land in a follow-up.
162
+ - The `gplay_installs_*` resources read the monthly stats/installs CSV reports from your Play Console Cloud Storage bucket, not the Reporting API; they require installsBucketId plus the account-level "View app information and download bulk reports" permission granted to the service account in Play Console (the bucket is Google-managed; access is not configured through Google Cloud IAM). Files are published monthly (with daily rows) and a few days in arrears, so the current month fills in over time and the most recent days lag. Earnings/financial reports remain out of scope.
112
163
 
113
164
  ## Links
114
165
 
package/dist/index.d.ts CHANGED
@@ -8,12 +8,14 @@ declare const configFields: z.ZodObject<{
8
8
  }, z.core.$strip>;
9
9
  lookbackDays: z.ZodOptional<z.ZodNumber>;
10
10
  reviewLimit: z.ZodOptional<z.ZodNumber>;
11
+ installsBucketId: z.ZodOptional<z.ZodString>;
11
12
  }, z.core.$strip>;
12
13
  declare const doc: ConnectorDoc;
13
14
  interface GooglePlayConsoleSettings {
14
15
  packageName: string;
15
16
  lookbackDays?: number;
16
17
  reviewLimit?: number;
18
+ installsBucketId?: string;
17
19
  }
18
20
  declare const gplayCredentials: {
19
21
  serviceAccountJson: {
@@ -201,6 +203,139 @@ declare const googlePlayConsoleResources: {
201
203
  }, z.core.$strip>;
202
204
  };
203
205
  };
206
+ readonly gplay_installs_overview_by_day: {
207
+ shape: "metric";
208
+ description: string;
209
+ unit: string;
210
+ granularity: string;
211
+ endpoint: string;
212
+ notes: string;
213
+ dimensions: {
214
+ name: string;
215
+ description: string;
216
+ }[];
217
+ measures: {
218
+ name: string;
219
+ description: string;
220
+ }[];
221
+ responses: {
222
+ [x: string]: z.ZodString;
223
+ };
224
+ };
225
+ readonly gplay_installs_by_country: {
226
+ shape: "metric";
227
+ description: string;
228
+ unit: string;
229
+ granularity: string;
230
+ endpoint: string;
231
+ notes: string;
232
+ dimensions: {
233
+ name: string;
234
+ description: string;
235
+ }[];
236
+ measures: {
237
+ name: string;
238
+ description: string;
239
+ }[];
240
+ responses: {
241
+ [x: string]: z.ZodString;
242
+ };
243
+ };
244
+ readonly gplay_installs_by_app_version: {
245
+ shape: "metric";
246
+ description: string;
247
+ unit: string;
248
+ granularity: string;
249
+ endpoint: string;
250
+ notes: string;
251
+ dimensions: {
252
+ name: string;
253
+ description: string;
254
+ }[];
255
+ measures: {
256
+ name: string;
257
+ description: string;
258
+ }[];
259
+ responses: {
260
+ [x: string]: z.ZodString;
261
+ };
262
+ };
263
+ readonly gplay_installs_by_device: {
264
+ shape: "metric";
265
+ description: string;
266
+ unit: string;
267
+ granularity: string;
268
+ endpoint: string;
269
+ notes: string;
270
+ dimensions: {
271
+ name: string;
272
+ description: string;
273
+ }[];
274
+ measures: {
275
+ name: string;
276
+ description: string;
277
+ }[];
278
+ responses: {
279
+ [x: string]: z.ZodString;
280
+ };
281
+ };
282
+ readonly gplay_installs_by_os_version: {
283
+ shape: "metric";
284
+ description: string;
285
+ unit: string;
286
+ granularity: string;
287
+ endpoint: string;
288
+ notes: string;
289
+ dimensions: {
290
+ name: string;
291
+ description: string;
292
+ }[];
293
+ measures: {
294
+ name: string;
295
+ description: string;
296
+ }[];
297
+ responses: {
298
+ [x: string]: z.ZodString;
299
+ };
300
+ };
301
+ readonly gplay_installs_by_language: {
302
+ shape: "metric";
303
+ description: string;
304
+ unit: string;
305
+ granularity: string;
306
+ endpoint: string;
307
+ notes: string;
308
+ dimensions: {
309
+ name: string;
310
+ description: string;
311
+ }[];
312
+ measures: {
313
+ name: string;
314
+ description: string;
315
+ }[];
316
+ responses: {
317
+ [x: string]: z.ZodString;
318
+ };
319
+ };
320
+ readonly gplay_installs_by_carrier: {
321
+ shape: "metric";
322
+ description: string;
323
+ unit: string;
324
+ granularity: string;
325
+ endpoint: string;
326
+ notes: string;
327
+ dimensions: {
328
+ name: string;
329
+ description: string;
330
+ }[];
331
+ measures: {
332
+ name: string;
333
+ description: string;
334
+ }[];
335
+ responses: {
336
+ [x: string]: z.ZodString;
337
+ };
338
+ };
204
339
  };
205
340
  declare const id = "google-play-console";
206
341
  declare class GooglePlayConsoleConnector extends BaseConnector<GooglePlayConsoleSettings, GplayCredentials> {
@@ -363,8 +498,143 @@ declare class GooglePlayConsoleConnector extends BaseConnector<GooglePlayConsole
363
498
  }, z.core.$strip>;
364
499
  };
365
500
  };
501
+ readonly gplay_installs_overview_by_day: {
502
+ shape: "metric";
503
+ description: string;
504
+ unit: string;
505
+ granularity: string;
506
+ endpoint: string;
507
+ notes: string;
508
+ dimensions: {
509
+ name: string;
510
+ description: string;
511
+ }[];
512
+ measures: {
513
+ name: string;
514
+ description: string;
515
+ }[];
516
+ responses: {
517
+ [x: string]: z.ZodString;
518
+ };
519
+ };
520
+ readonly gplay_installs_by_country: {
521
+ shape: "metric";
522
+ description: string;
523
+ unit: string;
524
+ granularity: string;
525
+ endpoint: string;
526
+ notes: string;
527
+ dimensions: {
528
+ name: string;
529
+ description: string;
530
+ }[];
531
+ measures: {
532
+ name: string;
533
+ description: string;
534
+ }[];
535
+ responses: {
536
+ [x: string]: z.ZodString;
537
+ };
538
+ };
539
+ readonly gplay_installs_by_app_version: {
540
+ shape: "metric";
541
+ description: string;
542
+ unit: string;
543
+ granularity: string;
544
+ endpoint: string;
545
+ notes: string;
546
+ dimensions: {
547
+ name: string;
548
+ description: string;
549
+ }[];
550
+ measures: {
551
+ name: string;
552
+ description: string;
553
+ }[];
554
+ responses: {
555
+ [x: string]: z.ZodString;
556
+ };
557
+ };
558
+ readonly gplay_installs_by_device: {
559
+ shape: "metric";
560
+ description: string;
561
+ unit: string;
562
+ granularity: string;
563
+ endpoint: string;
564
+ notes: string;
565
+ dimensions: {
566
+ name: string;
567
+ description: string;
568
+ }[];
569
+ measures: {
570
+ name: string;
571
+ description: string;
572
+ }[];
573
+ responses: {
574
+ [x: string]: z.ZodString;
575
+ };
576
+ };
577
+ readonly gplay_installs_by_os_version: {
578
+ shape: "metric";
579
+ description: string;
580
+ unit: string;
581
+ granularity: string;
582
+ endpoint: string;
583
+ notes: string;
584
+ dimensions: {
585
+ name: string;
586
+ description: string;
587
+ }[];
588
+ measures: {
589
+ name: string;
590
+ description: string;
591
+ }[];
592
+ responses: {
593
+ [x: string]: z.ZodString;
594
+ };
595
+ };
596
+ readonly gplay_installs_by_language: {
597
+ shape: "metric";
598
+ description: string;
599
+ unit: string;
600
+ granularity: string;
601
+ endpoint: string;
602
+ notes: string;
603
+ dimensions: {
604
+ name: string;
605
+ description: string;
606
+ }[];
607
+ measures: {
608
+ name: string;
609
+ description: string;
610
+ }[];
611
+ responses: {
612
+ [x: string]: z.ZodString;
613
+ };
614
+ };
615
+ readonly gplay_installs_by_carrier: {
616
+ shape: "metric";
617
+ description: string;
618
+ unit: string;
619
+ granularity: string;
620
+ endpoint: string;
621
+ notes: string;
622
+ dimensions: {
623
+ name: string;
624
+ description: string;
625
+ }[];
626
+ measures: {
627
+ name: string;
628
+ description: string;
629
+ }[];
630
+ responses: {
631
+ [x: string]: z.ZodString;
632
+ };
633
+ };
366
634
  };
367
635
  static readonly schemas: object & {
636
+ [x: string]: z.ZodString;
637
+ } & {
368
638
  readonly crash_rate: z.ZodObject<{
369
639
  rows: z.ZodOptional<z.ZodArray<z.ZodObject<{
370
640
  startTime: z.ZodObject<{
@@ -449,14 +719,15 @@ declare class GooglePlayConsoleConnector extends BaseConnector<GooglePlayConsole
449
719
  auth: "required";
450
720
  };
451
721
  };
452
- private cachedToken;
453
- private fetchOAuthToken;
722
+ private tokenProvider?;
454
723
  private getAccessToken;
455
724
  private runMetricQuery;
456
725
  private syncApps;
457
726
  private fetchReviews;
458
727
  private syncReviews;
459
728
  private drainMetricPhase;
729
+ private downloadInstallsCsv;
730
+ private syncInstallsBreakdown;
460
731
  sync(options: SyncOptions, storage: StorageHandle, signal?: AbortSignal): Promise<SyncResult>;
461
732
  }
462
733