mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-04-08 03:00:28 -04:00
### Changes 🏗️ Adds `autogpt_platform/analytics/` — 14 SQL view definitions that expose production data safely through a locked-down `analytics` schema. **Security model:** - Views use `security_invoker = false` (PostgreSQL 15+), so they execute as their owner (`postgres`), not the caller - `analytics_readonly` role only has access to `analytics.*` — cannot touch `platform` or `auth` tables directly **Files:** - `backend/generate_views.py` — does everything; auto-reads credentials from `backend/.env` - `analytics/queries/*.sql` — 14 documented view definitions (auth, user activity, executions, onboarding funnel, cohort retention) --- ### Running locally (dev) ```bash cd autogpt_platform/backend # First time only — creates analytics schema, role, grants poetry run analytics-setup # Create / refresh views (auto-reads backend/.env) poetry run analytics-views ``` ### Running in production (Supabase) ```bash cd autogpt_platform/backend # Step 1 — first time only (run in Supabase SQL Editor as postgres superuser) poetry run analytics-setup --dry-run # Paste the output into Supabase SQL Editor and run # Step 2 — apply views (use direct connection host, not pooler) poetry run analytics-views --db-url "postgresql://postgres:PASSWORD@db.<ref>.supabase.co:5432/postgres" # Step 3 — set password for analytics_readonly so external tools can connect # Run in Supabase SQL Editor: # ALTER ROLE analytics_readonly WITH PASSWORD 'your-password'; ``` --- ### Checklist 📋 #### For code changes: - [x] I have clearly listed my changes in the PR description - [x] I have made a test plan - [x] I have tested my changes according to the test plan: - [x] Setup + views applied cleanly on local Postgres 15 - [x] `analytics_readonly` can `SELECT` from all 14 `analytics.*` views - [x] `analytics_readonly` gets `permission denied` on `platform.*` and `auth.*` directly --------- Co-authored-by: Otto (AGPT) <otto@agpt.co>
101 lines
3.7 KiB
SQL
101 lines
3.7 KiB
SQL
-- =============================================================
|
|
-- View: analytics.user_onboarding_funnel
|
|
-- Looker source alias: ds74 | Charts: 1
|
|
-- =============================================================
|
|
-- DESCRIPTION
|
|
-- Pre-aggregated onboarding funnel showing how many users
|
|
-- completed each step and the drop-off percentage from the
|
|
-- previous step. One row per onboarding step (all 22 steps
|
|
-- always present, even with 0 completions — prevents sparse
|
|
-- gaps from making LAG compare the wrong predecessors).
|
|
--
|
|
-- SOURCE TABLES
|
|
-- platform.UserOnboarding — Onboarding records with completedSteps array
|
|
--
|
|
-- OUTPUT COLUMNS
|
|
-- step TEXT Onboarding step enum name (e.g. 'WELCOME', 'CONGRATS')
|
|
-- step_order INT Numeric position in the funnel (1=first, 22=last)
|
|
-- users_completed BIGINT Distinct users who completed this step
|
|
-- pct_from_prev NUMERIC % of users from the previous step who reached this one
|
|
--
|
|
-- STEP ORDER
|
|
-- 1 WELCOME 9 MARKETPLACE_VISIT 17 SCHEDULE_AGENT
|
|
-- 2 USAGE_REASON 10 MARKETPLACE_ADD_AGENT 18 RUN_AGENTS
|
|
-- 3 INTEGRATIONS 11 MARKETPLACE_RUN_AGENT 19 RUN_3_DAYS
|
|
-- 4 AGENT_CHOICE 12 BUILDER_OPEN 20 TRIGGER_WEBHOOK
|
|
-- 5 AGENT_NEW_RUN 13 BUILDER_SAVE_AGENT 21 RUN_14_DAYS
|
|
-- 6 AGENT_INPUT 14 BUILDER_RUN_AGENT 22 RUN_AGENTS_100
|
|
-- 7 CONGRATS 15 VISIT_COPILOT
|
|
-- 8 GET_RESULTS 16 RE_RUN_AGENT
|
|
--
|
|
-- WINDOW
|
|
-- Users who started onboarding in the last 90 days
|
|
--
|
|
-- EXAMPLE QUERIES
|
|
-- -- Full funnel
|
|
-- SELECT * FROM analytics.user_onboarding_funnel ORDER BY step_order;
|
|
--
|
|
-- -- Biggest drop-off point
|
|
-- SELECT step, pct_from_prev FROM analytics.user_onboarding_funnel
|
|
-- ORDER BY pct_from_prev ASC LIMIT 3;
|
|
-- =============================================================
|
|
|
|
WITH all_steps AS (
|
|
-- Complete ordered grid of all 22 steps so zero-completion steps
|
|
-- are always present, keeping LAG comparisons correct.
|
|
SELECT step_name, step_order
|
|
FROM (VALUES
|
|
('WELCOME', 1),
|
|
('USAGE_REASON', 2),
|
|
('INTEGRATIONS', 3),
|
|
('AGENT_CHOICE', 4),
|
|
('AGENT_NEW_RUN', 5),
|
|
('AGENT_INPUT', 6),
|
|
('CONGRATS', 7),
|
|
('GET_RESULTS', 8),
|
|
('MARKETPLACE_VISIT', 9),
|
|
('MARKETPLACE_ADD_AGENT', 10),
|
|
('MARKETPLACE_RUN_AGENT', 11),
|
|
('BUILDER_OPEN', 12),
|
|
('BUILDER_SAVE_AGENT', 13),
|
|
('BUILDER_RUN_AGENT', 14),
|
|
('VISIT_COPILOT', 15),
|
|
('RE_RUN_AGENT', 16),
|
|
('SCHEDULE_AGENT', 17),
|
|
('RUN_AGENTS', 18),
|
|
('RUN_3_DAYS', 19),
|
|
('TRIGGER_WEBHOOK', 20),
|
|
('RUN_14_DAYS', 21),
|
|
('RUN_AGENTS_100', 22)
|
|
) AS t(step_name, step_order)
|
|
),
|
|
raw AS (
|
|
SELECT
|
|
u."userId",
|
|
step_txt::text AS step
|
|
FROM platform."UserOnboarding" u
|
|
CROSS JOIN LATERAL UNNEST(u."completedSteps") AS step_txt
|
|
WHERE u."createdAt" >= CURRENT_DATE - INTERVAL '90 days'
|
|
),
|
|
step_counts AS (
|
|
SELECT step, COUNT(DISTINCT "userId") AS users_completed
|
|
FROM raw GROUP BY step
|
|
),
|
|
funnel AS (
|
|
SELECT
|
|
a.step_name AS step,
|
|
a.step_order,
|
|
COALESCE(sc.users_completed, 0) AS users_completed,
|
|
ROUND(
|
|
100.0 * COALESCE(sc.users_completed, 0)
|
|
/ NULLIF(
|
|
LAG(COALESCE(sc.users_completed, 0)) OVER (ORDER BY a.step_order),
|
|
0
|
|
),
|
|
2
|
|
) AS pct_from_prev
|
|
FROM all_steps a
|
|
LEFT JOIN step_counts sc ON sc.step = a.step_name
|
|
)
|
|
SELECT * FROM funnel ORDER BY step_order
|