templates/analytics/.builder/skills/bigquery/SKILL.md
Query BigQuery for analytics events, signups, pageviews, subscriptions, and user data. Use this skill when the user asks about metrics, funnels, user activity, or customer usage data.
npx skillsauth add BuilderIO/agent-native bigqueryInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
@google-cloud/bigquery Node.js clientGOOGLE_APPLICATION_CREDENTIALS_JSON env var (JSON credentials string), falls back to Application Default CredentialsBIGQUERY_PROJECT_ID env var, defaults to your-project-idmaximumBytesBilled: 750GB per queryserver/lib/bigquery.tsrunQuery(sql: string): Promise<QueryResult>{ rows, totalRows, schema, bytesProcessed, cached? } — NOT an array, always access .rows@app_events resolves to analytics.events_partitioned (fully qualified)Always use these canonical tables for specific use cases:
| Use Case | Table to Use | Key Columns | Notes |
| -------------------- | ------------------------------------ | --------------------------------------------------------------------- | -------------------------------------- |
| Customer contracts | dbt_mart.dim_contracts | contract_id, company_id, start_date, end_date, contract_value, status | Canonical source for all contract data |
| HubSpot deals | dbt_mart.dim_deals | deal_id, amount, stage_name, is_closed_won, close_date | NOT deal_amount or deal_stage |
| Active subscriptions | dbt_mart.dim_subscriptions | subscription_id, root_id, plan, status, subscription_arr | Filter status = 'active' |
| Enterprise customers | dbt_mart.enterprise_companies | Joins hubspot_companies + dim_contracts + organizations | Has health_status, renewal dates |
| ARR | finance.arr_revenue_tracker_latest | unique_id, product, plan, status, arr_change, event_date | arr changes on unique id level |
| All Traffic | dbt_staging_bigquery.all_pageviews | | |
Schema preferences:
dbt_mart.* for business-level queries (deals, contracts, subscriptions, customers)dbt_staging_bigquery.* for raw event data (pageviews, signups)dbt_analytics.* for reporting viewsdbt_dev.* - development schema excluded globally| Logical Name | Actual Table | Key Columns |
| -------------------- | --------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| First pageviews | dbt_staging_bigquery.first_pageviews | visitorid, url, referrer, created_date (TIMESTAMP), channel, utm*, user_id. No page_type — derive from URL. |
| All pageviews | dbt_staging_bigquery.all_pageviews | Has page_type, sub_page_type, first_touch_channel, session_channel, c_referrer, full utm fields |
| Signups | dbt_staging_bigquery.signups | visitorid, user_id, root_organization_id, utm*, signup_url, created_date |
| Signups (enriched) | dbt_analytics.product_signups | userid, user_create_d (TIMESTAMP), channel, icp_flag, top_subscription, referrer, utm* |
| Blog metadata | sigma_materialized.SIGDS_82deb8e2_40f8_4fb4_b3cb_caa011a72d29 | Cryptic column names — see mapping below. 858 rows, deduplicate by blog slug. |
| Blog content (old) | test.builder_blog_content | contentId, name (blog TITLE not author), handle, topic. Only 75 rows, no author. DO NOT use for author data. |
| CRM contacts | dbt_mart.dim_hs_contacts | contact_id (INT64), b_visitor_id, builder_user_id, ql_score, date_entered_mql/sal/s0/s1, lifecycle_stage_name |
| Deals | dbt_mart.dim_deals | deal_id, amount (not deal_amount), stage_name (not deal_stage), is_closed_won (string), arr_amount, close_date, create_date |
| Subscriptions | dbt_mart.dim_subscriptions | subscription_id, root_id, space_id, subscription_arr, start_date, plan, status |
| Enterprise companies | dbt_mart.enterprise_companies | Joins hubspot_companies + dim_contracts + organizations. Has upcoming_renewal_date, health_status, customer_stage. |
| HubSpot companies | dbt_staging.hubspot_companies | company_name, company_id, company_domain_name, upcoming_renewal_date, root_org_id, current_enterprise_arr |
| Cryptic Column | Meaning | Example Values |
| -------------- | ------------------------ | ----------------------------------------------------------------- |
| SUOHFYGIOG | Blog URL | https://www.example.com/blog/sample-post |
| H5YIATNDT5 | Author | Jane Doe, Alex Chen, Sam Patel, Taylor Kim |
| ZZJ6XRJAII | Publish date (TIMESTAMP) | |
| FTRKLGZM1R | Purpose | Acquisition, Awareness |
| IFHWPU1IDO | Persona | Developers, Product Managers, Engineering Leaders, Designers |
| Z52LFY52AK | Topic | AI, CMS, Web Development, Design |
| _DGCBJNKLE | Sub-type | Tooling, Development, Prototyping |
| JQL-G1QE-B | Sub-topic | AI Design, AI Prototyping, AI Tools |
Deduplication: Table has duplicates (http:// vs https://). Always deduplicate: REGEXP_EXTRACT(SUOHFYGIOG, r'/blog/([^/?#]+)') with ROW_NUMBER or DISTINCT.
| Spec Column | Actual Column | Table |
| ----------------------- | -------------------------- | --------------- |
| first_pageview_date | created_date (TIMESTAMP) | first_pageviews |
| channel (pageviews) | first_touch_channel | all_pageviews |
| referrer | c_referrer | all_pageviews |
| referrer_channel | session_channel | all_pageviews |
| user_create_date | user_create_d | product_signups |
| deal_stage | stage_name | dim_deals |
| deal_amount | amount | dim_deals |
| visitor_id → contacts | b_visitor_id | dim_hs_contacts |
| user_id → contacts | builder_user_id | dim_hs_contacts |
first_pageviews.visitor_id = signups.visitor_idfirst_pageviews.visitor_id = dim_hs_contacts.b_visitor_idsignups.user_id = dim_hs_contacts.builder_user_id
AND signups.email = dim_hs_contacts.email
Matching on both prevents mismatches from reassigned user IDs or data sync issues.signups.root_organization_id = dim_subscriptions.root_iddbt_intermediate.deal_first_contact or lifecycle stage dates on dim_hs_contacts.builder_blog_content.contentId = content_with_models.content_id → dim_users.namedbt_staging_bigquery (raw staged), dbt_analytics (reporting views), dbt_mart (dimensional models), dbt_intermediate (joins/transforms), analytics (raw events), finance (ARR tracking), sigma_materialized (Sigma-generated views with UUID names).
CASE
WHEN url LIKE '%/blog/%' THEN 'blog'
WHEN url LIKE '%/docs/%' THEN 'docs'
WHEN REGEXP_CONTAINS(url, r'example\.com/?(?:\?|$)') THEN 'marketing'
WHEN url LIKE '%/sign-up%' THEN 'webapp'
ELSE 'other'
END
first_pageviews.created_date is TIMESTAMP — wrap: TIMESTAMP('2025-11-01')product_signups.user_create_d is TIMESTAMP — samedim_hs_contacts.sign_up_time_stamp is DATE — no wrappingDATE(timestamp_col) before DATE_TRUNC to avoid type mismatch-- WRONG
WHERE date BETWEEN '...' AND '...'
WHERE col IS NOT NULL
-- CORRECT
WHERE col IS NOT NULL AND date BETWEEN '...' AND '...'
Agent chat events use event column, NOT name column (often NULL). Use event = 'agent chat message submitted'.
Use Amplitude (amplitude.EVENTS_182198) instead of @app_events — smaller, stays within byte limits:
event_type (not event) and event_time (not createdDate)rootOrganizationId and organizationId in event_properties JSONbuilderSpaceId is NULL for agent chat eventscapTo30Days() helper for Amplitude time seriesdata.isEnterpriseCompany is unreliable — most enterprise events have it false/missingdim_subscriptions on rootOrganizationId, filter LOWER(plan) = 'enterprise' AND status = 'active'| Event | Description |
| ----------------------------------------- | ---------------------------------------- |
| agent chat message submitted | User sends message in AI chat |
| visual editor ai chat message submitted | User sends message in Visual Editor AI |
| agent chat message completed | AI response completed |
| agent chat code applied | User applied generated code |
dim_hs_contacts (contact_id is INT64) → builder_user_idsignups → root_organization_idJSON_VALUE(event_properties, '$.rootOrganizationId') IN (...)NEVER use scripts for dashboard UI data. Use useMetricsQuery(queryKey, sql) with direct BigQuery SQL:
queries.ts alongside the dashboard/api/query endpointdim_hs_contactstools
Public booking flow — the state machine, animations, and URL/app-state sync.
tools
Trigger-based automations — reminders, follow-ups, webhooks — across the booking lifecycle.
tools
Team event types, round-robin assignment, collective bookings, host weights, and no-show calibration.
development
The pure `computeAvailableSlots` function — inputs, outputs, invariants, and debugging guide.