Tableau Course
Tableau Capstone Project
This is the final lesson of the course — and it is not a lesson. It is a brief. Across 59 lessons you have learned data connections, calculated fields, LOD expressions, table calculations, parameters, maps, dashboards, actions, and storytelling. Now you build something that uses all of it. The capstone is a complete, end-to-end Tableau project for a global NGO called ClearPath International — from raw data preparation to a published, publicly shareable multi-dashboard story on Tableau Public.
The Brief
Organisation: ClearPath International — an NGO operating clean water and sanitation programmes across 5 regions: Sub-Saharan Africa, South Asia, Southeast Asia, Latin America, and Middle East & North Africa.
Dataset: 4 years of programme data — project sites, funding received, population served, water access rates before and after intervention, and field survey scores by district.
Deliverable: A Tableau Story published to Tableau Public with three dashboard scenes — a Global Programme Overview, a Regional Deep Dive with geospatial analysis, and an Impact Scorecard showing outcomes vs targets.
Audiences: The Board of Trustees (headline impact numbers and funding efficiency), regional programme managers (district-level drill-down), and external donors (a clean, shareable story they can embed on their own sites).
Constraint: The final workbook must be published to Tableau Public. All data has been pre-anonymised. The story must be fully interactive and load in under 4 seconds on a standard broadband connection.
The Dataset
Three CSV files feed the project. Connect all three in Tableau Desktop or Tableau Public Desktop and build relationships in the Data Source canvas before creating any sheets. Do not union or blend — use relationships.
-- FILE 1: projects.csv (fact table — one row per project site)
-- Columns: ProjectID, ProjectName, Country, Region, District,
-- Latitude, Longitude, StartYear, EndYear, Status,
-- FundingUSD, PopulationTargeted, PopulationServed,
-- WaterAccessBefore, WaterAccessAfter, ProgrammeType
-- Sample rows:
-- ProjectID Country Region District StartYear FundingUSD PopServed Before After
-- CP-001 Kenya Sub-Saharan Africa Turkana 2021 420000 18400 24% 81%
-- CP-002 Bangladesh South Asia Sylhet 2021 380000 22100 31% 88%
-- CP-003 Indonesia Southeast Asia NTT 2022 295000 14700 38% 79%
-- CP-004 Peru Latin America Loreto 2022 510000 26300 19% 76%
-- CP-005 Morocco MENA Draa 2023 340000 16800 42% 84%
-- ...continues to 80 project rows across 4 years
-- FILE 2: funding.csv (one row per funding tranche per project)
-- Columns: FundingID, ProjectID, FunderName, FunderType,
-- FundingYear, AmountUSD, GrantType
-- FunderType: Government | Foundation | Corporate | Individual
-- GrantType: Core | Restricted | Emergency | Matching
-- FILE 3: surveys.csv (field survey scores — 3 surveys per project)
-- Columns: SurveyID, ProjectID, SurveyYear, SurveyRound,
-- SanitationScore, WaterQualityScore,
-- CommunityEngagementScore, OverallScore
-- Relationships to build in the Data Source canvas:
-- projects.csv → funding.csv on ProjectID (one-to-many)
-- projects.csv → surveys.csv on ProjectID (one-to-many)
-- projects is the primary table — all sheets filter from it
Data Source canvas — 3 tables loaded:
projects (80 rows) → funding (240 rows, 3 tranches avg per project)
→ surveys (240 rows, 3 rounds per project)
Relationships confirmed — no row duplication on initial sheet test.
Primary table: projects · Total fields available: 38
Calculated Fields — Build These Before Any Sheet
Create all calculated fields in the Data pane before opening the first worksheet. Name them clearly — hiring managers reviewing your Tableau Public workbook will open the data source and read your calculations.
-- ── IMPACT METRICS ──────────────────────────────────────────
-- Percentage point improvement in water access
Access Improvement (pp) =
[WaterAccessAfter] - [WaterAccessBefore]
-- Number of additional people now with water access
People Gained Access =
INT([PopulationServed] * [Access Improvement (pp)])
-- Cost per person served (NULLIF prevents divide-by-zero)
Cost per Person Served =
[FundingUSD] / NULLIF([PopulationServed], 0)
-- Programme efficiency band
Efficiency Band =
IF [Cost per Person Served] <= 20 THEN "High"
ELSEIF [Cost per Person Served] <= 35 THEN "Medium"
ELSE "Low"
END
-- ── TARGET COMPARISON ────────────────────────────────────────
-- Each region has a target of 80% post-intervention access rate
Target Met =
IF [WaterAccessAfter] >= 0.80 THEN "Met"
ELSE "Below Target"
END
-- Distance above or below the 80% target
vs Target (pp) =
[WaterAccessAfter] - 0.80
-- ── LOD: REGION-LEVEL AGGREGATES ─────────────────────────────
-- Total people served per region (ignores sheet-level filters)
Region Total Served =
{ FIXED [Region] : SUM([PopulationServed]) }
-- Average access improvement per region
Region Avg Improvement =
{ FIXED [Region] : AVG([Access Improvement (pp)]) }
-- Region share of all people served
Region Share =
SUM([PopulationServed]) /
{ FIXED : SUM([PopulationServed]) }
-- ── SURVEY COMPOSITE ─────────────────────────────────────────
-- Weighted composite score: Water quality weighted highest
Survey Composite =
([SanitationScore] * 0.35) +
([WaterQualityScore] * 0.40) +
([CommunityEngagementScore] * 0.25)
Calculated fields validated on sample data — Avg Cost per Person Served: $18.40 → Efficiency Band: High Avg Access Improvement: +47.2 pp across all 80 projects Projects that Met 80% Target: 74% (59 of 80 projects) Highest avg improvement: Sub-Saharan Africa (+51.4 pp) Lowest avg improvement: MENA (+38.6 pp) Survey Composite global avg: 76.2 / 100
Dashboard Blueprint
Dashboard 1 — Sheet List and Action Wiring
-- Sheet 1: KPI — Active Projects
-- Marks: Text · COUNTD(ProjectID) · Label format: integer
-- Sheet 2: KPI — People Served
-- Marks: Text · SUM(PopulationServed) · Format: #,##0,,"M"
-- Sheet 3: KPI — Cost per Person Served
-- Marks: Text · AVG([Cost per Person Served]) · Format: $#,##0.00
-- Sheet 4: KPI — Target Met %
-- Marks: Text · COUNTD(ProjectID) filtered to [Target Met] = "Met"
-- divided by COUNTD(ProjectID) total · Format: 0%
-- Sheet 5: Symbol Map — Project Sites
-- Latitude on Rows, Longitude on Columns · Mark type: Circle
-- Size: SUM(PopulationServed)
-- Colour: Region (discrete — assign palette manually)
-- SSA=#f97316 SA=#22c55e SEA=#0ea5e9 LATAM=#a78bfa MENA=#fbbf24
-- Tooltip: ProjectName, Country, PopulationServed,
-- WaterAccessBefore, WaterAccessAfter, [Access Improvement (pp)]
-- Sheet 6: Bar Chart — Total Funding by Year
-- Columns: StartYear (discrete) · Rows: SUM(FundingUSD)
-- Colour: single orange · Label: SUM(FundingUSD) as "$#,##0,,"M""
-- Dashboard Actions:
-- Filter action: clicking a circle on the Symbol Map
-- Source: Sheet 5 · Target: all sheets on this dashboard
-- Fields: Region, Country
-- Clearing the selection: Show all values
-- Highlight action: hovering the bar chart year
-- Source: Sheet 6 · Target: Sheet 5
-- Fields: StartYear
Dashboard 1 — action test results: Click Kenya circle on map → all sheets filter to SSA · Kenya KPI cards update: People Served: 18,400 · Cost per Person: $22.80 Hover 2023 bar → 2023 project circles highlight on map (amber glow) Click empty space → all filters clear · full dataset restores
Dashboard 2 — Regional Deep Dive
The Regional Deep Dive uses a parameter to let the viewer select any of the five regions and see a full breakdown of projects, access improvement distribution, survey scores by district, and funder mix. This dashboard is designed for programme managers — they need district-level detail, not just global averages.
-- PARAMETER — Selected Region
-- Name: Selected Region · Data type: String
-- Allowable values: List
-- Values: Sub-Saharan Africa | South Asia | Southeast Asia |
-- Latin America | Middle East & North Africa
-- Display: dropdown
-- PARAMETER FILTER calculated field (apply to every sheet):
Region Filter =
[Region] = [Selected Region]
-- Drag to Filters shelf → set to True on each sheet
-- Sheet 1: Access Improvement Distribution (Box Plot)
-- Rows: AVG([Access Improvement (pp)])
-- Mark: Circle · Analysis → Aggregate Measures: OFF (disaggregate)
-- Add: Analytics pane → Box Plot
-- Colour: Efficiency Band
-- High = green · Medium = amber · Low = red
-- Tooltip: ProjectName, District, [Access Improvement (pp)],
-- [Cost per Person Served], Efficiency Band
-- Sheet 2: Survey Scores by District (Heat Map)
-- Columns: SurveyRound (1, 2, 3)
-- Rows: District
-- Mark: Square
-- Colour: AVG([Survey Composite]) — diverging palette
-- Red < 60 · White = 75 · Green > 85
-- Tooltip: District, SurveyRound, SanitationScore,
-- WaterQualityScore, CommunityEngagementScore, Survey Composite
-- Sheet 3: Funder Mix — Stacked Bar
-- Columns: SUM(AmountUSD)
-- Rows: Country (sorted by SUM(AmountUSD) descending)
-- Colour: FunderType
-- Label: Table calculation → Percent of Total
-- Compute using: FunderType
-- Sheet 4: District Scatter — Impact vs Cost (Quadrant Chart)
-- Columns: AVG([Cost per Person Served])
-- Rows: AVG([Access Improvement (pp)])
-- Size: SUM(PopulationServed)
-- Colour: Target Met
-- Reference lines:
-- Vertical: AVG([Cost per Person Served]) · dashed grey
-- Horizontal: Constant 0.80 · dashed orange · label "80% Target"
-- Quadrant reading:
-- Top-left: Low cost + High impact → best performers
-- Bottom-right: High cost + Low impact → flag for review
Dashboard 2 — Sub-Saharan Africa selected (16 projects):
Box plot: median improvement 51.4pp · IQR 44–58pp · 2 outliers below 35pp
Heat map: Turkana district declining score rounds 1→3 (flag for follow-up)
Funder mix: Government 48% · Foundation 31% · Corporate 14% · Individual 7%
Scatter: 12 of 16 projects top-left (low cost, high impact) ✓
2 projects bottom-right (high cost, low impact) ← flag for review
Dashboard 3 — Impact Scorecard
The Impact Scorecard is the Board and donor-facing view — clean, minimal, one screen. Every number is a headline finding. It should be readable as a screenshot and as an interactive embed on a donor's website.
-- Layout: Light theme (white background)
-- Contrast with the dark Dashboards 1 and 2
-- Row 1: Headline KPI strip (5 large number text sheets):
-- 1.48M people served · $18.40 cost/person · +47.2pp avg improvement
-- 74% targets met · 76.2 survey composite score
-- Row 2: Bullet Charts — one per region — Actual vs 80% target
-- Construction:
-- Step 1: Rows = Region · Columns = AVG([WaterAccessAfter])
-- Mark type = Bar · Colour = light grey
-- Step 2: Drag AVG([WaterAccessAfter]) to Columns again
-- → Dual Axis → Synchronise axes
-- Second axis: Mark type = Gantt Bar · width 3px · dark charcoal
-- Step 3: Analytics → Reference Line → Constant = 0.80
-- Format: dashed orange · label "80% Target"
-- Step 4: Analytics → Reference Band (background zones):
-- 0–60%: red zone
-- 60–75%: amber zone
-- 75–100%: green zone
-- Row 3: Dual-axis line chart — Global access rate 2022–2025
-- Primary axis: AVG([WaterAccessAfter]) by StartYear
-- Solid green line (#22c55e)
-- Secondary axis: SUM([People Gained Access]) by StartYear
-- Area chart · blue · 30% opacity (#0ea5e9)
-- Label the final data point on both axes
-- Row 4: Static text object — donor-facing summary:
-- "In 2025, ClearPath International delivered clean water access
-- to 1.48 million people across 5 regions at an average cost of
-- $18.40 per person. 74% of project sites exceeded the 80% target."
Bullet chart — all 5 regions: Sub-Saharan Africa: 78.0% amber zone · just below 80% South Asia: 85.2% green zone · ✓ exceeded Southeast Asia: 79.1% amber zone · just below Latin America: 76.4% amber zone · below MENA: 80.8% green zone · ✓ met Access trend: 2022: 61.4% → 2023: 70.2% → 2024: 75.8% → 2025: 78.0% People served: 2022: 228K → 2023: 420K → 2024: 614K → 2025: 1.48M
Assembling the Tableau Story
-- Story setup:
-- New Story → Size: Generic Desktop (1366 x 768)
-- Title: "ClearPath International — Water Access Impact Report 2022–2025"
-- Navigator style: Dots · Caption position: Bottom
-- Scene 1: "Where we work and who we reach"
-- Dashboard: Global Programme Overview
-- Caption: "80 projects. 5 regions. 1.48 million people with clean water."
-- Scene 2: "What's happening on the ground"
-- Dashboard: Regional Deep Dive
-- Caption: "Use the region selector to explore district-level outcomes."
-- Set parameter default: Sub-Saharan Africa
-- Scene 3: "Our impact against targets"
-- Dashboard: Impact Scorecard
-- Caption: "74% of sites exceeded the 80% access target. $18.40/person."
-- Pre-publishing checklist:
-- All dashboards fit 1366x768 without scrollbars ☐
-- All filter and highlight actions tested in Story view ☐
-- Parameter control visible and labelled on Dashboard 2 ☐
-- No sheet tabs visible — Presentation mode enabled ☐
-- Tooltip text uses plain English — no raw field names ☐
-- NULLIF() and ZN() wrappers in all division calculations ☐
-- Region colours locked across all three dashboards:
-- SSA=#f97316 SA=#22c55e SEA=#0ea5e9
-- LATAM=#a78bfa MENA=#fbbf24 ☐
-- Published to Tableau Public with description + tags ☐
-- Embed code tested in a standalone HTML page ☐
🔍 Practice
Q1. Describe exactly how the filter action on Dashboard 1 works — what triggers it, what it filters, and what happens when the user clears the selection.
Q2. The Region Total Served field uses a FIXED LOD expression. What would go wrong if you used a plain SUM(PopulationServed) on the same sheet as a Country filter?
Q3. The bullet chart on Dashboard 3 uses a dual axis. Walk through the four construction steps and explain why a plain bar chart alone is less useful for the Board.
🟢 Quiz
Q1. The capstone uses Tableau relationships rather than manual JOINs to connect the three tables. Why does this matter specifically for the projects and funding tables?
Q2. Dashboard 2 uses a parameter rather than a quick filter to select the region. What is the practical advantage?
Q3. The scatter plot on Dashboard 2 has four quadrants. Which quadrant is most important for the Operations Manager to investigate and why?
Course Complete
You've completed the Tableau course.
From connecting your first CSV to publishing a three-dashboard interactive story on Tableau Public — 60 lessons, one continuous goal: making data visible to the people who need to act on it.
Lessons 1–15: Beginner — connecting data, basic charts, and first dashboards
Lessons 16–30: Intermediate — calculated fields, filters, parameters, and maps
Lessons 31–45: Advanced — LOD expressions, table calculations, and dashboard actions
Lessons 46–60: Final Section — storytelling, Tableau Public, and the capstone