Google Tag Manager - v1.0.0
Google Base Package
This page covers only the parts of the base artisanpack-ui/google setup that matter for the Tag Manager integration. The base package's own docs are the source of truth for OAuth details.
Why it's required
The base package owns:
- OAuth2 authorization-code + PKCE flow
- Encrypted access and refresh token storage on the
google_connectionstable - The scope registry that pools scopes from every installed Google service package
- Transparent token refresh via
TokenManager
Every server-side call this package makes to the Tag Manager API is authenticated by a token the base package hands out. Without the base package configured, TagManagerClient throws BaseNotInstalledException and the routes return 501.
What to do
-
Install the base package — done automatically by this package's Composer dependency.
-
Publish migrations and migrate:
php artisan vendor:publish --tag=google-migrations php artisan migrate -
Enable the Tag Manager API on your Google Cloud project. Under APIs & Services → Library, find "Tag Manager API" and click Enable. Without this, every API call returns
403regardless of the scope. -
Add the scope on the OAuth consent screen. Add
https://www.googleapis.com/auth/tagmanager.readonlyunder APIs & Services → OAuth consent screen → Scopes. The package contributes this scope to the base package's scope registry automatically, but Google's consent screen must also know about it or the user will see a "scope not authorized" error. -
Register your OAuth client via your chosen credential driver on the base package (
config,database, orcms). -
Connect a user through the base package's connect flow. The consent screen will include Tag Manager read-only access alongside every other Google service scope the app requests.
Verifying
From tinker:
$user = \App\Models\User::find( 1 );
$connection = $user->googleConnection;
// The scope should be present:
in_array( 'https://www.googleapis.com/auth/tagmanager.readonly', $connection->granted_scopes ?? [], true );
// The client should be able to list accounts:
$client = app( \ArtisanPackUI\GoogleTagManager\Api\TagManagerClient::class );
$accounts = $client->listAccounts( $connection );
If listAccounts throws:
BaseNotInstalledException— base package isn't fully installed. Checkcomposer show artisanpack-ui/google.ApiExceptionwithapiError() === 401— token is invalid. Ask the user to reconnect via the base package.ApiExceptionwithapiError() === 403— the Tag Manager API isn't enabled on your Cloud project, or the connected user doesn't have access to any GTM containers.