How to Create a FinOps Project for Managing Google Cloud Billing
Implementing Financial Operations (FinOps) best practices in Google Cloud starts with creating a dedicated project to centralize billing exports, cost analysis tools, and financial dashboards. This guide walks you through setting up a FinOps project that serves as your organization's cloud financial management hub.
Prerequisites
Before you begin, ensure you have:
- Organization Administrator or Project Creator role in your Google Cloud organization
- Billing Account Administrator role on your Cloud Billing account
- Access to the Google Cloud Console or gcloud CLI installed
- Understanding of your organization's billing structure and requirements
- Basic knowledge of Google Cloud project hierarchy and IAM
Understanding FinOps Projects
A FinOps project is a centralized location for:
- Billing data exports: BigQuery datasets containing detailed cost and usage data
- Cost analysis tools: Looker Studio dashboards, scheduled queries, and reports
- Budget monitoring: Alerts, notifications, and cost anomaly detection
- Tagging and labeling: Centralized label management and enforcement
- Financial reporting: Custom views, aggregations, and executive summaries
Key benefits:
- Separates billing data from production workloads
- Provides dedicated access control for finance teams
- Centralizes all billing-related resources
- Simplifies audit and compliance reporting
Step-by-Step Guide
Phase 1: Create the FinOps Project
Using Google Cloud Console
-
Navigate to Project Creation
- Open the Google Cloud Console
- Click the project dropdown at the top of the page
- Click NEW PROJECT
-
Configure Project Settings
- Project name: Enter a descriptive name (e.g., "FinOps Hub", "Cloud Financial Management")
- Project ID: Will be auto-generated or enter a custom ID (e.g.,
finops-billing-prod)- Must be globally unique across all Google Cloud
- Cannot be changed after creation
- Use lowercase letters, numbers, and hyphens only
- Organization: Select your organization from the dropdown
- Location: Select the appropriate folder or leave at organization root
-
Create the Project
- Click CREATE
- Wait for the project creation process to complete (typically 10-30 seconds)
- Note the Project ID for later use
Using gcloud CLI
# Set your organization ID (find it with: gcloud organizations list)
ORG_ID="123456789012"
# Set billing account ID (find it with: gcloud billing accounts list)
BILLING_ACCOUNT_ID="ABCDEF-123456-ABCDEF"
# Create the FinOps project
gcloud projects create finops-billing-prod \
--name="FinOps Hub" \
--organization=$ORG_ID \
--labels=purpose=finops,team=finance,environment=production
# Link the billing account
gcloud billing projects link finops-billing-prod \
--billing-account=$BILLING_ACCOUNT_ID
# Set as current project
gcloud config set project finops-billing-prod
Phase 2: Enable Required APIs
Enable all APIs needed for billing analysis and financial management:
Using Console
-
Navigate to APIs & Services
- In the Cloud Console, select your FinOps project
- Click Navigation menu > APIs & Services > Library
-
Enable Required APIs
- Search for and enable each of these APIs:
- BigQuery API (for billing data storage)
- BigQuery Data Transfer API (for scheduled queries)
- Cloud Billing API (for programmatic billing access)
- Cloud Resource Manager API (for project/resource metadata)
- Compute Engine API (for VM pricing data)
- Cloud Asset API (for resource inventory)
- Search for and enable each of these APIs:
Using gcloud CLI
# Enable all required APIs in one command
gcloud services enable \
bigquery.googleapis.com \
bigquerydatatransfer.googleapis.com \
cloudbilling.googleapis.com \
cloudresourcemanager.googleapis.com \
compute.googleapis.com \
cloudasset.googleapis.com \
--project=finops-billing-prod
Verify APIs are enabled:
gcloud services list --enabled --project=finops-billing-prod
Phase 3: Create BigQuery Dataset for Billing Exports
Using Console
-
Open BigQuery
- Navigate to BigQuery in the Console
- Ensure your FinOps project is selected
-
Create Dataset
- Click the three-dot menu next to your project name
- Select Create dataset
- Dataset ID:
billing_data - Data location:
US(multi-region, required for billing exports) - Default table expiration: 730 days (2 years) - adjust based on retention policy
- Click CREATE DATASET
Using gcloud CLI
# Create billing dataset with 2-year expiration
bq mk \
--dataset \
--location=US \
--default_table_expiration=63072000 \
--description="Cloud Billing export data for cost analysis" \
finops-billing-prod:billing_data
Phase 4: Configure IAM Permissions
Set up appropriate access control for finance and engineering teams:
Finance Team Access
# Grant BigQuery Data Viewer to finance team
gcloud projects add-iam-policy-binding finops-billing-prod \
--member="group:[email protected]" \
--role="roles/bigquery.dataViewer"
# Grant Billing Account Viewer for read-only billing access
gcloud projects add-iam-policy-binding finops-billing-prod \
--member="group:[email protected]" \
--role="roles/billing.viewer"
FinOps Team Access (Full Control)
# Grant BigQuery Admin for data management
gcloud projects add-iam-policy-binding finops-billing-prod \
--member="group:[email protected]" \
--role="roles/bigquery.admin"
# Grant Billing Account Administrator for export configuration
gcloud billing accounts add-iam-policy-binding $BILLING_ACCOUNT_ID \
--member="group:[email protected]" \
--role="roles/billing.admin"
Engineering Team Access (Read-Only)
# Grant BigQuery Data Viewer for cost queries
gcloud projects add-iam-policy-binding finops-billing-prod \
--member="group:[email protected]" \
--role="roles/bigquery.dataViewer"
# Grant BigQuery Job User to run queries
gcloud projects add-iam-policy-binding finops-billing-prod \
--member="group:[email protected]" \
--role="roles/bigquery.jobUser"
Phase 5: Enable Billing Exports
Configure Cloud Billing to export data to your new FinOps project:
Using Console
-
Navigate to Billing
- Click Navigation menu > Billing
- Select your billing account
-
Configure BigQuery Export
- Click Billing export in the left sidebar
- Under "BigQuery export", click EDIT SETTINGS
-
Standard Export Configuration
- Project: Select
finops-billing-prod - Dataset: Select
billing_data - Click SAVE
- Project: Select
-
Detailed Export Configuration (Recommended)
- Under "Detailed usage cost data", click EDIT SETTINGS
- Project: Select
finops-billing-prod - Dataset: Select
billing_data(can use same dataset) - Click SAVE
-
Verify Export
- Wait 24-48 hours for initial data to populate
- Check BigQuery for new tables:
gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX
Using gcloud CLI
# Note: Billing export configuration must be done via Console or API
# The gcloud CLI does not directly support this operation
# Use the Console instructions above or the Cloud Billing API
Phase 6: Set Up Cost Monitoring and Alerts
Create Budget Alerts
-
Navigate to Budgets
- In Cloud Console, go to Billing > Budgets & alerts
- Click CREATE BUDGET
-
Configure Budget
- Name: "Monthly Cloud Spend Budget"
- Projects: Select all projects to monitor
- Budget type: "Specified amount"
- Target amount: Enter monthly budget (e.g., $10,000)
- Threshold rules: Set alerts at 50%, 80%, 90%, 100%
- Notifications: Add email addresses or Pub/Sub topics
- Click FINISH
Create Anomaly Alerts (Optional)
# Create a Pub/Sub topic for cost anomalies
gcloud pubsub topics create billing-anomaly-alerts \
--project=finops-billing-prod
# Subscribe email to the topic
gcloud pubsub subscriptions create email-alerts \
--topic=billing-anomaly-alerts \
--push-endpoint="https://your-webhook-endpoint.com/alerts"
Phase 7: Create Initial Cost Analysis Queries
Set up saved queries for common financial reports:
Monthly Cost by Project
-- Save this query in BigQuery for monthly reporting
SELECT
invoice.month AS invoice_month,
project.name AS project_name,
service.description AS service_description,
ROUND(SUM(cost), 2) AS total_cost,
ROUND(SUM(usage.amount), 2) AS usage_amount,
usage.unit AS usage_unit
FROM
`finops-billing-prod.billing_data.gcp_billing_export_v1_*`
WHERE
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m01', DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY
invoice_month,
project_name,
service_description,
usage_unit
ORDER BY
invoice_month DESC,
total_cost DESC
Top 10 Cost Drivers
-- Identify highest cost resources
SELECT
service.description AS service,
sku.description AS sku,
ROUND(SUM(cost), 2) AS total_cost,
COUNT(*) AS line_items
FROM
`finops-billing-prod.billing_data.gcp_billing_export_v1_*`
WHERE
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m01', CURRENT_DATE())
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
GROUP BY
service,
sku
ORDER BY
total_cost DESC
LIMIT 10
Phase 8: Document and Share
Create documentation for your FinOps project:
- Create a README: Document project purpose, access procedures, and key resources
- Share with stakeholders: Notify finance, engineering, and leadership teams
- Schedule training: Conduct workshops on using BigQuery for cost analysis
- Set up regular reviews: Schedule monthly cost review meetings
Best Practices
Project Organization
- Use descriptive labels: Tag with
purpose=finops,team=finance,environment=production - Separate environments: Consider separate FinOps projects for dev/test/prod
- Document ownership: Clearly identify who owns and maintains the FinOps project
- Version control: Store queries and dashboard definitions in Git
Access Control
- Principle of least privilege: Grant minimum necessary permissions
- Use groups: Assign permissions to groups, not individual users
- Regular audits: Review IAM bindings quarterly
- Service accounts: Use dedicated service accounts for automated processes
Cost Management
- Set table expiration: Automatically delete old billing data based on retention policy
- Use clustering: Cluster billing tables by project, service, or date for query efficiency
- Monitor BigQuery costs: Set budgets for the FinOps project itself
- Archive old data: Export to Cloud Storage for long-term retention at lower cost
Data Governance
- Implement tagging strategy: Standardize labels across all projects for better cost attribution
- Create data catalog: Document all datasets, tables, and their purposes
- Set up data quality checks: Validate billing exports are complete and accurate
- Enable audit logging: Track who accesses billing data and when
Reporting and Dashboards
- Create executive summaries: Build high-level cost dashboards for leadership
- Team-specific views: Provide filtered views for each engineering team
- Trend analysis: Track cost trends over time to identify anomalies
- Cost forecasting: Use historical data to predict future spending
Troubleshooting
Billing Data Not Appearing
Problem: No billing data in BigQuery after enabling exports
Solution:
- Wait 24-48 hours for initial data population
- Verify billing export is enabled: Console > Billing > Billing export
- Check that billing account is active and incurring charges
- Ensure dataset location is
USmulti-region - Verify IAM permissions on the dataset
Permission Denied Errors
Problem: Users cannot access billing data
Solution:
- Grant
roles/bigquery.dataViewerat project level - Grant
roles/bigquery.jobUserto allow query execution - Verify users are authenticated with correct account
- Check that the FinOps project is linked to a billing account
API Not Enabled
Problem: "API not enabled" errors when running queries or exports
Solution:
- Enable BigQuery API:
gcloud services enable bigquery.googleapis.com - Enable Cloud Billing API:
gcloud services enable cloudbilling.googleapis.com - Wait 5-10 minutes for API enablement to propagate
- Retry the operation
Query Costs Too High
Problem: BigQuery queries consuming excessive budget
Solution:
- Use partitioned tables: Filter on
_TABLE_SUFFIXfor date ranges - Add
LIMITclauses to exploratory queries - Use clustering on frequently filtered columns
- Create materialized views for common aggregations
- Set custom query quotas per user/team
Dataset Location Mismatch
Problem: Cannot export billing data to dataset
Solution:
- Billing exports require
USmulti-region location - Delete and recreate dataset with correct location
- Cannot change dataset location after creation
- Use
bq show PROJECT:DATASETto verify location
Next Steps
After creating your FinOps project:
- Configure detailed exports: Enable resource-level billing data
- Build dashboards: Create Looker Studio reports for stakeholders
- Implement tagging: Standardize labels across all projects
- Set up automation: Create scheduled queries for regular reports
- Enable GKE cost allocation: Track namespace-level Kubernetes costs
- Integrate with tools: Connect to third-party FinOps platforms (CloudHealth, Spot.io, etc.)
Related Resources
Frequently Asked Questions
Find answers to common questions
Need Professional Help?
Our team of experts can help you implement and configure these solutions for your organization.