Google Workspace Authorization Guide
This guide helps a Google Workspace administrator allow Town for an approved user population, and maps common Google authorization errors to the setting that is the likely cause.
Town uses per-user OAuth authorization. Town does not use Google Workspace domain-wide delegation. Two separate controls are involved:
| Control | Owner | Result |
|---|---|---|
| App access policy | Google Workspace administrator | Allows, limits, or blocks the Town OAuth client for the selected users |
| User consent | Each Town user | Grants Town access to that user’s Google account, within the admin policy |
An admin approval does not create a Town account or add a user to a Town team. A user approval does not override a Workspace policy.
Town’s OAuth client
| App name | Town |
| Client ID | 703322804526-hv17tegpd6af9gfuj1hqvnoddjioj724.apps.googleusercontent.com |
Use this exact client ID when configuring Town in Google Admin.
The client ID is public, not a secret. Never share or request the OAuth client secret — Town will never ask for it.
Choose an app access policy
Google Workspace provides four app access settings:
| Setting | What Google allows | Notes for Town |
|---|---|---|
| Specific Google data | Town can request only the scopes an admin selects | The least-data option. Include the full base scope set, plus each approved optional bundle. Update the allowlist before users enable a new Town Google capability. |
| Trusted | Town can request all Google Workspace services, including restricted services | Simplest to maintain if your organization accepts app-level trust. |
| Limited | Town can request only unrestricted Google services | Fragile for Town, because gmail.modify is a high-risk Gmail scope. |
| Blocked | Town cannot request Google data | No Town authorization is possible for the selected users. |
For a pilot, use one of two patterns:
- Least-data pattern — set Town to Specific Google data for the pilot population and add the complete base set. If your organization approves Drive or Contacts, add only the applicable bundle.
- App-trust pattern — set Town to Trusted for the pilot population, if your organization accepts the broader app policy.
Specific Google data is the narrowest option only when the scope list stays complete and current. A missing required scope can block sign-in or a Town feature.
Base permission set
Town requests the base set when a user connects their primary Google Workspace account. It supports identity, Gmail, Calendar, calendar availability, calendar discovery, and Workspace group expansion.
| Service | Exact scope | Purpose |
|---|---|---|
| OpenID Connect | openid | Identifies the signed-in Google account |
| OpenID Connect | email | Returns the account email in the identity token |
| OpenID Connect | profile | Returns the basic profile in the identity token |
| Google Sign-in | https://www.googleapis.com/auth/userinfo.email | Reads the Google account email |
| Google Sign-in | https://www.googleapis.com/auth/userinfo.profile | Reads the user’s name and profile image |
| Gmail | https://www.googleapis.com/auth/gmail.modify | Reads, drafts, sends, labels, and updates Gmail messages |
| Calendar | https://www.googleapis.com/auth/calendar.events | Reads and manages calendar events |
| Calendar | https://www.googleapis.com/auth/calendar.events.freebusy | Reads free/busy availability on calendars the user can access |
| Calendar | https://www.googleapis.com/auth/calendar.calendarlist.readonly | Lists calendars available to the user |
| Cloud Identity | https://www.googleapis.com/auth/cloud-identity.groups.readonly | Reads groups and members the Workspace user can access |
Notes:
gmail.modifyis classified as a high-risk Gmail scope in Google Admin. It is required for Town’s current Gmail capabilities, including actions that only read mail.- The Cloud Identity Groups scope lets Town expand a Workspace group for calendar workflows. It does not give Town domain-wide administrator access.
- Do not omit the sign-in scopes — Town always requests them to identify the connecting account, even when your review concerns only Gmail or Calendar data.
- Room-calendar directory access is a separate, admin-restricted capability. Do not add an Admin Directory room scope unless that feature is approved separately.
Optional capability bundles
Town uses progressive authorization for the primary account: a user can connect Gmail and Calendar without Drive or Contacts. With Specific Google data, allow an optional bundle before a user enables that feature.
Drive, Docs, Sheets, and Slides
Add all four scopes before a user enables the Drive integration. Google classifies the Drive and Docs scopes as high risk; they permit read and write actions in the connected user’s Google files.
| Service | Exact scope |
|---|---|
| Drive | https://www.googleapis.com/auth/drive |
| Docs | https://www.googleapis.com/auth/documents |
| Sheets | https://www.googleapis.com/auth/spreadsheets |
| Slides | https://www.googleapis.com/auth/presentations |
Google Contacts
Contacts is a separate optional enhancement. Add all three scopes before a user enables it.
| Service | Exact scope |
|---|---|
| Saved contacts, read | https://www.googleapis.com/auth/contacts.readonly |
| Other contacts, read | https://www.googleapis.com/auth/contacts.other.readonly |
| Saved contacts, write | https://www.googleapis.com/auth/contacts |
Secondary Google accounts
A new secondary Google connection requests the base set and the Drive bundle by default (Contacts remains a separate opt-in). If your organization uses Specific Google data, allow the Drive bundle before a user adds a secondary Google account.
Configure Town in Google Admin
Use an administrator account with the Security settings privilege.
Admin path: Security → Access and data control → API controls → Manage App Access
- Under Configured apps, select Configure new app.
- Enter Town’s production OAuth client ID (above).
- Select the result named Town and confirm the client ID matches exactly.
- If the policy applies to all users, keep the top organizational unit at Scope. Otherwise, select the organizational unit(s) that contain the pilot users.
- Select Specific Google data or Trusted according to your approved decision.
- For Specific Google data, add every scope in the base set, plus only the approved optional bundles.
- Review the client ID, organizational units, access setting, and scopes, then select Finish.
Notes on scope of the policy:
- The initial Configure new app wizard offers organizational units, not configuration groups. After the app exists, open its app information page and expand Access to Google data — in supported Google Admin editions an admin can then target a group. Verify this option is available in your Workspace edition before designing a group-based policy.
- If a child organizational unit already has an app policy, a later change at the top organizational unit does not replace that child policy.
- A Town team is not a Google Workspace policy boundary. Google applies the OAuth policy to the selected Workspace users, not to Town team membership.
- Configure Town explicitly by client ID; do not depend on your fallback policy for unconfigured apps.
- Changes can take up to 24 hours to propagate (usually sooner).
Verify the configured list
The access-level setup screen can show scopes the app requested in the past, which can be broader than the current policy. Open View details for Town to verify the scopes Google currently applies.
If Town adds a scope in the future, Town tells customers before users can enable the related capability — with Specific Google data, update the allowlist before the new request can succeed.
Context-Aware Access
If your organization applies Context-Aware Access levels to Workspace API access, a level assigned to a Google service can block Town’s API calls even after the app access policy allows Town.
If an exemption is required, follow Google’s exemption workflow :
- Configure Town by OAuth client ID and set it to Trusted for the approved organizational units.
- Select Exempt from having API access blocked by Context-Aware Access levels in the Town app access policy.
- Verify the exemption applies to the pilot users, then test from a device and network that represent the pilot policy.
If your organization does not use Context-Aware Access for Workspace API access, do not add an exemption.
Error-to-action matrix
The same screen can have more than one cause. Treat these mappings as likely causes, not proof — verify the effective user policy and the exact OAuth request.
| Error or symptom | Likely cause | Owner | First action |
|---|---|---|---|
access_not_configured or an admin-review block | Town is unconfigured, Limited conflicts with a restricted service, or Specific Google data lacks a scope | Workspace admin | Verify the client ID, effective user scope, access setting, and exact scope list |
admin_policy_enforced or “app is blocked” | Town is Blocked for the user’s effective policy, or another Workspace control denies access | Workspace admin | Open View details for the affected user’s organizational unit or group |
Town says Refresh permissions, or Google returns insufficientPermissions | The user declined a permission, the grant was revoked, the token is stale, or the admin allowlist lacks a scope | User and Workspace admin | Compare the consent grant with the admin scope list, then reconnect |
| ”Google hasn’t verified this app” | Town’s consent screen or Google verification state needs review | Town | Contact Town support with the exact error and OAuth client ID |
disallowed_useragent | Sign-in is running in an unsupported embedded browser | User or Town | Retry in a supported system browser; report the client if it continues |
Gmail API FAILED_PRECONDITION (“Precondition check failed”) on users/me/profile, or Town reports no Gmail mailbox | Gmail is not provisioned for that Workspace account | Workspace admin | Verify Gmail is enabled and licensed for the user |
accessNotConfigured in an API response | A required Google API is disabled in Town’s Google Cloud project | Town | Contact Town support with the API name, error, time, and client ID |
Also verify whether the user selected every required permission on Google’s consent screen — an incomplete user grant can look similar to an admin-policy failure after sign-in.
Workspace-side recovery
For access_not_configured, admin_policy_enforced, or a scope failure:
- Record the affected user’s primary email address and identify their organizational unit (and any configuration group that changes Town’s app access policy).
- In Manage App Access, find Town by the production OAuth client ID and open View details to verify the effective access setting for that user population.
- If the setting is Blocked, apply the approved Specific Google data or Trusted policy.
- If the setting is Specific Google data, compare every requested scope with the base and optional tables above.
- If the setting is Limited, review each requested Google service — a restricted service can block the request.
- If Context-Aware Access applies, verify Town is Trusted with the Context-Aware Access exemption selected.
- Verify Gmail is provisioned for the user.
- Ask the user to start a new Town connection in a supported browser, selecting every required permission.
Do not use repeated reconnect attempts as a substitute for checking the policy — a blocked or incomplete policy will produce the same failure again.
When to contact Town
The customer controls Workspace policy; Town controls the production OAuth project, consent-screen configuration, enabled Google APIs, and the scope request the product sends. Contact Town support when:
- The app name, publisher, or verification information looks incorrect, or Google reports the app is not verified.
- A Google API returns
accessNotConfiguredfor Town’s Cloud project. - The consent screen requests a scope that is not in the tables above.
- The client ID Google displays does not match the one printed in this guide.
- The error continues after the effective Workspace policy and user grant are verified.
Helpful evidence: the exact error code and text, date/time and time zone, the affected user (or an approved identifier), the client ID Google displayed, the Google service that failed, the browser used, a screenshot with tokens and unrelated personal data removed, the effective app access setting and target organizational unit or group, and whether Context-Aware Access applies.
Never send authorization codes, access tokens, refresh tokens, session cookies, or passwords in a support request. Customers should not create or edit a Google Cloud project for Town.
Verification checklist
Before the pilot starts:
- The configured app is named Town and matches the production OAuth client ID above (reviewed by client ID, not app name alone).
- View details shows Specific Google data or Trusted for the pilot users.
- If Specific Google data is used, every base scope is present — plus the Drive bundle (four scopes) and/or Contacts bundle (three scopes) if approved, and the Drive bundle if secondary Google accounts will be added.
- If Context-Aware Access applies, Town is Trusted and its app access policy contains the Context-Aware Access exemption.
Then run a controlled user test: one pilot user connects in a supported browser, selects every required permission, and confirms Town shows the account as connected, can list calendars, read free/busy availability, and complete a Gmail draft test. Test each approved optional feature only after its scope bundle is allowed.
Google references
- Control which apps access Google Workspace data
- Control which third-party and internal apps access Google Workspace data
- About Context-Aware Access
- Exempt trusted third-party apps from Context-Aware Access API blocks
- Handle Google OAuth errors
Google Admin labels and available controls vary by Workspace edition and can change over time. Verify the labels in the current Admin console before a production rollout.
Town