URL: /code/integrations/google-business-profile · Id: `page:/code/integrations/google-business-profile`

# Google Business Profile

> Your agents keep your listing current, post updates, and answer every review and question as the business within the hour.

Your agents keep your listing current, post updates, and answer every review and question as the business within the hour.

```text title="Run it · Ask"
Draft the answer to Ray’s five-star review, as the business.
```

```ts title="Run it · SDK"
import { $ } from 'startup-builder'

const result = await $.try.Conversation.answer({ conversation: 'conversations/review-ray', body: 'Thank you, Ray. Glad the reminders cut your chasing to one text a month.' })
```

```json title="Run it · Response"
{
  "$type": "Conversation",
  "mode": "try",
  "stored": false,
  "venue": "google-business-profile",
  "review": {
    "rating": 5,
    "author": "Ray",
    "body": "Set it up in an afternoon. Late rent went from a weekly chore to a monthly one."
  },
  "answer": "Thank you, Ray. Glad the reminders cut your chasing to one text a month.",
  "showsAs": "Response from the owner"
}
```

- **Connect:** Sign in once, 1 grant
- **Runs through:** [Your account](/code/integrations#three-ways)
- **First run:** Read the last 28 days of calls, website clicks and searches, free on your account
- **Sites:** [Google Business Profile](/venues#google-business-profile)

## Connect once
1. Call `Integration.connect` with `system: 'sites-and-content'` and `venue: 'google-business-profile'`, then open the `connectUrl` it returns and sign in as an owner or manager of the profile.
2. Pick the profile; a new one starts Google’s verification, and your agents post once Google verifies it.

| Grant | What it unlocks | Scope |
| --- | --- | --- |
| Manage your profile | Hours, categories and links, updates, photos, and answers to reviews and questions | `https://www.googleapis.com/auth/business.manage` |

| To | Do this |
| --- | --- |
| Pause | `Integration.pause` stops every call through Google at once and keeps the token; `Integration.resume` picks up from the same cursor. |
| Reconnect | `Integration.reconnect` returns a fresh `connectUrl` that lasts one hour, and keeps the Integration's id and cursor, so nothing imports twice. |
| Disconnect | `Integration.revoke` revokes the token with Google; every record it brought in stays in your records. |

## What your agents do
| Ask | Verb | Runs through | Price |
| --- | --- | --- | --- |
| Answer each new review as the business. | [`Conversation.answer`](https://startupbuilder.dev/business/nouns/conversation/answer) | Your account | Free |
| Post this week’s update with the new template. | [`Post.publish`](/code/apps/social/publish) | Your account | Free |
| How many calls, website clicks and direction requests did the profile get this month, and from which searches? | [`Metric.query`](/code/apps/analytics-and-experiments/query) | Your account | Free |
| Change our hours for the holiday week. | [`Integration.call`](/code/integrations/calls/call) | Your account | Free |

Calls on your own account are free.

## What it holds
| Noun | The account’s object | When | Which side leads |
| --- | --- | --- | --- |
| [Review](https://startupbuilder.dev/business/nouns/review) | `review` | A customer leaves one | The account |
| [Post](https://startupbuilder.dev/business/nouns/post) | `localPost` | Your agent posts an update | Your records |
| [Message](https://startupbuilder.dev/business/nouns/message) | `reviewReply` | Your agent answers a review | Your records |

## Events and webhooks
| Direction | Event |
| --- | --- |
| Emits | `Conversation.answered`, `Post.published`, `Review.created` |
| Hears `NEW_REVIEW` | Becomes `Review.created` |

Any Event can wake a Workflow, and a Watch delivers it to your endpoint, signed ([Events and webhooks](/code/events)).

## Limits
| What | Limit | Call |
| --- | --- | --- |
| A new profile | Shows nothing your agents post until Google verifies it | [`Post.publish`](/code/apps/social/publish) |
| Review answers | Show publicly under the review, as the business; the agent drafts one within the hour of the review | [`Conversation.answer`](https://startupbuilder.dev/business/nouns/conversation/answer) |

## Field map
| Our field | Google Business Profile’s field | Notes | Calls |
| --- | --- | --- | --- |
| `Post.body` | `localPost.summary` | None. | [`Post.publish`](/code/apps/social/publish) |
| `Post.link` | `localPost.callToAction.url` | None. | [`Post.publish`](/code/apps/social/publish) |
| `Post.media` | `localPost.media` | None. | [`Post.publish`](/code/apps/social/publish) |

## What try does here
Returns the update or the answer as it will show on your profile; nothing posts.

## How long a connection lasts
A connection lasts until you revoke it in your Google Account; Google also ends a grant left unused for six months, and every call your agents make counts as use.

The platform asks you to reconnect 7 days before it runs out; until you do, a call that needs it refuses with [`needs-reauth`](/code/refusals#needs-reauth).

## Plays and strategies
| Kind | Where |
| --- | --- |
| Plays | [Directory listings](/plays/directory-listings), [Review requests](/plays/review-requests), [Outbound calling](/plays/outbound-calling) |
| Strategies | [Launch and search](/strategy/launch-and-search) |

## Used by
No Workflow, agent task or Service acts through it yet: your agents call it directly.

## Reference

| Call | Path | Price |
| --- | --- | --- |
| [`Conversation.answer`](https://startupbuilder.dev/business/nouns/conversation/answer) | `POST /conversations/answer` | Free |
| [`Post.publish`](/code/apps/social/publish) | `POST /posts/publish` | Free |
| [`Metric.query`](/code/apps/analytics-and-experiments/query) | `POST /metrics/query` | Free |
| [`Integration.call`](/code/integrations/calls/call) | `POST /integrations/call` | Free |