리뷰 성과 측정

사업장의 리뷰 KPI를 조회하고, 일별 추이를 차트로 표시하고, 소스를 비교하고, 자주 등장하는 문구를 추출하고, 웹훅으로 일간 및 주간 스냅샷을 받습니다.

서로 관련된 3개의 엔드포인트는 KPI 개요, 일별 추이, 소스별 분석을 통해 사업장의 리뷰를 수치로 보여 줍니다. 4번째 엔드포인트는 고객이 반복해서 사용하는 문구를 나열합니다. 이 엔드포인트들을 함께 사용하면 성과 요약 타일, 추이 차트, 불만 패널을 구성할 수 있습니다.

1. 사업장의 KPI 조회

GET /locations/{locationId}/review-analytics-overview는 data.interactionsAnalyticsStats.stats에 4개의 통계를 반환합니다. 여기서 날짜 범위는 선택 사항이며, 값과 변화량을 계산하는 기간을 좁힙니다.

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 }      ]    }  }}
namevalue해석 방법
total-reviews개수사업장의 모든 리뷰입니다.
new-reviews개수해당 기간에 받은 리뷰입니다.
overall-rating1~5평균 별점입니다.
review-response-rate백분율소유자의 답글이 있는 리뷰의 비율입니다.

이전 기간이 없는 신규 계정에서는 delta가 100으로 보고되므로 첫 달의 변화량을 성장으로 해석하지 않아야 합니다.

2. 차트용 일별 추이 가져오기

GET .../review-analytics-timeline은 data.interactionsChartData.data에 하루당 1개의 항목을 반환합니다. startDate와 endDate를 항상 전달해야 하며, 그렇지 않으면 서비스가 자체적으로 기간을 선택합니다. 하나의 소스만 따로 표시하려면 site(maps.google.com 같은 호스트 이름)를 추가합니다.

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 }      ]    }  }}

interactionCount는 막대로, averageRating은 선으로 표시합니다. averageRating은 누적 평균이 아니라 해당 일의 평균이며, 리뷰가 없는 날에는 null이므로 0으로 표시하지 않고 빈 구간으로 남겨 둡니다.

3. 소스별 분석

GET .../review-analytics-sites-stats는 data.interactionsSitesStats.stats에 리뷰 소스당 1개의 항목을 반환합니다. 이를 사용하여 어떤 플랫폼이 평균에 영향을 주었는지 확인합니다.

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, newInteractions에는 각각 value와 delta가 포함됩니다. 다른 소스에는 변화가 없는데 하나의 averageRating.delta만 음수이면 특정 플랫폼에 원인이 있음을 시사하며, 모두 음수이면 매장에 원인이 있음을 시사합니다. newInteractions가 0이고 recency가 몇 달 전이면 일반적으로 소스 연결이 더 이상 정상적으로 작동하지 않는다는 뜻이므로, 사업장의 리뷰 소스 목록 조회를 확인하고 소스가 사라졌다면 리뷰 설정 수정으로 다시 추가합니다.

4. 고객이 사용하는 문구 찾기

GET /review-phrases는 data.newReviewPhrases에 일반 배열을 반환하며, 반복해서 등장하는 문구마다 개요와 동일한 통계 구조의 항목 1개가 포함되고 해당 문구가 들어 있는 리뷰만을 대상으로 계산됩니다. 불만 패널을 구성하려면 ratingFilters=[1,2]를 추가합니다. locationIds와 ratingFilters는 쿼리 문자열에 포함된 JSON 배열이므로 URL 인코딩해야 하며, SDK가 이를 자동으로 처리합니다.

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는 해당 문구가 얼마나 자주 등장하는지, overall-rating은 해당 리뷰가 만족감을 나타내는지, delta는 상황이 악화되고 있는지를 보여 줍니다. abs는 변화율과 함께 제공되는 절대 변화량입니다. SDK의 문구 메서드는 ratingFilters나 phraseCount를 노출하지 않으므로, 이 항목들이 필요하면 REST 호출을 사용합니다.

5. 웹훅으로 일간 및 주간 스냅샷 받기

웹훅 URL이 설정되어 있으면 review_analytics.daily_snapshot과 review_analytics.weekly_snapshot은 사업장별로 기간당 1번 발생합니다. 각각을 고정된 기간에 대해 계산한 개요 엔드포인트의 결과로 해석합니다. 해당 기간의 total_reviews는 total-reviews이고, new_reviews_in_period는 new-reviews이며, average_rating은 overall-rating이고, 직전 기간에 대한 previous_average_rating이 함께 제공됩니다. 답글 작성률, 일별 추이, 소스별 분석은 페이로드에 포함되지 않으므로, 필요하면 이벤트가 도착했을 때 위의 엔드포인트를 호출합니다.

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  }}

이 이벤트 그룹의 규모는 사업장 수에 비례합니다. 사업장이 400개이면 일간 이벤트 400개가 한꺼번에 발생하며, 요금제의 분당 한도를 초과하는 이벤트는 대기열에 들어가지 않고 삭제됩니다. 따라서 스냅샷이 누락되면 그 원인을 판단할 수 없습니다. 누락된 스냅샷을 절대로 0으로 기록하지 말고, 대신 해당 기간의 개요를 다시 조회합니다. 설정 방법은 웹훅으로 이벤트에 대응하기에 나와 있습니다.

다음 단계