Google Cloud Storage
Adding and configuring a Google Cloud Storage connection within Qualytics empowers the platform to build a symbolic link with your file system to perform operations like data discovery, visualization, reporting, syncing, profiling, scanning, anomaly surveillance, and more.
This documentation provides a step-by-step guide on how to add Google Cloud Storage as both a source and enrichment datastore in Qualytics. It covers the entire process, from initial connection setup to testing and finalizing the configuration.
By following these instructions, enterprises can ensure their Google Cloud Storage environment is properly connected with Qualytics, unlocking the platform's potential to help you proactively manage your full data quality lifecycle.

Let’s get started 🚀
Google Cloud Storage Setup Guide
This guide walks you through what you need from Google Cloud before adding the datastore to Qualytics: the bucket URI and a service account key.
Retrieve the Google Cloud Storage URI
To retrieve the Cloud Storage URI, follow the given steps:
- Go to the Cloud Storage Console.
- Navigate to the location of the object (file) that holds the source data.
- At the top of the Cloud Storage console, locate and note down the path to the object.
- Create the URI using the following format:
The URI stops at the bucket. You choose the folder inside it with Root Path when you add the datastore, so do not append a path here.
Create a Service Account Key
The connector authenticates with a service account key, which you upload as a JSON file when you add the datastore. To create one:
Step 1: In the Google Cloud console, open IAM & Admin, then Service Accounts, and select the project that owns the bucket.
Step 2: Click Create Service Account, give it a name, and create it. You can skip the optional project-level role step, because the role that matters is granted on the bucket, as described below.
Step 3: Open the service account, go to its Keys tab, and click Add Key, then Create new key.
Step 4: Choose JSON and create the key. The file downloads once and cannot be downloaded again, so store it somewhere safe.
Step 5: Grant the service account the role it needs on the target bucket, per the privileges below.
Warning
The key file grants access to your bucket. Store it securely and upload it only to the Qualytics connection form.
Datastore Google Cloud Storage Privileges
The permissions required depend on whether you are using Google Cloud Storage as a source or an enrichment datastore. Qualytics accesses the bucket with the service account whose key you upload.
Minimum Permissions (Source Datastore)
The service account must have the following permissions:
| Permission | Purpose |
|---|---|
storage.buckets.get |
Validate the bucket exists and retrieve its metadata |
storage.objects.get |
Read file contents for profiling and scanning |
storage.objects.list |
List files in the bucket to discover data assets |
Tip
You can grant these permissions by assigning the Storage Object Viewer (roles/storage.objectViewer) role to the service account on the target bucket.
Additional Permissions for Enrichment Datastore
When using Google Cloud Storage as an enrichment datastore, the following additional permissions are required:
| Permission | Purpose |
|---|---|
storage.objects.create |
Write enrichment result files |
storage.objects.delete |
Remove temporary or outdated enrichment files |
Tip
You can grant all required permissions (read + write) by assigning the Storage Object Admin (roles/storage.objectAdmin) role to the service account on the target bucket.
Example IAM Policy
Replace <SERVICE_ACCOUNT_EMAIL> and <BUCKET_NAME> with your actual values.
Source Datastore (Read-Only)
{
"bindings": [
{
"role": "roles/storage.objectViewer",
"members": [
"serviceAccount:<SERVICE_ACCOUNT_EMAIL>"
]
}
]
}
Enrichment Datastore (Read-Write)
{
"bindings": [
{
"role": "roles/storage.objectAdmin",
"members": [
"serviceAccount:<SERVICE_ACCOUNT_EMAIL>"
]
}
]
}
Tip
If you need both storage.buckets.get and object-level permissions but want to avoid a broader role, you can create a custom role with only the specific permissions listed in the Minimum Permissions section.
Assigning via gcloud CLI
# Source Datastore (Read-Only)
gsutil iam ch \
serviceAccount:<SERVICE_ACCOUNT_EMAIL>:roles/storage.objectViewer \
gs://<BUCKET_NAME>
# Enrichment Datastore (Read-Write)
gsutil iam ch \
serviceAccount:<SERVICE_ACCOUNT_EMAIL>:roles/storage.objectAdmin \
gs://<BUCKET_NAME>
Tip
You can also assign roles through the Google Cloud Console by navigating to the bucket, selecting Permissions, and clicking Grant Access.
GCS Roles Summary
| Role | Use Case | Permissions Included |
|---|---|---|
roles/storage.objectViewer |
Source Datastore | storage.objects.get, storage.objects.list, storage.buckets.get |
roles/storage.objectAdmin |
Enrichment Datastore | storage.objects.get, storage.objects.list, storage.objects.create, storage.objects.delete, storage.buckets.get |
Troubleshooting Common Errors
| Error | Likely Cause | Fix |
|---|---|---|
403 Forbidden |
The service account lacks the required permissions on the bucket | Assign the appropriate role (Storage Object Viewer or Storage Object Admin) to the service account on the target bucket |
404 Not Found: Bucket not found |
The bucket name in the URI is incorrect or the bucket does not exist | Verify the bucket name and ensure the URI follows the format gs://<bucket_name> |
Invalid credentials |
The key file is malformed, belongs to another project, or its service account has been disabled | Create a new key for the service account and upload it again |
The caller does not have storage.objects.list access |
The service account has object-level access but lacks bucket-level list permission |
Assign the Storage Object Viewer role at the bucket level (not just object level) |
The caller does not have storage.objects.create access |
The enrichment service account lacks write permissions | Upgrade the role assignment from Storage Object Viewer to Storage Object Admin |
Detailed Troubleshooting Notes
Authentication Errors
The error Invalid credentials indicates that the service account key is incorrect or malformed.
Common causes:
- Malformed service account key: the JSON key file is corrupted, truncated, or belongs to a different project.
- Service account disabled: the service account has been disabled in the Google Cloud Console.
Note
A key stops working as soon as its service account is deleted or disabled, even if the key itself was never revoked.
Permission Errors
The error 403 Forbidden or The caller does not have storage.objects.list access means the credentials are valid but lack the required IAM permissions.
Common causes:
- Missing IAM role: the service account does not have
Storage Object Viewer(source) orStorage Object Admin(enrichment) assigned on the target bucket. - Role assigned at wrong level: the role is assigned at the project level but a bucket-level policy overrides it.
- Uniform bucket-level access: if the bucket uses uniform bucket-level access (recommended), ensure IAM policies are set at the bucket level, not through ACLs.
- Source vs. enrichment mismatch: the service account has
Storage Object Viewerbut the operation requires write access (enrichment).
Connection Errors
The error 404 Not Found: Bucket not found indicates a configuration issue with the bucket name or URI.
Common causes:
- Bucket does not exist: the bucket name was misspelled or the bucket has been deleted.
- Wrong project: the service account belongs to a different Google Cloud project than the bucket.
- Invalid URI format: the URI must follow
gs://<bucket_name>. Extra path segments or incorrect formatting will cause failures.
Tip
Start by confirming credentials are valid (authentication errors), then verify IAM role assignments (permission errors), and finally check the bucket name and URI format (connection errors).
Add a Source Datastore
A source datastore is a storage location Qualytics connects to so it can profile, scan, and monitor data. Adding Google Cloud Storage as a source lets Qualytics read files directly from your bucket and run quality operations on the data they contain.
Before you start, create the key described in Create a Service Account Key and review the required privileges.
Field reference
The Add Datastore page shows the sections below when Google Cloud Storage is selected. When reusing an existing connection, the Connection Properties and Secrets Management sections come already filled in and read-only: Qualytics has already validated those credentials, so you fill in only the Datastores Extraction and the Datastore Properties. To change a saved connection's credentials, edit the connection through the Manage Connections page; edits there apply to every datastore that reuses the connection.
Connection Properties
These fields define where the bucket lives and how Qualytics authenticates to it. They belong to the connection: when reusing an existing connection, they come already filled in and read-only.
| FIELD | REQUIRED | TYPE | DESCRIPTION |
|---|---|---|---|
| Connection Name | Text | A label for the saved connection (e.g., acme_gcs_lake), so other datastores can reuse it later. |
|
| URI | Text | The bucket-level URI, in the form gs://<bucket_name>. Leave out any folder path here and use Root Path below to scope to a subfolder. |
|
| Service Account Key | File | The JSON key file of the service account holding the privileges listed above. Upload the file rather than pasting its contents. |
Secrets Management
This group is optional: use it only if you want Qualytics to pull credentials from a secrets manager instead of typing them into the form. Turn on HashiCorp Vault to show the fields below. Despite the label, any secrets manager that exposes a compatible REST API works, not only HashiCorp Vault; see Secrets Management. It also belongs to the connection: read-only when reusing an existing connection.
| FIELD | REQUIRED | TYPE | DESCRIPTION |
|---|---|---|---|
| Login URL | Text | The Vault endpoint Qualytics uses to authenticate (e.g., https://vault.example.com/v1/auth/approle/login). |
|
| Credentials Payload | Text | A JSON body containing the credentials Vault expects (e.g., {"role_id":"...","secret_id":"..."}). |
|
| Token JSONPath | Text | The JSONPath that extracts the client token from Vault's response. Defaults to $.auth.client_token. |
|
| Secret URL | Text | The Vault path where the secret is stored (e.g., https://vault.example.com/v1/secret/data/gcs). |
|
| Token Header Name | Text | The HTTP header name used to send the token. Defaults to X-Vault-Token. |
|
| Data JSONPath | Text | The JSONPath that extracts the secret payload from Vault's response. Defaults to $.data. |
Note
Once the secrets manager is configured, reference any secret from a Connection Properties field with ${key}. Qualytics resolves it each time the connection is opened, so a changed value takes effect on the next connection.
Datastores Extraction
Pick the folder inside the bucket Qualytics should read from. You fill this in on both flows.
| FIELD | REQUIRED | TYPE | DESCRIPTION |
|---|---|---|---|
| Root Path | Option | The folder inside the bucket where the data lives (e.g., /raw/orders/). Defaults to /, which reads from the bucket root. Click the refresh icon to load the folders the service account can see. |
Datastore Properties
Common fields for every source datastore, shown below the Datastores Extraction section. You fill these in on both flows.
| FIELD | REQUIRED | TYPE | DESCRIPTION |
|---|---|---|---|
| Name Template | Text | Defines the naming pattern for the source datastore being created. Left empty, the datastore is named from the connection name and the root path. | |
| Group | Option | Organizes your datastores under a shared group in the navigation tree. Select an existing group or create a new one with the Add New Group toggle. | |
| Teams | Option | Select one or more teams to associate with this source datastore. | |
| Initiate Sync | Checkbox | Automatically sync the datastore to detect containers and fields after creation. |
Allowlisting
A banner at the bottom of the form shows the IP address the connection is established from. Allowlist it wherever your bucket access is restricted by address, so the connection can be opened.
Steps
There are two ways to set up the connection: reuse a connection you already saved (Existing Connection) or create a new one from scratch (New Connection). The tabs below walk through each option; pick the one you want to follow. Each field is described in the Field reference above.
Step 1: Navigate to the Source Datastores page.
Step 2: Click the Add Source Datastore button at the top-right corner.
Step 3: The Add Datastore page opens.
Step 4: Select New Connection next to the Search field.
Step 5: Select Google Cloud Storage from the connector grid. Use the search field to filter connectors by name.
Step 6: Fill in the Connection Properties: the Connection Name and the URI, then upload the Service Account Key.
Step 7: Optionally, expand Secrets Management to retrieve credentials from a secrets manager.
Step 8: Fill in the Datastores Extraction field (Root Path) and the Datastore Properties.
Step 9: Click Test connection. A success message confirms that the connection has been verified.
Info
The Finish and Next buttons stay disabled until the connection test passes on the current values. If the test fails, see Troubleshooting Common Errors.
Step 10: Click Finish to create the datastore.
Tip
To link an enrichment datastore so Qualytics can store anomalies and metadata from the first operation, click Next instead of Finish. See Add Enrichment Datastore below.
Step 11: A success dialog confirms that your datastore has been added. Click Go to your datastore to open its page.
Step 1: Navigate to the Source Datastores page.
Step 2: Click the Add Source Datastore button at the top-right corner.
Step 3: The Add Datastore page opens.
Step 4: Select Existing Connection next to the Search field.
Step 5: Select the saved Google Cloud Storage connection from the grid. Use the search field to filter connections by name. The Connection Properties and Secrets Management sections come already filled in and read-only.
Start a new connection from this one
To use the selected connection as a starting point for a brand-new connection instead, click the Duplicate as a new connection button on the selected connection. The form switches to New Connection mode with the connection's settings already filled in for you to adjust.
Step 6: Fill in the Datastores Extraction field (Root Path) and the Datastore Properties. These are the only fields left to fill in.
Step 7: Click Test connection. A success message confirms that the connection has been verified.
Info
The Finish and Next buttons stay disabled until the connection test passes on the current values. If the test fails, see Troubleshooting Common Errors.
Step 8: Click Finish to create the datastore.
Tip
To link an enrichment datastore so Qualytics can store anomalies and metadata from the first operation, click Next instead of Finish. See Add Enrichment Datastore below.
Step 9: A success dialog confirms that your datastore has been added. Click Go to your datastore to open its page.
Add Enrichment Datastore
An enrichment datastore is where Qualytics writes what it finds: anomalies, remediation files, and record enrichment. Google Cloud Storage is supported for this role, so the same bucket can hold both the data you monitor and the results.
Field reference
The Enrichment Datastore step shows the sections below when Google Cloud Storage is selected. When reusing an existing connection, the Connection Properties and Secrets Management sections come already filled in and read-only.
Connection Properties
These fields define where the bucket lives and how Qualytics authenticates to it. They are the same fields as on the source datastore flow, repeated here so this section stands on its own.
| FIELD | REQUIRED | TYPE | DESCRIPTION |
|---|---|---|---|
| Connection Name | Text | A label for the saved connection (e.g., acme_gcs_enrichment), so other datastores can reuse it later. |
|
| URI | Text | The bucket-level URI, in the form gs://<bucket_name>. |
|
| Service Account Key | File | The JSON key file of the service account. For an enrichment datastore it needs write access as well as read. |
Secrets Management
This group is optional: use it only if you want Qualytics to pull credentials from a secrets manager instead of typing them into the form. Turn on HashiCorp Vault to show the fields below. Despite the label, any secrets manager that exposes a compatible REST API works, not only HashiCorp Vault; see Secrets Management. It also belongs to the connection: read-only when reusing an existing connection.
| FIELD | REQUIRED | TYPE | DESCRIPTION |
|---|---|---|---|
| Login URL | Text | The Vault endpoint Qualytics uses to authenticate (e.g., https://vault.example.com/v1/auth/approle/login). |
|
| Credentials Payload | Text | A JSON body containing the credentials Vault expects (e.g., {"role_id":"...","secret_id":"..."}). |
|
| Token JSONPath | Text | The JSONPath that extracts the client token from Vault's response. Defaults to $.auth.client_token. |
|
| Secret URL | Text | The Vault path where the secret is stored (e.g., https://vault.example.com/v1/secret/data/gcs). |
|
| Token Header Name | Text | The HTTP header name used to send the token. Defaults to X-Vault-Token. |
|
| Data JSONPath | Text | The JSONPath that extracts the secret payload from Vault's response. Defaults to $.data. |
Enrichment Extraction
Where Qualytics writes the enrichment files.
| FIELD | REQUIRED | TYPE | DESCRIPTION |
|---|---|---|---|
| Root Path | Option | The folder inside the bucket Qualytics writes the enrichment files into. Make sure the service account has write access to it. |
Warning
The service account used for an enrichment datastore needs read and write access, while a source datastore needs only read access.
Enrichment Properties
| FIELD | REQUIRED | TYPE | DESCRIPTION |
|---|---|---|---|
| Name | Text | The name of the new enrichment datastore. | |
| Teams | Option | Select one or more teams to associate with the enrichment datastore. |
File prefix
Qualytics generates a Prefix from the source datastore's name and adds it to everything it writes, so several source datastores can share one enrichment target without colliding. An information banner at the bottom of the step previews the resulting names.
Advanced Options
Collapsed by default. Expand it to change how anomalous source records are replicated.
| FIELD | REQUIRED | TYPE | DESCRIPTION |
|---|---|---|---|
| Remediation Strategy | Choice | Controls whether and how anomalous source tables are replicated to the enrichment datastore. None does not replicate them and is the default, Append adds the anomalous records after each scan, and Overwrite keeps only the records from the latest scan. |
Steps
A Google Cloud Storage enrichment datastore can be created from two places: as the second step of creating a source datastore, or on its own from the Enrichment Datastores page. Either way you choose between creating a connection from scratch (New Connection) or reusing a saved one (Existing Connection). The tabs below cover both entry points for each option; each field is described in the Field reference above.
Linking one that already exists
Both entry points also let you pick an enrichment datastore you created earlier instead of creating one. Nothing there is specific to Google Cloud Storage, since you only select it from a list, so see Link Enrichment on Datastore Creation or Link Enrichment Datastore for those flows.
Step 1: Open the Enrichment Datastore form, from either entry point:
- While creating a source datastore: click Next at the bottom of the Add Datastore page once the source connection test has passed. The Enrichment Datastore step opens.
- On its own: navigate to the Enrichment Datastores page and click the Add Enrichment Datastore button at the top-right corner. The Enrichment Datastore page opens.
Step 2: Select New Connection next to the Search field.
Step 3: Select Google Cloud Storage from the connector grid. Only connectors that can host an enrichment datastore are listed.
Same connector as the source
When you arrive from a Google Cloud Storage source datastore, Google Cloud Storage comes already selected, with the connection fields already filled in from the source connection. Click the selected card to change it.
Step 4: Fill in the Connection Properties: the Connection Name and the URI, then upload the Service Account Key.
Step 5: Optionally, expand Secrets Management to retrieve credentials from a secrets manager.
Step 6: Fill in the Enrichment Extraction field (Root Path) and the Enrichment Properties (Name and Teams).
Step 7: When you arrived from a source datastore, review the Prefix preview at the bottom of the step and, if needed, change the Remediation Strategy under Advanced Options. Both relate to the source datastore being linked, so they do not apply when creating the enrichment datastore on its own.
Step 8: Click Test connection. A success message confirms that the connection has been verified.
Info
The button that completes the step stays disabled until the required fields are filled in and the connection test passes on the current values. If the test fails, see Troubleshooting Common Errors.
Step 9: Complete the step: click Finish when you arrived from a source datastore, which creates both datastores and links them, or Create when creating the enrichment datastore on its own.
Step 10: A success dialog confirms the result. Click Go to your datastore to open the source datastore, or Go to your enrichment datastore when you created it on its own.
This option appears only when at least one saved connection can host an enrichment datastore.
Step 1: Open the Enrichment Datastore form, from either entry point:
- While creating a source datastore: click Next at the bottom of the Add Datastore page once the source connection test has passed. The Enrichment Datastore step opens.
- On its own: navigate to the Enrichment Datastores page and click the Add Enrichment Datastore button at the top-right corner. The Enrichment Datastore page opens.
Step 2: Select Existing Connection next to the Search field.
Step 3: Select the saved Google Cloud Storage connection from the grid. The Connection Properties and Secrets Management sections come already filled in and read-only.
Start a new connection from this one
To use the selected connection as a starting point for a brand-new connection instead, click the Duplicate as a new connection button on the selected connection.
Step 4: Fill in the Enrichment Extraction field (Root Path) and the Enrichment Properties (Name and Teams).
Step 5: When you arrived from a source datastore, review the Prefix preview at the bottom of the step and, if needed, change the Remediation Strategy under Advanced Options. Both relate to the source datastore being linked, so they do not apply when creating the enrichment datastore on its own.
Step 6: Click Test connection. A success message confirms that the connection has been verified.
Info
The button that completes the step stays disabled until the required fields are filled in and the connection test passes on the current values. If the test fails, see Troubleshooting Common Errors.
Step 7: Complete the step: click Finish when you arrived from a source datastore, which creates both datastores and links them, or Create when creating the enrichment datastore on its own.
Step 8: A success dialog confirms the result. Click Go to your datastore to open the source datastore, or Go to your enrichment datastore when you created it on its own.
API Payload Examples
This section provides detailed examples of API payloads to guide you through the process of creating and managing datastores using Qualytics API. Each example includes endpoint details, sample payloads, and instructions on how to replace placeholder values with actual data relevant to your setup.
Creating a Source Datastore
This section provides sample payloads for creating the Google Cloud Storage datastore. Replace the placeholder values with actual data relevant to your setup.
Endpoint: /api/datastores (post)
# Step 1: Create a Connection
qualytics connections create \
--type gcs \
--name "your_connection_name" \
--uri "gs://<bucket_name>" \
--secret-key ${GCS_SERVICE_ACCOUNT_KEY}
# Step 2: Create a Source Datastore
qualytics datastores create \
--name "your_datastore_name" \
--connection-name "your_connection_name" \
--database . \
--schema /
Creating an Enrichment Datastore
This section provides sample payloads for creating an enrichment datastore. Replace the placeholder values with actual data relevant to your setup.
Endpoint: /api/datastores (post)
# Step 1: Create a Connection
qualytics connections create \
--type gcs \
--name "your_connection_name" \
--uri "gs://<bucket_name>" \
--secret-key ${GCS_SERVICE_ACCOUNT_KEY}
# Step 2: Create an Enrichment Datastore
qualytics datastores create \
--name "your_datastore_name" \
--connection-name "your_connection_name" \
--database . \
--schema /your_enrichment_path \
--enrichment-only
Link an Enrichment Datastore to a Source Datastore
Use the provided endpoint to link an enrichment datastore to a source datastore:
Endpoint Details: /api/datastores/{datastore-id}/enrichment/{enrichment-id} (patch)