# Google Reviews Collection Auditor (`dataassetlab/google-reviews-collection-auditor`) Actor

Compare two Google review datasets to find rating, text and owner-reply changes, duplicates and collection gaps. Export HTML, CSV and JSON reports. Works with Compass Google Maps Reviews Scraper datasets; missing reviews are not labeled as deleted.

- **URL**: https://apify.com/dataassetlab/google-reviews-collection-auditor.md
- **Developed by:** [Rafael](https://apify.com/dataassetlab) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$50.00 / 1,000 completed audit reports

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Reviews Collection Auditor

Compare two existing Google review exports before updating a reputation report. Identify identical duplicates, conflicting review records, newly observed IDs, rating/text/owner-response differences and reviews absent from the current sample. This Actor reads existing datasets; it does not scrape Google or launch paid scrapers.

### Who this is for

Reputation analysts and data teams already collecting Google reviews in Apify. Compare yesterday's export with today's before updating a client report. Get an HTML report, CSV events and machine-readable JSON without matching reviewers by name.

### Pricing

$0.05 per completed dataset comparison report containing at least one comparable review identity. One report can contain many events; the fee is not per review. Reports with warnings or no changed values still count as completed reports. Empty/unusable pairs and the synthetic demo have no Actor event fee. Google collection is separate and is NOT included. Platform usage treatment is shown in the Store pricing panel; subsequent storage operations can incur Apify charges.

### Quick start — existing Compass collections

1. Run Compass Google Maps Reviews Scraper twice, using the same places, sorting, language, filters and review limit. Wait for each run to finish. Personal data can be switched off.
2. In each completed run, open Storage > Dataset and copy its Dataset ID.
3. Here, select “Compare two existing Apify datasets”. Choose the older and newer dataset IDs and confirm the settings match.
4. Start this Actor with a budget that covers one report. Open Output > Visual audit report, or choose CSV comparison events / Full report.

No Google collection, AI model subscription or proxy is launched by this Actor. Do not paste API tokens into the input. Dataset selectors request read access only.

### Start with the demo

Run with `{"mode":"demo"}`. The synthetic example has three previous reviews and four current rows: one duplicate, one changed rating/text, one first-observed review and one previously observed review absent from the second sample. These are invented records, not a customer case.

### Compare your own datasets

Set mode to datasets and supply previousDatasetId and currentDatasetId. The two dataset IDs must be different. Each ID must be 17 alphanumeric characters. The run must have read permission to those datasets. No API token goes in the input. Use completed, stable exports; maximum 2,000 rows and 5 MB of selected fields per source. Larger inputs fail explicitly rather than silently processing an incomplete subset. Ordinary Apify compute/storage charges may apply.

The supported shape is one Google-native review per row from Compass Google Maps Reviews Scraper: placeId, reviewId, reviewOrigin="Google", stars, text, responseFromOwnerText, responseFromOwnerDate, publishedAtDate and scrapedAt when supplied. Nested reviews and third-party hotel reviews are not supported. Missing identity or origin and invalid field types are quarantined in ISSUES, never matched by reviewer name. When a rejected row has a valid place/review identity, that identity is excluded on both sides, including otherwise valid duplicates. This prevents a malformed row from being reported as absent or first observed. quarantinedIdentityCount includes these identities and conflicting duplicates; conflictingIdentityCount counts conflicting duplicates only.

### What the report means

- IDENTICAL_REVIEW_DUPLICATES: same place/review identity and compared values within one source. Repeated scrape timestamps do not create a content conflict.
- CONFLICTING_DUPLICATES: same identity but inconsistent tracked values. These are excluded from cross-snapshot events; the tool does not arbitrarily pick a winner.
- FIRST_OBSERVED_IN_COMPARISON: present only in the current comparable sample. NOT necessarily newly published on Google.
- NOT_OBSERVED_IN_CURRENT: absent from the second sample. NEVER evidence that Google deleted it.
- OBSERVED_VALUES_CHANGED: comparable non-null fields differ; source extraction changes can also cause this. Not a verified real-world edit.
- FIELD_COMPARISON_INCONCLUSIVE: a field is missing or moved between null and a value. Null is not proof that a reply was removed.

### Scope and completeness

Dataset pagination reads until an empty page within strict row/byte limits. Reported itemCount is checked before and after, but does not control how many pages are read; delayed counts and changes to modifiedAt are reported. Reading every stored row does not prove the upstream scraper collected every Google review. sameScopeConfirmed is the user's attestation of matching filters and collection settings, not an automatic inspection of upstream run inputs. Count drops are observations, not a universal quality threshold. Reviews appearing/disappearing due to date windows or caps must not be interpreted as additions/deletions.

### Output

Default dataset: comparison events. Key-value records: SUMMARY, REPORT, ISSUES and CANONICAL_CURRENT. Original review/reply texts are compared in memory but outputs retain hashes rather than those texts. Reviewer names, profile details and photos are excluded. IDs and other review metadata remain, so outputs are not anonymous. Canonical metadata is not a full-text review export. Source datasets are never altered.

No automatic historical state, alerts, emails, deletion, applications or scheduling. Compare another pair on each run. Do not schedule against actively growing datasets. Retention and access follow your Apify settings.

### Development

`python -m unittest discover -s tests` runs local tests; `python main.py --demo` prints the synthetic report without external libraries. Cloud uses pinned Apify SDK 3.4.1. Import these files at project root; .actor/actor.json describes the form. No proxies or language-model API needed.

### Sources checked 2026-10-25

https://apify.com/compass/google-maps-reviews-scraper/output-schema
https://docs.apify.com/api/client/python/reference/class/DatasetClient

Not affiliated with Google, Compass or Apify. No guarantee of review completeness, authenticity, exclusivity, sales or profit.

### Human-readable output

REPORT_HTML is a bounded, script-free preview of up to 1,000 events. EVENTS_CSV contains all comparison events and neutralizes spreadsheet formula prefixes. Full JSON remains in REPORT. `dataProvenance` identifies synthetic fixtures versus caller-supplied, unverified datasets. `syntheticDemo: null` for datasets means origin is unknown, not proof of real reviews. All Python dependencies are pinned in requirements.txt.

### Reliability and limits

Version 0.1.5. Two real Compass samples (10 reviews each, personal data off) were successfully compared on October 26, 2026. Larger synthetic tests exercise pagination and failure handling; these checks do not certify Google completeness or future availability. A review missing from a capped sample is never proof of deletion.

Billing is attempted once after output storage succeeds. A resurrected run with a prior billing attempt stops to prevent duplicate charging. If a charge response is uncertain, inspect that run rather than resurrecting it. Starting a new comparison is a new billable operation.

For problems, use the Store Issues tab with the run ID and a redacted input example. Never post tokens or private review text. This tool does not automatically repair source data.

# Actor input Schema

## `mode` (type: `string`):

Demo uses invented records and has no Actor event fee. Dataset comparisons cost $0.05 per completed report with comparable review IDs. Maximum 2,000 rows and 5 MB of selected fields per source.

## `previousDatasetId` (type: `string`):

17-character ID. Read-only access using run permissions. Do not paste a token.

## `currentDatasetId` (type: `string`):

17-character ID. Use completed, stable collections with Google-native review rows.

## `sameScopeConfirmed` (type: `boolean`):

Same places, date window, language, origin, sorting and item limits. The auditor does not independently inspect upstream run inputs.

## Actor input object example

```json
{
  "mode": "demo",
  "sameScopeConfirmed": false
}
```

# Actor output Schema

## `visualReport` (type: `string`):

No description

## `csv` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `report` (type: `string`):

No description

## `canonical` (type: `string`):

No description

## `events` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("dataassetlab/google-reviews-collection-auditor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("dataassetlab/google-reviews-collection-auditor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call dataassetlab/google-reviews-collection-auditor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dataassetlab/google-reviews-collection-auditor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/aHKxrJPBbyRdfrUmK/builds/yK4xfoVS9dahZbYvO/openapi.json
