Skip to content

Business Intelligence Tools -- Tableau, Metabase, Superset & Power BI

DodaTech Updated 2026-06-22 6 min read

In this tutorial, you'll learn about Business Intelligence Tools. We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.

Business intelligence (BI) tools transform raw data into interactive dashboards and reports that enable data-driven decision-making across your organization.

What You'll Learn

In this tutorial, you will learn how to evaluate, deploy, and use four major BI tools -- Tableau, Metabase, Apache Superset, and Power BI -- comparing their architectures, query capabilities, visualization options, and self-service analytics features.

Why It Matters

Spreadsheets and manual reporting do not scale. As data volume grows, teams need BI tools that connect directly to databases, refresh automatically, and let non-technical users explore data without writing SQL. Organizations using self-service BI reduce reporting turnaround time by 80% and increase data-driven decision frequency by 3x.

Real-World Use

DodaTech's customer success team uses Metabase for daily operational dashboards showing user activation, retention, and support ticket trends. The data team uses Apache Superset for complex cohort analyses and executive summaries. Both tools connect to the same PostgreSQL data warehouse, providing appropriate interfaces for different user skill levels.

BI Tool Architecture

flowchart TD
    A[Data Sources] --> B[Connection Layer]
    B --> C[Tableau]
    B --> D[Metabase]
    B --> E[Superset]
    B --> F[Power BI]
    C --> G[Data Extracts]
    C --> H[Live Queries]
    D --> H
    E --> H
    F --> G
    G --> I[Dashboards]
    H --> I
    I --> J[Self-Service Analytics]
    I --> K[Executive Reports]
    I --> L[Embedded Analytics]

Deploying Metabase with Docker

Metabase offers the simplest self-hosted BI setup:

version: "3.8"
services:
  metabase:
    image: metabase/metabase:latest
    ports:
      - "3000:3000"
    environment:
      - MB_DB_TYPE=postgres
      - MB_DB_DBNAME=metabase
      - MB_DB_HOST=postgres
      - MB_DB_PORT=5432
      - MB_DB_USER=metabase
      - MB_DB_PASS=password
      - MB_SITE_URL=HTTPS://bi.example.com
    depends_on:
      - postgres

  postgres:
    image: postgres:15
    environment:
      - POSTGRES_DB=metabase
      - POSTGRES_USER=metabase
      - POSTGRES_PASSWORD=password
    volumes:
      - pgdata:/var/lib/PostgreSQL/data

Expected behavior: After running <a href="/devops/docker-compose/">Docker Compose</a> up -d, Metabase is available at http://localhost:3000. The setup wizard guides you through creating an admin account and connecting your first database.

Creating a Metabase Dashboard via API

Automate dashboard creation with the Metabase API:

import requests
import JSON

class MetabaseClient:
    def __init__(self, BASE_URL, API_key):
        self.BASE_URL = BASE_URL.rstrip("/")
        self.headers = {"X-API-KEY": API_key, "Content-Type": "application/JSON"}

    def create_dashboard(self, name, description=""):
        payload = {
            "name": name,
            "description": description,
        }
        response = requests.post(
            f"{self.BASE_URL}/API/dashboard",
            headers=self.headers,
            JSON=payload,
        )
        return response.JSON()

    def add_card_to_dashboard(self, dashboard_id, card_id, row, col):
        payload = {
            "dashboardId": dashboard_id,
            "cardId": card_id,
            "row": row,
            "col": col,
            "sizeX": 6,
            "sizeY": 4,
        }
        response = requests.post(
            f"{self.BASE_URL}/API/dashboard/{dashboard_id}/cards",
            headers=self.headers,
            JSON=payload,
        )
        return response.JSON()

client = MetabaseClient("HTTPS://bi.example.com", "your_API_key")
dashboard = client.create_dashboard("Revenue Dashboard", "Daily revenue metrics")
print(f"Dashboard created: {dashboard['id']}")

Expected output: A dashboard is programmatically created in Metabase with cards positioned in a grid. The API response includes the dashboard ID for further card additions or sharing.

Apache Superset SQL Lab Queries

Superset's SQL Lab allows ad-hoc SQL exploration with visualization:

-- Example SQL Lab query in Superset
SELECT
  DATE_TRUNC('month', order_date) AS month,
  product_category,
  COUNT(DISTINCT order_id) AS total_orders,
  SUM(revenue) AS total_revenue,
  ROUND(AVG(revenue), 2) AS avg_order_value,
  COUNT(DISTINCT customer_id) AS unique_customers
FROM orders
WHERE order_date >= '2026-01-01'
GROUP BY DATE_TRUNC('month', order_date), product_category
ORDER BY month, total_revenue DESC;

Expected output: A monthly revenue breakdown by product category. Superset renders results in a table format that can be instantly converted into a bar chart, line chart, pivot table, or other visualization types.

Tableau Calculated Fields

Tableau's calculated fields enable complex transformations without SQL:

# Tableau's calculated field syntax (not Python, shown for comparison)
"""
-- Calculated Field: Customer Lifetime Value (CLV)
IF { FIXED [Customer ID] : MIN([Order Date]) } >= DATEADD('month', -12, TODAY())
THEN
  { FIXED [Customer ID] : SUM([Revenue]) }
ELSE
  NULL
END

-- Calculated Field: Revenue Growth Rate
(SUM([Revenue]) - LOOKUP(SUM([Revenue]), -1))
/ ABS(LOOKUP(SUM([Revenue]), -1))
* 100
"""

Expected behavior: The CLV calculated field computes lifetime value only for customers active in the last 12 months, excluding churned customers from average calculations. The growth rate calculation compares current period revenue to the previous period using table calculations.

Tool Comparison

Feature Tableau Power BI Metabase Apache Superset
Deployment Cloud/Server Cloud/On-premise Self-hosted Self-hosted
License cost $$$ ($70/user/mo) $$ ($10/user/mo) Free (AGPL) Free (Apache 2.0)
Data sources 60+ connectors 120+ connectors 20+ databases 40+ databases
SQL interface Limited Yes (DAX + SQL) Yes (Native Query) Yes (SQL Lab)
Embedding Yes ($$$) Yes ($$) Yes (paid) Yes (free)
Mobile support Yes Yes Yes (read-only) Yes
Ease of use Moderate Moderate Very easy Moderate

Common Errors

1. Extracting Data Instead of Live Querying

Tableau and Power BI extract data by default, creating stale copies that diverge from source databases. Use live connections for operational dashboards where data freshness matters. Reserve extracts for large datasets where query performance is unacceptable.

2. Security Misconfiguration in Self-Hosted BI

Exposing BI tools without authentication, SSL, or IP allowlisting creates critical data breach risks. Enable authentication, enforce HTTPS, and restrict database credentials to read-only access with schema-limited permissions.

3. Dashboard Performance Degradation

Unfiltered queries on billion-row tables crash BI tools. Implement database-level aggregations (materialized views, summary tables) and force dashboard filters to prevent full table scans. Use Superset's virtual datasets and Tableau's extracts for performance optimization.

4. Ignoring Row-Level Security

In multi-tenant BI deployments without row-level security, users can see other customers' data. Configure RLS in your database or use the BI tool's built-in permissions. Metabase supports data sandboxing per user group.

5. Over-Engineering Data Models

Complex star schemas with 20 joined tables confuse business users who want self-service analytics. Start with simple denormalized views that match business concepts. Add complexity only when performance or granularity demands it.

Practice Questions

1. What is the difference between self-hosted and cloud BI tools? Self-hosted BI (Metabase, Superset) runs on your infrastructure with full data control. Cloud BI (Tableau Online, Power BI Service) is managed by the vendor with lower operational overhead but LESS control over data residency and pricing.

2. When should you use data extracts instead of live queries? Use extracts for large datasets (millions of rows) where query performance is slow, or when the source database cannot handle concurrent BI query load. Use live queries when data freshness within seconds is critical.

3. What is row-level security in BI and why is it important? Row-level security restricts which data rows a user can see based on their identity or group membership. It is essential in multi-tenant environments to prevent customers from seeing each other's data.

4. How does Metabase differ from Apache Superset in target users? Metabase targets non-technical business users with a simple question-Builder interface ("What was our revenue last month?"). Superset targets analysts and data scientists with SQL Lab, advanced chart types, and custom visualization plugins.

5. Challenge: Deploy Metabase and Superset side by side on the same infrastructure, connecting both to the same PostgreSQL database. Build the same three dashboards (revenue overview, user growth, support tickets) in both tools. Compare the setup time, ease of use, visualization options, and performance for each tool. Document which tool is better suited for different user personas in your organization.

Mini Project

Build a complete BI Stack with Docker Compose that includes Metabase for operational dashboards and Apache Superset for executive reporting, both connected to a PostgreSQL data warehouse. Create a daily ETL pipeline using Apache Airflow that transforms raw event data into star-schema tables. Build five Metabase dashboards for daily operations (user activation, retention, support, revenue, pipeline) and three Superset dashboards for executive review (monthly trends, cohort analysis, forecast). Configure automated email reports from Metabase on a weekly schedule.

Built by the developers of Doda Browser, DodaZIP, and Durga Antivirus Pro.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro