Save Google Business location (step 3 — Google path)

Overview

Completes self-service signup on the Google path. Call this after the user picks one of their Google Business Profile locations.

It attaches that location to the signup and resolves the city, state and country from the address. It then provisions the account, its location, its store and its plan. Finally it marks the signup Active and returns the full signup snapshot.

The call is synchronous and runs inside a database transaction, so a failure at any step rolls the whole thing back and creates nothing.

Prerequisites

  • No authentication — this endpoint is public.

Base URL

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

Endpoint

POST /api/v1/signup/account/business

Authentication

  • No bearer token required.

  • Public — send no Authorization header. The signup_account_id identifies the in-progress signup.

Rate limit

  • 10 requests/min per IP.
📘

Field naming. Most fields use snake_case, but mapsUri and newReviewUri are camelCase. That is deliberate: those two come straight from Google's Business Profile API, so this endpoint accepts them under Google's own names. Send them exactly as shown.

Request body

FieldTypeRequiredDescription
signup_account_idintegerRequiredThe signup activation id.
google_access_token_idintegerRequiredthe Google connection's id of the connected Google account.
business_namestringRequired≤100 chars; no angle brackets.
account_namestringRequired≤100 chars; Google account resource name.
address1stringOptional≤255 chars. Defaults to Address Missing when empty.
address2stringOptional≤255 chars.
country_codestringOptionalISO country code; when you omit it the store falls back to a default city.
statestringOptionalResolves the city row together with country_code/city.
citystringOptionalResolves the city row together with country_code/state.
postal_codestringOptionalDefaults to 92014 when empty.
google_place_idstringRequiredGoogle Place ID.
location_namestringRequiredGoogle location resource name.
mapsUristringRequiredGoogle Maps URI.
newReviewUristringRequiredGoogle "write a review" URI.
website_uristringOptionalBusiness website URL.
{
  "signup_account_id": 101,
  "google_access_token_id": 5,
  "business_name": "Acme Plumbing",
  "account_name": "accounts/123456789",
  "address1": "123 Main St",
  "address2": "Suite 4",
  "country_code": "US",
  "state": "California",
  "city": "San Diego",
  "postal_code": "92014",
  "google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
  "location_name": "locations/987654321",
  "mapsUri": "https://maps.google.com/?cid=123",
  "newReviewUri": "https://search.google.com/local/writereview?placeid=ChIJN1t_tDeuEmsRUsoyG83frY4",
  "website_uri": "https://acmeplumbing.com"
}

How it works

  • 200 returns the signup snapshot, now including a business object.
  • 400 when the selected Google location has no city, state or country the platform can resolve.
  • 500 when provisioning fails. The transaction rolls back, so no partial account is left behind.

This call also creates the account, location, store and plan records. It queues the first review pull for the new store. It also emails a referral notification when the signup came through a referral link.

🚧

The business.google_access_token field carries a live Google OAuth access token. The signup wizard uses it to read the user's Google locations from the browser. Treat it as a credential: do not log it, and do not persist it outside the signup session.

Response

  • data.business returns every stored business column plus the eager-loaded city object (with its state and country), google_access_token, and google_access_token_id; the example shows a representative subset.

200 OK · 200

{
  "data": {
    "message": "The account has been successfully created. You can either log in to the platform or proceed to the feature options.",
    "account": {
      "id": 101,
      "email": "[email protected]",
      "email_verified_at": "2026-07-09T08:15:00.000000Z",
      "first_name": "Jane",
      "last_name": "Doe",
      "mobile": "+11234567890",
      "plan_id": 3,
      "plan_group_name": "Starter",
      "referral_code": "REF123",
      "referral_company_id": 5,
      "referral_company_name": "Acme Partner",
      "step": "feature_options",
      "who_will_pay": "brand",
      "hear_about_us": "Referral",
      "hear_others": null,
      "hide_password": null,
      "show_skip_google_connect_button": 0
    },
    "user": {
      "id": 4021
    },
    "business": {
      "id": 55,
      "signup_activation_id": 101,
      "business_name": "Acme Plumbing",
      "account_name": "accounts/123456789",
      "address1": "123 Main St",
      "address2": "Suite 4",
      "city_id": 133682,
      "postal_code": "92014",
      "google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
      "location_name": "locations/987654321",
      "store_id": 8801,
      "google_access_token": "<google-access-token>",
      "google_access_token_id": 5
    },
    "feature_options": null,
    "meta_data": null
  }
}

400 Missing city/state/country · 400

{
  "message": "Bad Request",
  "status": "error",
  "errors": "Missing city/state/country from the GMB location."
}

Errors

StatusMeaning
400Missing city/state/country
422The request failed validation — the response names the fields
500Returned when provisioning fails

Example request

curl --request POST \
  --url "https://production-api.shoutaboutus.com/api/v1/signup/account/business" \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"signup_account_id": 101, "google_access_token_id": 5, "business_name": "Acme Plumbing", "account_name": "accounts/123456789", "address1": "123 Main St", "address2": "Suite 4", "country_code": "US", "state": "California", "city": "San Diego", "postal_code": "92014", "google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4", "location_name": "locations/987654321", "mapsUri": "https://maps.google.com/?cid=123", "newReviewUri": "https://search.google.com/local/writereview?placeid=ChIJN1t_tDeuEmsRUsoyG83frY4", "website_uri": "https://acmeplumbing.com"}'

Did this page help you?