COE-LA Reporting Migration

COE-LA Cloud Database Migration Guide

A reference for the migration of COE-LA's 9 Looker Studio reports from Google Sheets to a cloud PostgreSQL database — a quick-start guide, a technical overview, and tools to view and speed-compare the reports.

Original — Google Sheets _v2 — Render Postgres

What this page is

A preview of COE-LA's 9 reports now running on a new, faster cloud database, plus tools to view them and compare their speed against the original versions.

How to open it

https://internal.la-coe.com

You'll need to be signed in to your organization Google account to view the reports. If a report area appears blank, sign in to that account and refresh the page.

Using the report tabs

TabWhat it's for
Browse v2The simplest way to view the 9 updated reports — click any report name to open it directly. This is all most people need.
CompareSee the old and new versions side by side. Each row shows the Original (left) next to the updated _v2 (right), with an optional "Reload & time" button to watch them reload and see which finishes first.

What to expect

These are the same reports with the same data — nothing about the content or the numbers has changed. The only difference is that the updated versions load faster.

How much faster? — a quick summary

Across all 9 reports, the updated versions loaded faster every time. On average, a report that used to take about 4.1 seconds now loads in about 2.8 seconds — roughly a third quicker — and the biggest improvements nearly cut the wait in half.

ReportBefore (old)Now (updated)
Success — Compare Programs3.9 s1.7 s
Success — Compare a Program3.6 s2.2 s
Success — Time Trend4.2 s3.3 s
Progress — Compare Programs3.4 s2.9 s
Progress — Compare a Program5.3 s3.8 s
Progress — Time Trend6.6 s3.6 s
Earning — Compare a Program3.3 s3.0 s
Earning — Compare Programs3.0 s2.9 s
Earning — Time Trend4.0 s1.9 s
Average~4.1 s~2.8 s

Times are typical load times measured during testing; exact numbers vary a little run to run. Every updated report showed the exact same figures as the original.

Questions?

If anything doesn't look right or you have questions, please contact: [Your name/contact]

Purpose of the migration

COE-LA's 9 Looker Studio reports were moved from Google Sheets data sources to a dedicated cloud PostgreSQL database on Render. This eliminates the manual CSV export/import workflow, removes stale data, and gives the reports a real query engine — the same reports and the same data, just faster and easier to maintain.

Architecture

MACBOOK PRO · ON-PREMISES SQL Server 2025 source of truth · 9 reporting views Python ETL — etl_to_postgres.py manual · truncate + reload · a few times/year RENDER POSTGRES · CLOUD coe_reporting database 9 tables · ~2.09M rows · indexed native Postgres connector · read live Looker Studio 9 reports (live) Power BI Desktop native connector (live)

The pipeline has three layers:

Performance results

All 9 reports were benchmarked (original vs. updated) on a cold filter change. Postgres was faster or tied on every report, and every report's data matched the original.

ReportOriginalUpdated (_v2)Faster by
Progress — Time Trend6.6 s3.6 s46%
Progress — Compare a Program5.3 s3.8 s28%
Progress — Compare Programs3.4 s2.9 s15%
Success — Time Trend4.2 s3.3 s21%
Success — Compare a Program3.6 s2.2 s40%
Success — Compare Programs3.9 s1.7 s55%
Earning — Time Trend4.0 s1.9 s53%
Earning — Compare a Program3.3 s3.0 s10%
Earning — Compare Programs3.0 s2.9 s~tie
Average~4.1 s~2.8 s~32%

Note: the database query itself runs in ~18 ms — most of the load time is Looker Studio's own overhead, so the improvement comes from the faster data source, and further database tuning wouldn't help. Warm/cached reloads are about equal (Looker caches results); the gains show on cold loads and filter changes, which is what users wait on.

What changed

DestinationRender PostgreSQL (Basic-256mb), Oregon region
Monthly cost~$7.50 ($6 instance + $1.50 for 5 GB storage)
Databasecoe_reporting — 9 flat tables, one per report
Source of truthOn-prem SQL Server 2025 (COELA), read via 9 _LOOKER_VIEW views
Data volume2,089,617 rows · ~620 MB · 51 indexes
ETLetl_to_postgres.py — manual, truncate + reload per refresh

Data accuracy

Every updated report showed the exact same figures as the original — the change is purely about speed. (One cosmetic exception: Earning — Compare Programs displays earnings with decimals where the original rounds; the underlying values are identical.)

Recommendation

The migration met its goal on both speed and data accuracy — no report regressed. Recommendation: cut over to the updated reports, and continue migrating the Power BI reports to the same Render database.

Each _v2 production report (left) beside its staging counterpart (right) — the current live data vs the corrected data awaiting review. The changes are specific and easy to miss on two near-identical charts, so look for:

Full list of intended changes: REVIEW_CHECKLIST.md.

Workflow Comparison

Current manual workflow vs new cloud-automated workflow

Dimension Current workflow New cloud workflow
Data source technology
Report data sourceGoogle Sheets (flat CSV imported manually)Render Postgres — live cloud database
Data formatFlat denormalized spreadsheetIndexed database tables, query-optimized
Connection typeStatic file import — snapshot in timeLive native Postgres connector
CSV download hostingGoogle Drive — new file ID on every uploadCloudflare R2 — permanent URLs, zero egress fees
ETL & data refresh
Update process36 manual steps across 9 reportsOne Python script — single command
Tools involvedSSMS export → CSV → Google Drive → Looker importetl_to_postgres.py + generate_csvs.py
Error riskHigh — manual copy/paste, wrong file, missed reportLow — automated, consistent every run
Update frequencyA few times per yearA few times per year — no change needed
Report performance
Initial load time5–15 secondsUnder 1 second
Filter / dropdown3–8 seconds per interactionNear instant
Multiple usersGets slower as concurrent users increaseNo degradation — database handles concurrency
Query engineGoogle Sheets — loads entire file per queryPostgreSQL — returns only requested rows
User operations
Report experienceSlow, frustrating wait on every filterFast, responsive — no visible wait
CSV download buttonBroken after every data update — requires manual fixPermanent URL — always works, always fresh data
Download experienceRedirects to Google Drive preview pageDirect download — page stays open
Login requiredSometimes — if Google Drive permissions lapseNever — public direct download
Admin operations
Steps per data refresh36 manual steps (9 reports × 4 steps each)1 command — python etl_to_postgres.py
Download link maintenanceUpdate 9 report buttons after every uploadZero — links never change
Risk of stale dataHigh — easy to forget a report or wrong fileNone — all 9 reports update from same script run
Power BI
Data deliveryStale data embedded in .pbix fileLive connection to Render Postgres
Refresh processRedistribute new .pbix file to all staffStaff click Refresh in Power BI Desktop
Google Workspace exit
Google SheetsRequired — Looker data sourceEliminated — replaced by Render Postgres
Google Drive (CSVs)Required — download button hostingEliminated — replaced by Cloudflare R2
Google Drive (docs)Required — shared internal documentsMove to COE-LA Dropbox (already paid)
Looker StudioFree Google product — staysStays — reconnects to Postgres, no cost change
Google Workspace subscription~$30–60/mo (5 users)$0 — cancel after migration complete
Domain (coe-la.com)
Current registrarSquarespace (formerly Google Domains)Transfer to Cloudflare Registrar
Annual renewal cost$20/yr (Squarespace standard rate since Sep 2024)~$10/yr (Cloudflare at-cost pricing)
DNS managementSquarespace dashboard (separate from everything)Cloudflare — same place as R2, simpler to manage
Total cost comparison
Google Workspace~$30–60/mo$0 saves $30–60/mo
Domain renewal$20/yr$10/yr saves $10/yr
Render Postgres$0$7.50/mo
Cloudflare R2$0$0 (free tier)
Net monthly savings—~$22–52/mo + $10/yr on domain after $7.50/mo Postgres cost

Prepared by Howard Chen · howardhchen@howardhchen.com