Misura le prestazioni delle recensioni

KPI delle recensioni per sede: traccia l’andamento giornaliero, confronta fonti, trova frasi comuni e ricevi sintesi quotidiane e settimanali via webhook.

Tre endpoint correlati descrivono le recensioni di una sede in termini numerici: una panoramica dei KPI, un andamento giornaliero e una ripartizione per fonte. Un quarto elenca le espressioni che i clienti ripetono. Insieme sono sufficienti per un riquadro con gli indicatori, un grafico delle tendenze e un pannello dei reclami.

1. Leggi i KPI di una sede

GET /locations/{locationId}/review-analytics-overview restituisce quattro statistiche in data.interactionsAnalyticsStats.stats. Qui l'intervallo di date è facoltativo; restringe il periodo su cui vengono calcolati i valori e le variazioni.

Overview
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/review-analytics-overview?startDate=2026-08-01&endDate=2026-08-31" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionsAnalyticsStats": {      "stats": [        { "name": "total-reviews", "value": 128, "delta": 6.67 },        { "name": "new-reviews", "value": 9, "delta": -25 },        { "name": "overall-rating", "value": 4.43, "delta": 2.31 },        { "name": "review-response-rate", "value": 62.5, "delta": 12.5 }      ]    }  }}
namevalueInterpretalo come
total-reviewsconteggioTutte le recensioni della sede.
new-reviewsconteggioRecensioni ricevute nel periodo.
overall-ratingda 1 a 5Valutazione media in stelle.
review-response-ratepercentualePercentuale di recensioni con una risposta del proprietario.

Un account appena creato senza un periodo precedente riporta un delta pari a 100, quindi non interpretare le variazioni del primo mese come crescita.

2. Recupera l'andamento giornaliero per un grafico

GET .../review-analytics-timeline restituisce una voce per giorno in data.interactionsChartData.data. Passa sempre startDate e endDate, altrimenti il servizio sceglie autonomamente il periodo. Aggiungi site (un hostname come maps.google.com) per rappresentare una singola fonte.

Timeline
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/review-analytics-timeline?startDate=2026-08-01&endDate=2026-08-31" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionsChartData": {      "data": [        { "date": "2026-08-01", "interactionCount": 4, "averageRating": 4.5 },        { "date": "2026-08-02", "interactionCount": 0, "averageRating": null },        { "date": "2026-08-03", "interactionCount": 7, "averageRating": 4.285714285714286 }      ]    }  }}

Rappresenta interactionCount con barre e averageRating con una linea. averageRating è la media di quel giorno, non una media progressiva, ed è null nei giorni senza recensioni, quindi lascia un'interruzione anziché rappresentare uno zero.

3. Analizza i dati per fonte

GET .../review-analytics-sites-stats restituisce una voce per fonte delle recensioni in data.interactionsSitesStats.stats. Usalo per vedere quale piattaforma ha modificato la media.

By source
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/review-analytics-sites-stats?startDate=2026-08-01&endDate=2026-08-31" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "interactionsSitesStats": {      "stats": [        {          "key": "google",          "siteUrl": "maps.google.com",          "averageRating": { "value": 4.6, "delta": 2.2 },          "totalInteractions": { "value": 412, "delta": 6.1 },          "newInteractions": { "value": 24, "delta": 33.3 },          "recency": "2026-09-06T14:12:00Z",          "humanizedRecency": "3 days ago"        },        {          "key": "facebook",          "siteUrl": "facebook.com",          "averageRating": { "value": 4.1, "delta": -1.4 },          "newInteractions": { "value": 0, "delta": -100 },          "recency": null,          "humanizedRecency": null        }      ]    }  }}

averageRating, totalInteractions e newInteractions contengono ciascuno un value e un delta. Un solo averageRating.delta negativo, con gli altri invariati, indica un problema su una piattaforma; se sono tutti negativi, indica un problema nel punto vendita. Un newInteractions pari a 0 con un recency risalente a mesi prima di solito significa che la connessione alla fonte non è più attiva, quindi controlla Elenca le fonti delle recensioni di una sede e aggiungi di nuovo la fonte con Modifica le impostazioni delle recensioni se non è più presente.

4. Trova le espressioni usate dai clienti

GET /review-phrases restituisce un semplice array in data.newReviewPhrases, con una voce per ogni espressione ricorrente e la stessa struttura delle statistiche della panoramica, calcolate solo sulle recensioni che la contengono. Aggiungi ratingFilters=[1,2] per un pannello dei reclami. locationIds e ratingFilters sono array JSON nella query string, quindi devono essere codificati per l'URL; gli SDK lo fanno per te.

Phrases
curl -G "https://listingsapi.com/api/v4/review-phrases" \-H "Authorization: API $LISTINGSAPI_KEY" \--data-urlencode 'locationIds=[1800289]' \--data-urlencode 'ratingFilters=[1,2]' \--data-urlencode 'startDate=2026-06-01' \--data-urlencode 'endDate=2026-08-31' \--data-urlencode 'phraseCount=10'
JSON
{  "data": {    "newReviewPhrases": [      {        "reviewPhrase": "long wait",        "phraseStats": {          "stats": [            { "name": "total-reviews", "value": 11, "delta": 37.5, "abs": 3 },            { "name": "overall-rating", "value": 2.9, "delta": -8.4, "abs": -0.27 }          ]        }      }    ]  }}

total-reviews indica quanto spesso compare l'espressione, overall-rating indica se quelle recensioni esprimono soddisfazione e delta indica se la situazione sta peggiorando. abs è la variazione assoluta che affianca quella percentuale. I metodi degli SDK per le espressioni non espongono ratingFilters o phraseCount, quindi usa la chiamata REST quando ti servono.

5. Ricevi riepiloghi giornalieri e settimanali tramite webhook

Con un URL per i webhook configurato, review_analytics.daily_snapshot e review_analytics.weekly_snapshot vengono attivati una volta per sede per periodo. Interpreta ciascuno come il risultato dell'endpoint della panoramica calcolato per un periodo fisso: total_reviews è total-reviews, new_reviews_in_period è new-reviews e average_rating è overall-rating per quel periodo, con previous_average_rating per quello precedente. Il tasso di risposta, l'andamento giornaliero e la ripartizione per fonte non sono inclusi nel payload; chiama gli endpoint indicati sopra quando arriva l'evento, se ti servono.

JSON
{  "event": "review_analytics.weekly_snapshot",  "timestamp": "2026-08-24T02:00:00Z",  "account_id": 11073,  "location_id": "279381",  "data": {    "period": "2026-08-17",    "granularity": "weekly",    "total_reviews": 1237,    "new_reviews_in_period": 18,    "average_rating": 4.6123,    "previous_average_rating": 4.5901  }}

Il volume di questa famiglia di eventi cresce con il numero delle tue sedi: 400 sedi significano 400 eventi giornalieri in un unico blocco, e gli eventi che superano il limite al minuto del tuo piano vengono scartati, non messi in coda. L'assenza di un riepilogo è quindi ambigua. Non registrare mai uno zero in sua assenza; rileggi invece la panoramica per quel periodo. La configurazione è descritta in Reagisci agli eventi con i webhook.

Passaggi successivi