Connect Google Cloud

Connecting Google Cloud brings your Detailed Cloud Billing export into Helias, along with the project metadata needed to attribute that spend, so you can see cost by project, service, SKU and label.

Helias reads it through a service account provisioned for your organization alone. There is no service account key: the collector federates its own identity at Google STS and impersonates that account.

This takes about ten minutes, and everything runs in Cloud Shell if you would rather install nothing.

Before you begin

  • A Google Cloud project hosting your BigQuery billing export.
  • Detailed Cloud Billing export to BigQuery enabled. The Standard export does not carry enough detail for cost analysis.
  • The export dataset in the US or EU multi-region.
  • Billing enabled on that project. Helias validates the grant with a dry-run query, which cannot run without it.
  • Permission to grant IAM roles on that project and its dataset. Granting at the organization also needs Organization Administrator.
  • To grant on the dataset specifically you need to be an owner of the dataset. If that is blocked there is a project-level fallback below.
  • jq available where you run the dataset grant. It is preinstalled in Cloud Shell.

You also need a Helias account, which is granted by request and approved by a person. Start at Get access if you do not have one yet.

How the connection works

You point Helias at one project, the one hosting your billing export, and grant three read-only roles to the service account the app gives you. The projects Helias goes on to analyse are derived from that export and from the access you grant, so you never list them one by one.

That service account is unique to your organization, in a Google Cloud project dedicated to you, so Helias never shares a collector across customers. Every action it takes appears in your own Cloud Audit Logs, and you can revoke the bindings from the IAM console at any time.

What it costs you

roles/bigquery.jobUser lets Helias run cost queries against your billing export. Those queries run in your project, so BigQuery bills them to you. They scale with the size of the export, which for most billing exports is a small monthly figure.

Validation is free, because the check Helias runs at connect time is a dry run.

Nothing is created in your project: no dataset, no table, no key, no service account.

Scope and permissions

Every role below is read-only.

Your organizationA single project
CoversEvery project under your billing accountThe billing-export project only
New projectsMapped as they appear in the exportNot mapped
Extra grantViewer at the organizationNone
NeedsOrganization AdministratorProject-level IAM permission

Granting at the organization is what we recommend, because it maps every project behind your spend without a grant per project. The Permissions reference carries the same grants for every provider in one place.

GrantApplies toWhy
roles/bigquery.jobUserThe project hosting your billing exportLets Helias run the cost queries that read your export. These jobs are billed to that project.
roles/bigquery.dataViewerThe billing export datasetLets Helias read the export itself. Scoped to that dataset, not the whole project.
roles/viewerYour organization, or the billing-export projectLets Helias map the projects behind the export. This is what turns spend into per-project attribution.

Connect

The app gives you your service account email and generates each command with your own project, dataset and organization already filled in. The versions here show placeholders instead. Every command has a console click-through in the app if you would rather not use the CLI.

  1. Point Helias at your billing export project

    Give the app the project ID hosting the export, the dataset name, and your billing account ID. For organization scope, also your numeric organization ID.

  2. Grant BigQuery Job User on the project

    gcloud projects add-iam-policy-binding <PROJECT_ID> \
      --member="serviceAccount:<SERVICE_ACCOUNT_EMAIL>" \
      --role="roles/bigquery.jobUser" \
      --condition=None

    If this fails, confirm billing is enabled on the project and that the service account email is exactly the one the app shows. A binding to a service account that does not exist is silently ignored rather than rejected.

  3. Grant BigQuery Data Viewer on the dataset

    The dataset grant reads the dataset's current access list, appends the service account and writes it back. It is shaped this way because the direct binding command calls an API most accounts are not allowlisted for.

    # Read the dataset's current access list, add Helias as READER, write it back:
    bq show --format=prettyjson <PROJECT_ID>:<DATASET> > /tmp/<DATASET>.json
    jq '.access += [{"role":"READER","userByEmail":"<SERVICE_ACCOUNT_EMAIL>"}]' \
      /tmp/<DATASET>.json > /tmp/<DATASET>-updated.json
    bq update --source /tmp/<DATASET>-updated.json <PROJECT_ID>:<DATASET>

    This needs jq, and it needs you to be an owner of the dataset. If that is blocked, grant Data Viewer at the project instead. It is broader, because it covers every dataset in the project rather than the export alone.

    gcloud projects add-iam-policy-binding <PROJECT_ID> \
      --member="serviceAccount:<SERVICE_ACCOUNT_EMAIL>" \
      --role="roles/bigquery.dataViewer" \
      --condition=None
  4. Grant Viewer, at your organization or the project

    At the organization, which maps every project under your billing account:

    gcloud organizations add-iam-policy-binding <ORG_ID> \
      --member="serviceAccount:<SERVICE_ACCOUNT_EMAIL>" \
      --role="roles/viewer" \
      --condition=None

    Or at the billing-export project alone, which maps only that project:

    gcloud projects add-iam-policy-binding <PROJECT_ID> \
      --member="serviceAccount:<SERVICE_ACCOUNT_EMAIL>" \
      --role="roles/viewer" \
      --condition=None

Verify the connection

Select Validate in the app. Helias checks the access before storing anything, and shows each check as it runs:

CheckWhat it proves
Authenticating Helias service accountImpersonation works and the account can read the project
Verifying BigQuery billing exportThe dataset is readable and a dry-run query against it succeeds, which is Data Viewer and Job User together
Verifying organization accessProjects under your organization can be listed. Organization scope only

The BigQuery check runs a dry-run query rather than only reading the dataset metadata, so it catches a missing Job User grant. Data Viewer alone reads the schema and then fails on the first real query.

If a check fails, nothing is stored and nothing is left behind on either side. Grants can take a few minutes to propagate, so if you have just run the commands, wait a moment before retrying.

After you connect

Your first data appears in Helias within 24 hours of a successful connection, and you get an email when the first insights are ready.

Until then the connections page shows a collection status: Pending while collection has not started, In progress while it runs, and Completed once data is flowing.

Limits

  • The Standard billing export is not enough. It does not carry the resource-level detail cost analysis needs. Only the Detailed export is supported.
  • The dataset must be in the US or EU multi-region. A single-region or other multi-region dataset cannot be read.
  • Organization scope maps direct children. Projects nested inside folders are attributed from the billing export rather than discovered at connect time, so they appear once their spend does.
  • One billing export per connection. If you have several billing accounts exporting to different projects, connect each one.
  • Claude bought through Vertex AI is part of your Google Cloud bill and appears in this connection, not in an Anthropic connection.

Troubleshooting

CauseResolution
Authentication check failsGrants can take a few minutes to propagate. Wait and retry first. If it persists, confirm the IAM bindings name the exact service account email the app shows, and that the project ID is right.
BigQuery check failsThe service account needs both Data Viewer on the dataset and Job User on its project. Data Viewer alone passes a metadata read and fails the query. Confirm both, and that billing is enabled on the project.
The dataset grant returns This feature requires allowlistingThat is the direct binding API, which most accounts cannot call. Use the read-modify-write command above, which is the form the app gives you.
The dataset grant returns a 403Granting on a dataset requires you to be an owner of it. Use the project-level Data Viewer fallback instead.
Organization check failsThe service account needs Viewer at the organization, which requires Organization Administrator to grant. If that is not available, connect at project scope instead.
A project is missing from the connectionOrganization scope maps projects under your billing account. Projects billed elsewhere, or with no spend in the export yet, will not appear.

Disconnecting

You can disconnect at any time from the connections page. Disconnecting releases access to the project or organization, immediately.

It does not change anything in your own cloud. What stays behind is the IAM bindings you granted to the Helias service account. Remove those bindings in the IAM console.

Helias holds read-only access, so it cannot remove a grant you made.