How I Built a Real Estate ROI Calculator Using Supabase & Looker Studio
When investing in real estate, raw property prices only tell half the story. To identify the most profitable investment opportunities in Poprad (Slovakia), I built an end-to-end data pipeline and interactive BI dashboard.
By combining Supabase (PostgreSQL) for data storage and transformations with Google Looker Studio for visualization, this project provides property investors with real-time ROI calculations and geographic price distribution.
Key Finding: While the VeΔΎkΓ‘ district commands the highest average price per mΒ², older 1-bedroom apartments near the city center offer the highest annual ROI (~5.8% to 10% depending on specific market conditions).
π οΈ Tech Stack & Architecture
The architecture was kept lean, robust, and scalable:
- Database Layer: Supabase (PostgreSQL) β data storage, cleaning, and aggregation.
-
Analytical Layer: Advanced SQL β window functions (
LAG), date truncations, and anomaly filtering. -
BI & Visualization: Google Looker Studio β custom calculated fields (
ROI%,Estimated Rent) and interactive UI. - Documentation & Version Control: GitHub Markdown & Public Repository.
π Data Cleaning & SQL Transformations
Raw data often contains outliers (e.g., mispriced listings or inaccurate square footage). Before building visualizations, I filtered out non-representative listings using custom SQL constraints.
1. Removing Price Anomalies
sql
SELECT *
FROM poprad_reality
WHERE (cena_eur / rozloha_m2) BETWEEN 800 AND 6000;
2. Year-over-Year Growth Trend (Window Functions)
To analyze how prices evolved over time, I implemented the LAG window function to calculate percentage growth year-over-year:
SQL
WITH yearly_averages AS (
SELECT
EXTRACT(YEAR FROM datum_inzercie::date) AS year,
AVG(cena_eur / rozloha_m2) AS price_per_m2
FROM poprad_reality
WHERE typ_nehnutelnosti LIKE '%byt%'
GROUP BY EXTRACT(YEAR FROM datum_inzercie::date)
)
SELECT
year,
ROUND(price_per_m2::numeric, 2) AS avg_price_m2,
ROUND((LAG(price_per_m2) OVER (ORDER BY year))::numeric, 2) AS previous_year_price,
ROUND((((price_per_m2 - LAG(price_per_m2) OVER (ORDER BY year)) / LAG(price_per_m2) OVER (ORDER BY year)) * 100)::numeric, 2) AS yoy_growth_percent
FROM yearly_averages;
π BI Dashboard & Interactive ROI Calculator
In Google Looker Studio, I designed custom metrics to evaluate financial viability directly on the dashboard:
Estimated Annual Rent (β¬): rozloha_m2 * 10 * 12 (based on a conservative average market rent of 10 β¬/mΒ²/month)
ROI (%): (rozloha_m2 * 10 * 12) / cena_eur
Key UI Features:
Interactive Slicers: Filter instantly by location (lokalita) and property type (typ_nehnutelnosti).
KPI Scorecards: Overview of global average ROI and pricing metrics.
Granular Breakdown Table: Location-based aggregation showing average area (mΒ²), calculated ROI (%), and total price (β¬).
Comparative Bar Chart: Side-by-side ROI distribution across property categories.
π‘ Business Recommendations for Investors
High-Yield Target: Focus on 1-room and 2-room apartments in high-density residential areas (Poprad - Juh, Centrum). They provide the best balance between purchase price and steady rental yield.
Capital Appreciation vs. Yield: Properties in VeΔΎkΓ‘ offer great long-term value preservation due to proximity to the High Tatras, but yield lower immediate rental returns due to higher acquisition costs.
π Live Links & Repository
π Interactive Looker Studio Dashboard
π GitHub Repository
Top comments (0)