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
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
POST /api/v1/signup/account/business
Authentication
-
No bearer token required.
-
Public — send no
Authorizationheader. Thesignup_account_ididentifies the in-progress signup.
Rate limit
- 10 requests/min per IP.
Field naming. Most fields usesnake_case, butmapsUriandnewReviewUriarecamelCase. 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
| Field | Type | Required | Description |
|---|---|---|---|
signup_account_id | integer | Required | The signup activation id. |
google_access_token_id | integer | Required | the Google connection's id of the connected Google account. |
business_name | string | Required | ≤100 chars; no angle brackets. |
account_name | string | Required | ≤100 chars; Google account resource name. |
address1 | string | Optional | ≤255 chars. Defaults to Address Missing when empty. |
address2 | string | Optional | ≤255 chars. |
country_code | string | Optional | ISO country code; when you omit it the store falls back to a default city. |
state | string | Optional | Resolves the city row together with country_code/city. |
city | string | Optional | Resolves the city row together with country_code/state. |
postal_code | string | Optional | Defaults to 92014 when empty. |
google_place_id | string | Required | Google Place ID. |
location_name | string | Required | Google location resource name. |
mapsUri | string | Required | Google Maps URI. |
newReviewUri | string | Required | Google "write a review" URI. |
website_uri | string | Optional | Business 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
businessobject. - 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.
Thebusiness.google_access_tokenfield 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.businessreturns every stored business column plus the eager-loadedcityobject (with itsstateandcountry),google_access_token, andgoogle_access_token_id; the example shows a representative subset.
200 OK · 200
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
400{
"message": "Bad Request",
"status": "error",
"errors": "Missing city/state/country from the GMB location."
}Errors
| Status | Meaning |
|---|---|
400 | Missing city/state/country |
422 | The request failed validation — the response names the fields |
500 | Returned 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"}'Updated 10 days ago
