{% extends "base.html" %} {% block title %}Factcat — Setup{% endblock %} {% block extra_head %} {% endblock %} {% block extra_css %} .setup-page { flex: 1; min-height: 0; width: 100%; box-sizing: border-box; padding: 1.5rem 1.75rem 2rem; display: flex; flex-direction: column; gap: 1.25rem; } .setup-cols { flex: 1; min-height: 0; display: grid; grid-template-columns: minmax(22rem, 28rem) minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); gap: 1.25rem; } .setup-form { background: var(--fc-snow); border: 1px solid var(--fc-line); border-radius: 0.75rem; padding: 1.4rem 1.5rem 1.6rem; min-height: 0; overflow-y: auto; } .setup-docs { background: var(--fc-snow); border: 1px solid var(--fc-line); border-radius: 0.75rem; padding: 1.25rem 1.45rem 1.6rem; min-height: 0; overflow: auto; font-size: 0.88rem; color: var(--fc-ink-soft); } .setup-docs h1 { font-size: 1.05rem; margin: 0 0 0.65rem; } .setup-docs h2 { margin-top: 1.15rem; } .setup-docs p, .setup-docs ul { margin: 0 0 0.65rem; } .setup-docs ul { padding-left: 1.2rem; } .setup-docs code { font-size: 0.8em; background: var(--fc-paper); padding: 0.05rem 0.3rem; border-radius: 0.25rem; } .setup-docs pre { background: var(--fc-paper); padding: 0.75rem 0.9rem; border-radius: 0.4rem; overflow: auto; font-size: 0.8rem; } #extra-card { display: flex; flex-wrap: wrap; align-items: center; gap: 0.65rem 1rem; margin: 0; padding: 0.85rem 1.1rem; border: 1px solid var(--fc-ochre); border-radius: 0.75rem; background: var(--fc-ochre-wash); } #extra-card[hidden] { display: none !important; } #extra-lede { flex: 1 1 14rem; font-size: 0.88rem; margin: 0; color: var(--fc-ink); } #extra-command { flex: 1 1 18rem; margin: 0; padding: 0.45rem 0.6rem; font-size: 0.78rem; overflow: auto; background: var(--fc-snow); } #extra-install { margin: 0; } #extra-status { flex: 1 1 100%; font-size: 0.85rem; color: var(--fc-ink-soft); min-height: 0; margin: 0; } #extra-status:empty { display: none; } .setup-form select:disabled { opacity: 1; background: var(--fc-paper); color: var(--fc-ink); cursor: not-allowed; } label .catalog-refresh { margin-left: 0.5rem; } .hint.ok { color: var(--fc-ok); } .hint.ok .tick { font-weight: 700; margin-right: 0.35rem; } #event-time-layout .callout, #event-column-layout .callout, #entity-layout .callout, #table-cluster-layout .callout { margin: 0.45rem 0 0.65rem; } #event-time-layout .callout p, #event-column-layout .callout p, #entity-layout .callout p, #table-cluster-layout .callout p { margin: 0; } .layout-checking { margin-left: 0.5rem; font-size: inherit; font-weight: 400; color: var(--fc-ochre-deep); } /* Managed tables. #managed-wrap owns the section; .mt owns the list geometry; .mt-acts owns action spacing. */ #managed-wrap[hidden] { display: none !important; } #managed-knobs { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 1.5rem; } #managed-knobs > div { min-width: 0; } #managed-knobs input[type=number] { width: 5rem; display: inline-block; } .mt-unit { font-size: 0.8rem; color: var(--fc-slate); margin-left: 0.35rem; } /* The Setup column is ~24rem: one stacked row per table, never a wide table (the first render overflowed the column). .mt owns the list, .mt-row the row rhythm, .mt-acts the action spacing (there is no td.acts any more). Failures are ochre callouts (#66 grammar), never red text; while the registry is unreadable the actions are disabled. */ .mt { margin-top: 0.5rem; font-size: 0.82rem; border-top: 1px solid var(--fc-line); } .mt-row { padding: 0.55rem 0; border-bottom: 1px solid var(--fc-line); } .mt-head { display: flex; align-items: baseline; justify-content: space-between; gap: 0.25rem 0.75rem; flex-wrap: wrap; } .mt-head code { font-size: 0.8rem; } .mt-meta { color: var(--fc-slate); font-size: 0.75rem; white-space: nowrap; } .mt-serves { margin-top: 0.15rem; } .mt .sub { color: var(--fc-slate); font-size: 0.75rem; display: block; } .mt-acts { display: flex; flex-wrap: wrap; align-items: center; gap: 0.15rem 0.75rem; margin-top: 0.3rem; min-height: 1.15rem; } .mt-acts .linkish { margin: 0; padding: 0; } .mt-acts .loading { margin-left: 0; } .mt-acts .layout-checking { margin-left: 0.25rem; } .mt .callout { margin: 0.35rem 0 0.1rem; } .mt-empty { padding: 0.55rem 0; border-bottom: 1px solid var(--fc-line); } #managed-status { font-size: 0.75rem; color: var(--fc-slate); margin: 0.4rem 0 0; } #managed-status:empty { display: none; } #managed-status.callout { font-size: 0.85rem; color: var(--fc-ink); margin: 0.6rem 0 0; } @media (max-width: 56rem) { .setup-page { overflow-y: auto; } .setup-cols { grid-template-columns: 1fr; grid-template-rows: none; grid-auto-rows: auto; flex: 0 0 auto; min-height: auto; } .setup-form, .setup-docs { overflow: visible; min-height: auto; } } {% endblock %} {% block body %}

Project setup

Warehouse

Pre-filled from ADC, GOOGLE_CLOUD_PROJECT, or gcloud config get-value project when we can read them. Dataset and table are not part of that.

Table

Grain

Stable id for this grain. Null means the event is not about that grain (dropped from uniques). Integer preferred; string is fine. Not unique on the events table.
Display only (Unique Users, Average per User). Does not choose the id column. TIMESTAMP (UTC instant), DATETIME (civil time), or an integer Unix epoch. Not DATE.
String column of event names. Events Refresh list loads names from the lookback below.

Limits

Factcat sets this on the BigQuery job (maximum_bytes_billed). 0 is unlimited. A report can override it for one run.
Crash fuse in SQL after aggregation (most recent rows). A normal chart never hits this; grouping by a high-cardinality property might. It does not reduce bytes scanned. A report can raise it if results are truncated.
How far back to scan the events table to fill the event picker. 0 is all time. This job does not use the scan cap.

Factcat-managed tables (recommended)

Allow Factcat to create and maintain tables in this project and dataset for better performance.

Advanced: service-account JSON instead of ADC
{% endblock %}