Challenge #1 · Draft · not open for entries

Island ferry operations

Design a one-page operations report for a fictional island ferry operator from an original synthetic dataset, scored by Design Check and a published rubric.

Draft: not open for entries yet.

The brief, dataset and rubric are published so you can try them. There are no prizes and no dates yet: prize terms are being reviewed before the challenge opens. You can still publish a design to the community gallery; it just isn’t a challenge entry.

The brief

The operations director of Skerrow Island Ferries reads this page every Monday with the harbour masters. They need to see in under a minute whether the timetable ran, whether boats left on time, how full they were and why sailings were cancelled.

Skerrow Island Ferries is a fictional operator invented for this challenge. It runs four routes from the mainland port of Northpoint to three islands with six vessels of three sizes. The dataset covers two years of monthly sailings: how many were planned and how many ran, passengers, vehicles, seats offered, departures within ten minutes of schedule, fuel burned and fare revenue, plus every cancellation with its reason (weather, technical, crew or port).

Design one report page for the director. Lead with the few numbers that answer “did we run the service?”, then show where and why it slipped. Winter weather drives most cancellations, and the older vessels are less reliable — a good page lets the director see both without reading a table.

Download the dataset as a PBIP: the starter page, already bound to every table and measure, opens with data in Power BI Desktop. Restyle the starter in the Design Studio, or design your own page from scratch; name each visual slot after what it shows (for example “On-Time % by Month” or “Cancellations by Reason”), because the rubric checks that your slots match the dataset and cover the brief.

The page must show

  • On-time departures (On-Time %)
  • Service reliability or cancellations
  • How full the boats are (Load Factor %)
  • Why sailings were cancelled (by reason)
  • A view over time (by month or quarter)

Constraints

  • One report page; any page size from the Studio presets.
  • Built-in Power BI visuals only (custom-visual placeholders are fine but are not scored for data binding).
  • Your own design: no logos, screenshots or assets you don't have the rights to. The islands are fictional, so map visuals won't place them; use bars, a matrix or a shape instead.

Starter page and dataset

A plain starting point bound to the dataset. Restyle it, rearrange it or start from a blank page.

Starter page for the Island ferry operations challenge: 2 × slicer, 5 × card, 1 × column chart, 1 × donut chart, 1 × bar chart, 1 × table

The starter is the layout of the Fleet Management template, relabelled for the Skerrow Island Ferries dataset: every KPI, chart and slicer title names a measure or field in the download, so each slot binds when you open the PBIP. The preview shows the slots, not data; the numbers come from the dataset.

Open the starter in the Design Studio

What’s in the Skerrow Island Ferries dataset

Rendered from the same definition the download writes as TMDL.

Tables
6
Fact rows
509
DAX measures
12

Skerrow Island Ferries is a fictional ferry operator invented for this challenge: four routes between a mainland port and three islands, six vessels, and two years of monthly sailings (Nov 2024 to Oct 2026) with passengers, cars, capacity, on-time departures, fuel and fare revenue, plus cancellations by reason. Units: Pounds sterling for revenue; litres for fuel; sailings, passengers and vehicles are counts.

Tables and columns

Calendar

Date table · 2024–2026, one row per day

Date table generated in Power Query (List.Dates), marked as the model's date table.

  • Date (date)
  • Year (whole number)
  • Quarter (text)
  • Month (text)
  • Month Name (text)
  • Week Start (date)
  • Weekday (text)
  • Fiscal Year (text)

Route

Dimension · 4 rows

Routes with origin and destination port, crossing time in minutes and the island served (the islands are fictional, so they do not geocode on a map).

  • Route (text)
  • From Port (text)
  • To Port (text)
  • Crossing Minutes (whole number)
  • Island (text)

Vessel

Dimension · 6 rows

The fleet: vessel class, passenger capacity, car spaces and year built.

  • Vessel (text)
  • Class (text)
  • Passenger Capacity (whole number)
  • Car Spaces (whole number)
  • Year Built (whole number)

Reason

Dimension · 4 rows

Why a sailing was cancelled.

  • Reason (text)

Sailings

Fact · 168 rows

One row per route, vessel and month: planned and completed sailings, passengers, vehicles, seat capacity offered, departures within 10 minutes of schedule, fuel burned and fare revenue.

  • Date (date)
  • Route (text)
  • Vessel (text)
  • Planned Sailings (whole number)
  • Sailings (whole number)
  • Passengers (whole number)
  • Vehicles (whole number)
  • Seats Offered (whole number)
  • On-Time Departures (whole number)
  • Fuel Litres (decimal)
  • Fare Revenue (decimal)

Cancellations

Fact · 341 rows

Cancelled sailings by route, vessel, month and reason.

  • Date (date)
  • Route (text)
  • Vessel (text)
  • Reason (text)
  • Cancelled Sailings (whole number)

Relationships

Many-to-one, single direction. Inactive relationships are switched on inside a measure with USERELATIONSHIP.

  • Sailings[Date] → 'Calendar'[Date]
  • Sailings[Route] → Route[Route]
  • Sailings[Vessel] → Vessel[Vessel]
  • Cancellations[Date] → 'Calendar'[Date]
  • Cancellations[Route] → Route[Route]
  • Cancellations[Vessel] → Vessel[Vessel]
  • Cancellations[Reason] → Reason[Reason]

DAX measures

All measures live in a dedicated Key Measures table. Copy any of them into your own model; rename the table and column references to match.

PassengersPassengers carried.
Passengers =
SUM ( Sailings[Passengers] )

Format string: #,0

Passengers PYPassengers in the same period last year.
Passengers PY =
CALCULATE ( [Passengers], SAMEPERIODLASTYEAR ( 'Calendar'[Date] ) )

Format string: #,0

Passenger Growth %Year-over-year change in passengers.
Passenger Growth % =
DIVIDE ( [Passengers] - [Passengers PY], [Passengers PY] )

Format string: +0.0%;-0.0%;0.0%

VehiclesCars and vans carried.
Vehicles =
SUM ( Sailings[Vehicles] )

Format string: #,0

Sailings CompletedSailings that ran.
Sailings Completed =
SUM ( Sailings[Sailings] )

Format string: #,0

Planned SailingsSailings in the timetable (the target for completed sailings).
Planned Sailings =
SUM ( Sailings[Planned Sailings] )

Format string: #,0

Cancelled SailingsSailings cancelled, by any reason.
Cancelled Sailings =
SUM ( Cancellations[Cancelled Sailings] )

Format string: #,0

Reliability %Share of timetabled sailings that ran.
Reliability % =
DIVIDE ( [Sailings Completed], [Planned Sailings] )

Format string: 0.0%

On-Time %Departures within 10 minutes of schedule, over sailings completed.
On-Time % =
DIVIDE ( SUM ( Sailings[On-Time Departures] ), [Sailings Completed] )

Format string: 0.0%

Load Factor %Passengers over seats offered.
Load Factor % =
DIVIDE ( [Passengers], SUM ( Sailings[Seats Offered] ) )

Format string: 0.0%

Fare RevenueTicket revenue for passengers and vehicles.
Fare Revenue =
SUM ( Sailings[Fare Revenue] )

Format string: £#,0

Fuel per SailingLitres of fuel per completed sailing.
Fuel per Sailing =
DIVIDE ( SUM ( Sailings[Fuel Litres] ), [Sailings Completed] )

Format string: #,0

What each visual is bound to

The PBIP opens with these fields already on each visual.

Field bindings per visual
VisualFields
VesselSlicerVessel[Vessel]
RouteSlicerRoute[Route]
PassengersCard[Passengers]
On-Time %Card[On-Time %]
Reliability %Card[Reliability %]
CancellationsCard[Cancelled Sailings]
Load Factor %Card[Load Factor %]
On-Time % by MonthColumn chartCalendar[Month], [On-Time %]
Cancellations by ReasonDonut chartReason[Reason], [Cancelled Sailings]
Passengers by RouteBar chartRoute[Route], [Passengers]
Vessels by Load FactorTableVessel[Vessel], [Passengers], [On-Time %]

Rubric

Deterministic: the same code scores every entry. Worked example: the starter page itself.

Rubric applied to the starter page
CriterionStarter scoresWhy
Design Check40/40Scores 100/100 (ready to export).
Text contrast15/15All 2 text boxes meet WCAG AA contrast against the background actually behind them.
Binds to the model22.7/2510 of 11 built-in visuals are titled after a field in the dataset.
Covers the brief20/205 of 5 must-show items are on the page.
Total97.7/100Covers every must-show item.

Finalists will also be reviewed by people. There is no AI critique in the score.

Entries

Entries open when the challenge opens. Until then, publish designs to the community gallery as usual.

More