Organization activity log data reference
Categories:
Prior reading: Billing actions
Purpose: This document explains the various access-related actions Org Admins can take in Workbench.
Note: This document is specific to Org Admins only. Organization activity logs are Google Cloud Platform-specific.
Introduction
BigQuery contains per-organization isolated tables allowing Organization Admins to query org-specific data. Note that Org Admins have IAM access only to their own organization's tables.
| Dataset | What it contains | Update frequency |
|---|---|---|
workbench_cloud_audit_logs_prod |
Data plane access events (file reads, queries) | Daily (8 AM UTC) |
workbench_monitoring_org_logs_prod |
Workspace activity, user/role mappings, policy grants | Twice daily (7 AM / 7 PM UTC) |
workbench_gce_instance_logs_prod |
Google Compute Engine (GCE) virtual machine instance logs (startup, Docker, resource metrics) | Continuous (via log sink) |
Note
Replace<org_ufid> in the table names below with your
organization's user-facing ID. Convert any dashes in your org's user-facing ID to underscores (e.g.,
<org-ufid> to <org_ufid>).
Cloud audit logs dataset (workbench_cloud_audit_logs_prod)
Tables: cloud_audit_logs (unified) and per-org isolated tables cloud_audit_logs_<org_ufid>
Purpose: Tracks every data plane access event (e.g., when users read files from Google Cloud Storage (GCS), run BigQuery queries, or access BigQuery Storage API).
Scope: Includes events from both workspaces and data collections (i.e., any Google Cloud Platform (GCP) project linked to a workspace in the org).
cloud_audit_logs and cloud_audit_logs<org_ufid> tables
Schema
| Column | Type | Description |
|---|---|---|
insert_id |
STRING | Unique event identifier |
timestamp |
TIMESTAMP | When the access occurred |
org_id |
STRING | Organization UUID |
org_user_facing_id |
STRING | Organization user-facing ID |
workspace_id |
STRING | Workspace UUID where access occurred |
workspace_user_facing_id |
STRING | Workspace user-facing ID |
gcp_project_id |
STRING | GCP project hosting the resource |
gcp_project_number |
STRING | GCP project number |
user_email |
STRING | User who performed the access (resolved from pet service account) |
audit_log |
STRING | Full JSON audit log payload (see below) |
audit_log details (JSON)
The audit_log field contains the complete GCP Data Access audit log entry. Some key fields are
listed below:
| JSON path | Description | Example |
|---|---|---|
serviceName |
GCP service accessed | storage.googleapis.com, bigquery.googleapis.com |
methodName |
Operation performed | storage.objects.get, jobservice.jobcompleted |
resourceName |
Full resource path including file/object name | projects/_/buckets/vwb-aou-datasets-controlled/objects/v8/wgs/short_read/snpindel/vds/hail.vds/variant_data/rows/rows/parts/part-001663 |
resourceLocation.currentLocations |
Region where the resource is stored | ["us-central1"] |
status.code |
Response status (0=success, 5=not found) | 5 |
status.message |
Error message if failed | "No such object: ..." |
requestMetadata.callerSuppliedUserAgent |
Tool/client used to access the data | htslib/1.23.1, gcsfuse/3.11.1, GHFS/3.0.7-dataproc |
requestMetadata.callerIp |
IP address of the caller | 10.128.15.239 |
authorizationInfo[].permission |
Permission checked | storage.objects.get |
authorizationInfo[].granted |
Whether access was granted | true / false |
metadataJson |
Additional metadata (e.g., bytes requested) | {"requested_bytes":39267665052} |
Event types captured
| Service | Method | What it represents |
|---|---|---|
storage.googleapis.com |
storage.objects.get |
User downloaded/read a specific file from a GCS bucket |
storage.googleapis.com |
storage.objects.list |
User listed files in a GCS bucket |
bigquery.googleapis.com |
jobservice.jobcompleted |
User executed a BigQuery query |
bigquerystorage.googleapis.com |
CreateReadSession |
User read data via BigQuery Storage API |
Can Org Admins see which files are being used?
Yes. The resourceName field in audit_log contains the complete object path, including the bucket
name and full file path. For example:
projects/_/buckets/vwb-aou-datasets-controlled/objects/v8/wgs/short_read/snpindel/vds/hail.vds/variant_data/rows/rows/parts/part-001663projects/_/buckets/vwb-aou-allxall/objects/v8/ht/ACAF_deprecated/EUR/phenotype_NS_324.311_ACAF_results.ht/index/part-1078-...
Example queries
Files accessed in a workspace
SELECT
timestamp,
user_email,
workspace_user_facing_id,
JSON_VALUE(audit_log, '$.methodName') AS method,
JSON_VALUE(audit_log, '$.resourceName') AS resource_path,
JSON_VALUE(audit_log, '$.requestMetadata.callerSuppliedUserAgent') AS client_tool
FROM `workbench-bq-log-sink.workbench_cloud_audit_logs_prod.cloud_audit_logs_<org_ufid>`
WHERE timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND JSON_VALUE(audit_log, '$.serviceName') = 'storage.googleapis.com'
ORDER BY timestamp DESC
LIMIT 100
BigQuery queries run by users
SELECT
timestamp,
user_email,
workspace_user_facing_id,
JSON_VALUE(audit_log, '$.resourceName') AS query_resource
FROM `workbench-bq-log-sink.workbench_cloud_audit_logs_prod.cloud_audit_logs_<org_ufid>`
WHERE timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
AND JSON_VALUE(audit_log, '$.serviceName') = 'bigquery.googleapis.com'
ORDER BY timestamp DESC
Workspace activity logs dataset (workbench_monitoring_org_logs_prod)
wsm_workspace_activity_logs table
Per-org isolated tables: wsm_workspace_activity_logs_<org_ufid>
Purpose: Tracks workspace-level mutations (e.g., resource creation, deletion, cloning, role grants, and configuration changes).
Scope: Includes both workspaces and data collections. Use is_data_collection = TRUE to filter
to data collections only.
Schema
| Column | Type | Description |
|---|---|---|
workspace_id |
STRING | Workspace UUID |
workspace_user_facing_id |
STRING | Workspace user-facing ID |
change_date |
TIMESTAMP | When the change occurred |
actor_email |
STRING | Who performed the action |
user_id |
STRING | Actor's internal user ID |
change_subject_id |
STRING | What was changed (user email, resource ID, etc.) |
change_subject_type |
STRING | Type of subject (e.g., USER, resource type, WORKSPACE) |
change_type |
STRING | Type of change (see below) |
source_workspace_id |
STRING | Source workspace for clone operations |
org_id |
STRING | Organization UUID |
org_user_facing_id |
STRING | Organization user-facing ID |
pod_id |
STRING | Pod UUID |
pod_user_facing_id |
STRING | Pod user-facing ID |
is_data_collection |
BOOLEAN | Whether this workspace is a data collection |
Change types
| change_type | change_subject_type | Description |
|---|---|---|
ADMIN_UPDATE |
WORKSPACE | Administrative workspace updates |
SYSTEM_CLEANUP |
WORKSPACE | Automated cleanup operations |
CLONE |
CONTROLLED_GCP_BIG_QUERY_DATASET | User cloned a BigQuery dataset from a data collection |
CREATE |
REFERENCED_GCP_BIG_QUERY_DATASET | User created a referenced BigQuery dataset |
GRANT_WORKSPACE_ROLE |
USER | User was granted a role on a workspace |
CREATE |
CONTROLLED_GCP_GCE_INSTANCE | User created a GCE virtual machine (VM) |
UPDATE_PROPERTIES |
WORKSPACE | Workspace properties modified |
CREATE |
CONTROLLED_GCP_GCS_BUCKET | User created a GCS bucket |
CLONE |
REFERENCED_GCP_BIG_QUERY_DATASET | User cloned a referenced BigQuery dataset |
DELETE |
CONTROLLED_GCP_GCE_INSTANCE | User deleted a GCE VM |
CREATE |
WORKSPACE | New workspace created |
APPLICATION_ENABLED |
APPLICATION | User enabled an app |
REMOVE_WORKSPACE_ROLE |
USER | User's workspace role was removed |
Example queries
Who created workspaces
SELECT
change_date,
actor_email,
workspace_user_facing_id,
change_subject_type
FROM `workbench-bq-log-sink.workbench_monitoring_org_logs_prod.wsm_workspace_activity_logs_<org_ufid>`
WHERE change_type = 'CREATE' AND change_subject_type = 'WORKSPACE'
ORDER BY change_date DESC
Role grants on workspaces
SELECT
change_date,
actor_email,
change_subject_id AS granted_to,
workspace_user_facing_id
FROM `workbench-bq-log-sink.workbench_monitoring_org_logs_prod.wsm_workspace_activity_logs_<org_ufid>`
WHERE change_type = 'GRANT_WORKSPACE_ROLE'
ORDER BY change_date DESC
Notes on Role Grants
- Role is in
propertiesJSON:GRANT_WORKSPACE_ROLEevents store the granted role in thepropertiescolumn as JSON (e.g.,{"role": "reader"}). Extract withJSON_VALUE(properties, '$.role'). - Both user and group grants are logged: When a group is granted a workspace role,
change_subject_type = 'GROUP'andchange_subject_idis the group email.
workspace_policy_grants table
Per-org isolated tables: workspace_policy_grants_<org_ufid>
Purpose: Current point-in-time snapshot of who has what role on each workspace, including how they got it (direct grant or group membership).
Scope: Includes both workspaces and data collections. To filter to data collections only, JOIN
to wsm_workspaces and check is_data_collection = TRUE. For a data collection-specific view with
friendlier columns, use data_collection_access_grants (per-org) or data_collection_policy_grants
(per-data collection) instead.
Schema
| Column | Type | Description |
|---|---|---|
workspace_id |
STRING | Workspace UUID |
workspace_user_facing_id |
STRING | Workspace user-facing ID |
workspace_name |
STRING | Workspace display name |
user_email |
STRING | User with access |
role |
STRING | Role on the workspace (DISCOVERER, READER, WRITER, OWNER) |
grant_type |
STRING | How access was obtained: DIRECT or GROUP |
group_email |
STRING | If grant_type=GROUP, the group's email |
group_name |
STRING | If grant_type=GROUP, the group's name |
org_id |
STRING | Organization UUID |
Example query
All users with WRITER+ access
SELECT
user_email,
workspace_user_facing_id,
role,
grant_type,
group_name
FROM `workbench-bq-log-sink.workbench_monitoring_org_logs_prod.workspace_policy_grants_<org_ufid>`
WHERE role IN ('WRITER', 'OWNER')
ORDER BY workspace_user_facing_id, role
Note
Theworkspace_policy_grants table only shows the current
state, not historical changes. Also, there is no timestamp field so you can't determine when a grant
was made.
sam_workspace_users table
Per-org isolated tables: sam_workspace_users_<org_ufid>
Purpose: Lists all users with READER, WRITER, or OWNER access to workspaces in the org.
Scope: Includes both workspaces and data collections (treats both as the workspace resource
type).
Schema
| Column | Type | Description |
|---|---|---|
user_email |
STRING | User with access |
org_id |
STRING | Organization UUID |
workspace_id |
STRING | Workspace UUID |
role |
STRING | Role (READER, WRITER, OWNER) |
Note
Thesam_workspace_users table doesn't contain historical
data. Also, the DISCOVERER role is not included in the role column.
um_user_activity_in_org_log table
Per-org isolated tables: um_user_activity_in_org_log_<org_ufid>
Purpose: Timestamped log of organization, pod, and group membership changes, including when users are added or removed from groups.
Scope: Events are scoped by group, pod, or org, not by individual workspaces or data
collections. To connect a group membership event to a specific data collection, JOIN to
data_collection_access_grants or data_collection_policy_grants.
Schema
| Column | Type | Description |
|---|---|---|
change_timestamp |
TIMESTAMP | When the change occurred |
change_type |
STRING | Type of change (see below) |
subject_type |
STRING | What was changed: ORGANIZATION, POD, or GROUP |
subject_id |
STRING | ID of the subject (group internal_name, pod UUID, or org UUID) |
actor_email |
STRING | Who performed the action |
properties |
STRING | JSON with additional details (e.g., role granted) |
related_resources |
STRING | JSON array of related resources (e.g., the principal added) |
org_id |
STRING | Organization UUID |
org_user_facing_id |
STRING | Organization user-facing ID |
Key change types
| change_type | subject_type | Description |
|---|---|---|
GRANT_ROLE_GROUP |
GROUP | User/group was added to a Workbench group |
REVOKE_ROLE_GROUP |
GROUP | User/group was removed from a Workbench group |
CREATE_GROUP |
GROUP | A new group was created |
DELETE_GROUP |
GROUP | A group was deleted |
GRANT_ROLE_ORG |
ORGANIZATION | User was granted an org role |
REVOKE_ROLE_ORG |
ORGANIZATION | User's org role was revoked |
GRANT_ROLE_POD |
POD | User was granted a pod role |
REVOKE_ROLE_POD |
POD | User's pod role was revoked |
Example queries
When was a user added to a group?
SELECT
change_timestamp,
actor_email,
subject_id AS group_internal_name,
JSON_VALUE(properties, '$.role') AS role_on_group,
related_resources
FROM `workbench-bq-log-sink.workbench_monitoring_org_logs_prod.um_user_activity_in_org_log_<org_ufid>`
WHERE change_type = 'GRANT_ROLE_GROUP'
ORDER BY change_timestamp DESC
When did a DISCOVERER gain READER access?
To find when a user gained READER access to a data collection via group membership, JOIN this
table with um_workbench_groups (to map subject_id to group_internal_name) and
data_collection_policy_grants (to confirm which data collection the group grants READER on):
WITH group_grants AS (
SELECT
change_timestamp,
actor_email,
subject_id AS group_internal_name,
related_resources
FROM `workbench-bq-log-sink.workbench_monitoring_org_logs_prod.um_user_activity_in_org_log_<org_ufid>`
WHERE change_type = 'GRANT_ROLE_GROUP'
)
SELECT
gg.change_timestamp AS granted_at,
gg.actor_email AS granted_by,
g.group_name,
gg.related_resources
FROM group_grants gg
INNER JOIN `workbench-bq-log-sink.workbench_monitoring_org_logs_prod.um_workbench_groups_<org_ufid>` g
ON gg.group_internal_name = g.internal_name
um_workbench_groups table
Per-org isolated tables: um_workbench_groups_<org_ufid>
Purpose: Lists all Workbench groups in the organization, mapping internal names to user-facing names.
Schema
| Column | Type | Description |
|---|---|---|
internal_name |
STRING | Group internal name (used as subject_id in activity logs) |
group_name |
STRING | User-facing group name |
org_id |
STRING | Organization UUID |
org_user_facing_id |
STRING | Organization user-facing ID |
org_display_name |
STRING | Organization display name |
created_date |
TIMESTAMP | When the group was created |
created_by |
STRING | Who created the group |
last_updated_date |
TIMESTAMP | Last update |
last_updated_by |
STRING | Who last updated it |
um_users table
Per-org isolated tables: um_users_<org_ufid>
Purpose: User roster for the org (e.g., email, active state, Terms of Service status, creation date).
Schema
| Column | Type | Description |
|---|---|---|
user_id |
STRING | User UUID |
email |
STRING | User email |
org_id |
STRING | Organization UUID |
org_user_facing_id |
STRING | Organization user-facing ID |
active_state |
STRING | User's status (ENABLED, DISABLED, ARCHIVED, or INVITED) |
tos_state |
STRING | Terms of Service status (TOS_REQUIRED or TOS_OK) |
created_date |
TIMESTAMP | Account creation date |
created_by_email |
STRING | Who created the account |
last_updated_date |
TIMESTAMP | Last update |
last_updated_by_email |
STRING | Who last updated it |
um_pods table
Per-org isolated tables: um_pods_<org_ufid>
Purpose: Pod metadata — name, org, billing account, environment type.
Schema
| Column | Type | Description |
|---|---|---|
pod_id |
STRING | Pod UUID |
pod_user_facing_id |
STRING | Pod user-facing ID |
description |
STRING | Description of the pod |
org_id |
STRING | Org UUID |
org_user_facing_id |
STRING | Org user-facing ID |
org_display_name |
STRING | Organization display name |
environment_type |
STRING | Cloud platform (AWS or GCP) |
billing_account_id |
STRING | Google Billing account ID |
billing_export_project_id |
STRING | Google project ID for exported Cloud Billing data |
billing_export_dataset_id |
STRING | BigQuery dataset ID for exported Cloud Billing data |
billing_export_table_id |
STRING | BigQuery table ID for exported Cloud Billing data |
created_date |
TIMESTAMP | Date created |
created_by_email |
STRING | Who created it |
last_updated_date |
TIMESTAMP | Date last updated |
last_updated_by_email |
STRING | Who last updated it |
um_user_pod_roles table
Per-org isolated tables: um_user_pod_roles_<org_ufid>
Purpose: Which users have roles on which pods.
Schema
| Column | Type | Description |
|---|---|---|
user_email |
STRING | User email |
policy_group |
STRING | UUID of policy group |
role |
STRING | User role (admin, manager, user) |
pod_id |
STRING | Pod UUID |
pod_user_facing_id |
STRING | Pod user-facing ID |
description |
STRING | Pod description |
org_id |
STRING | Org UUID |
environment_type |
STRING | Cloud platform (AWS or GCP) |
created_date |
TIMESTAMP | Date created |
created_by_email |
STRING | Who created it |
last_updated_date |
TIMESTAMP | Date last updated |
last_updated_by_email |
STRING | Who last updated it |
wsm_workspaces table
Per-org isolated tables: wsm_workspaces_<org_ufid>
Purpose: All workspaces in the org — ID, name, creator, cloud platform, GCP project, properties.
Scope: Includes both workspaces and data collections. Has is_data_collection column to
distinguish.
Schema
| Column | Type | Description |
|---|---|---|
workspace_id |
STRING | Workspace UUID |
workspace_user_facing_id |
STRING | Workspace user-facing ID |
workspace_display_name |
STRING | Workspace display name |
description |
STRING | Workspace description |
created_date |
TIMESTAMP | Date created |
created_by_email |
STRING | Who created it |
org_id |
STRING | Organization UUID |
org_user_facing_id |
STRING | Organization user-facing ID |
pod_id |
STRING | Pod UUID |
pod_user_facing_id |
STRING | Pod user-facing ID |
cloud_platform |
STRING | Cloud platform (GCP or AWS) |
cloud_context |
STRING | Includes SAM policy, GCP project ID, and GCP project number info |
region |
STRING | Workspace region |
state |
STRING | State of workspace (CREATING, READY, DELETED) |
properties |
STRING | JSON string list of workspace properties (default location, data use metadata) |
workspace_metadata_policy |
STRING | JSON string list of completed metadata policies |
is_data_collection |
BOOLEAN | Whether this workspace is a data collection |
gcp_project_id |
STRING | GCP project hosting the resource |
gcp_project_number |
STRING | GCP project number |
wsm_resources table
Per-org isolated tables: wsm_resources_<org_ufid>
Purpose: All resources (buckets, datasets, VMs, apps) across all workspaces in the org.
Scope: Includes resources in both workspaces and data collections. Has is_data_collection
column to distinguish.
Schema
| Column | Type | Description |
|---|---|---|
workspace_id |
STRING | Workspace UUID |
workspace_user_facing_id |
STRING | Workspace user-facing ID |
resource_id |
STRING | Resource UUID |
resource_name |
STRING | Resource name |
resource_display_name |
STRING | Resource display name |
description |
STRING | Resource description |
created_date |
TIMESTAMP | Date created |
created_by_email |
STRING | Who created it |
resource_type |
STRING | Resource type |
exact_resource_type |
STRING | Exact resource type (specifies CONTROLLED or REFERENCED) |
resource_lineage |
STRING | Resource lineage |
access_scope |
STRING | Access scope (ACCESS_SHARED, ACCESS_PRIVATE) |
cloning_instructions |
STRING | Resource cloning instructions (COPY_NOTHING, COPY_DEFINITION, COPY_RESOURCE, COPY_REFERENCE, COPY_LINK_REFERENCE) |
region |
STRING | Resource region |
state |
STRING | State of resource (CREATING, READY, DELETED) |
attributes |
STRING | Resource attributes |
properties |
STRING | Resource properties |
folder_id |
STRING | Folder UUID |
folder_display_name |
STRING | Folder display name |
org_id |
STRING | Org UUID |
org_user_facing_id |
STRING | Organization user-facing ID |
pod_id |
STRING | Pod UUID |
pod_user_facing_id |
STRING | Pod user-facing ID |
is_data_collection |
BOOLEAN | Whether this workspace is a data collection |
data_collection_access_grants table
Per-org isolated tables: data_collection_access_grants_<org_ufid>
Purpose: Per-org flat listing of every user's effective roles on each data collection, resolving both direct user grants and group-based grants (including nested groups). Maps SAM policy groups to user-facing Workbench group names.
Scope: Data collections only (filters to is_data_collection = TRUE).
Schema
| Column | Type | Description |
|---|---|---|
data_collection_id |
STRING | Data collection UUID |
data_collection_name |
STRING | Data collection display name |
data_collection_user_facing_id |
STRING | Data collection user-facing ID |
user_email |
STRING | User with access |
role |
STRING | Role (DISCOVERER, READER, WRITER, OWNER) |
grant_type |
STRING | Grant type (DIRECT or GROUP) |
group_email |
STRING | SAM policy group email (internal) |
group_name |
STRING | SAM policy group name (internal) |
member_group_name |
STRING | Workbench group internal_name (for GROUP grants) |
user_facing_group_name |
STRING | User-facing Workbench group name (resolved from member_group_name) |
org_id |
STRING | Organization UUID |
Example query
Data collection access grants with group names
SELECT
user_email,
data_collection_name,
role,
grant_type,
user_facing_group_name
FROM `workbench-bq-log-sink.workbench_monitoring_org_logs_prod.data_collection_access_grants_<org_ufid>`
WHERE role = 'READER'
ORDER BY data_collection_name, user_email
sam_admin_groups / sam_admin_groups_all tables
Purpose: Maps organizations to their SAM admin groups (used for IAM isolation).
Schema
| Column | Type | Description |
|---|---|---|
sam_group_name |
STRING | SAM group name |
sam_group_email |
STRING | SAM group email |
sam_policy_name |
STRING | SAM policy name |
org_id |
STRING | Org UUID |
org_user_facing_id |
STRING | Org user-facing ID |
user_count |
INTEGER | User count |
Last Modified: 1 September 2026