Google connection activity

Overview

Get the connection events for every location under your partner, with funnel counts: sign-ins started, connections, failed sign-ins, sign-ins that found no locations, and disconnects.

Use this to follow up with owners who haven't finished connecting.

You'll need a partner token; filter by date or account.

Returns the event feed and the funnel totals. The totals count every event that matches your filters, not just the current page. Events are newest first, and paginated.

Prerequisites

  • A Partner token. See Authentication.
  • Optional: an account id (company_id) or a location id (store_id) to filter by.

Base URL

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://development-api.shoutaboutus.com

Endpoint

GET /api/v1/partner/gbp-connection-events

Authentication

Partner token

  • Returns only events for your own partner. A company_id or store_id from outside your partner matches nothing.
  • Any other token gets 403.

Rate limit

This endpoint has no rate limit.

Request parameters

ParameterInTypeRequiredDescription
fromquerystring (date)NoOnly events on or after this day, for example 2026-06-01.
toquerystring (date)NoOnly events up to and including this day. Must be on or after from.
eventquerystringNoOne event type: oauth.started, oauth.denied, oauth.callback_error, token.exchange_failed, token.scope_not_granted, token.refresh_failed, locations.fetched, locations.none_found, connection.connected, connection.reconnected, connection.account_switched, connection.disconnected_manual, connection.disconnected_auto, respond.opted_in or respond.opted_out.
sourcequerystringNoWhere the event happened: invite_link, connect_google_page, registration, settings, debugger, app, system or unknown.
company_idqueryintegerNoOnly events for this account and every location under it.
store_idqueryintegerNoOnly events for this location.
searchquerystringNoPart of the connected Google account's email address. Up to 255 characters.
pagequeryintegerNoPage number, from 1. Default 1.
limitqueryintegerNoEvents per page, 10 to 100. Default 10. Values below 10 are raised to 10; above 100 returns 422.

Request body

None.

Request payload

None.

Response body

The payload is inside data.

FieldTypeDescription
kpis.logins_startedintegerGoogle sign-ins started (oauth.started).
kpis.connectionsintegerLocations connected, reconnected or switched to another Google location.
kpis.failed_loginsintegerSign-ins that failed: declined consent, callback errors, failed token exchanges, missing permissions.
kpis.no_locations_foundintegerSign-ins where the Google account had no locations.
kpis.disconnectsintegerDisconnections, by the user or because the connection was lost.
events.data[]arrayThe events on this page, newest first.
events.data[].idintegerThe event's id.
events.data[].eventstringThe event type (see event above).
events.data[].sourcestring or nullWhere it happened (see source above).
events.data[].store_idinteger or nullThe location's id.
events.data[].store_namestring or nullThe location's name.
events.data[].google_emailstring or nullThe Google account's email address.
events.data[].error_codestring or nullThe error code, for failed events.
events.data[].messagestring or nullThe error message, for failed events.
events.data[].detailsstringA readable summary of the event, with any error code and message after it.
events.data[].user_emailstring or nullThe email of the user who triggered the event.
events.data[].created_atstringWhen the event happened (ISO 8601).
events.current_pageintegerThe page number.
events.per_pageintegerEvents per page.
events.totalintegerEvents matching your filters.
events.last_pageintegerThe last page number.
events.from / events.tointeger or nullThe positions of the first and last event on this page.
events.first_page_url / events.last_page_url / events.next_page_url / events.prev_page_urlstring or nullPage links. next_page_url and prev_page_url are null at the ends.
events.pathstringThe endpoint URL without the query string.
events.linksarrayPage links for a pager: url, label, active.

Response payload

{
  "data": {
    "kpis": {
      "logins_started": 42,
      "connections": 30,
      "failed_logins": 7,
      "no_locations_found": 3,
      "disconnects": 2
    },
    "events": {
      "current_page": 1,
      "data": [
        {
          "id": 101,
          "event": "connection.connected",
          "source": "invite_link",
          "store_id": 3007,
          "store_name": "Acme Coffee Downtown",
          "google_email": "[email protected]",
          "error_code": null,
          "message": null,
          "details": "Location connected successfully",
          "user_email": "[email protected]",
          "created_at": "2026-07-07T09:15:00+00:00"
        },
        {
          "id": 100,
          "event": "token.exchange_failed",
          "source": "connect_google_page",
          "store_id": 3008,
          "store_name": "Acme Coffee Uptown",
          "google_email": null,
          "error_code": "invalid_grant",
          "message": "Auth code expired",
          "details": "invalid_grant — Auth code expired",
          "user_email": null,
          "created_at": "2026-07-07T08:02:11+00:00"
        }
      ],
      "first_page_url": "https://production-api.shoutaboutus.com/api/v1/partner/gbp-connection-events?page=1",
      "from": 1,
      "last_page": 9,
      "last_page_url": "https://production-api.shoutaboutus.com/api/v1/partner/gbp-connection-events?page=9",
      "links": [
        {
          "url": null,
          "label": "« Previous",
          "active": false
        },
        {
          "url": "https://production-api.shoutaboutus.com/api/v1/partner/gbp-connection-events?page=1",
          "label": "1",
          "active": true
        },
        {
          "url": "https://production-api.shoutaboutus.com/api/v1/partner/gbp-connection-events?page=2",
          "label": "Next »",
          "active": false
        }
      ],
      "next_page_url": "https://production-api.shoutaboutus.com/api/v1/partner/gbp-connection-events?page=2",
      "path": "https://production-api.shoutaboutus.com/api/v1/partner/gbp-connection-events",
      "per_page": 10,
      "prev_page_url": null,
      "to": 10,
      "total": 84
    }
  }
}

Examples

Success payload

See Response payload.

Error payload

403 Not a Partner token

{
  "message": "Only partner-level users can view Google connection activity.",
  "status": "error",
  "errors": []
}

422 Invalid filters

{
  "message": "The to field must be a date after or equal to from. (and 1 more error)",
  "errors": {
    "to": [
      "The to field must be a date after or equal to from."
    ],
    "event": [
      "The selected event is invalid."
    ]
  }
}

422 limit above 100

{
  "message": "The limit field must not be greater than 100.",
  "errors": {
    "limit": [
      "The limit field must not be greater than 100."
    ]
  }
}
StatusMeaning
200The totals and a page of events.
401The token is missing, expired or invalid.
403The token isn't a Partner token.
422A filter is invalid, or limit is above 100.
500Unexpected server error.

Example request

curl --request GET \
  --url "https://production-api.shoutaboutus.com/api/v1/partner/gbp-connection-events?from=2026-06-01&to=2026-06-30&page=1&limit=10" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json'

Did this page help you?