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.
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.
What’s in the Skerrow Island Ferries dataset
Rendered from the same definition the download writes as TMDL.
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 dayDate 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 rowsRoutes 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 rowsThe 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 rowsWhy a sailing was cancelled.
- Reason (text)
Sailings
Fact · 168 rowsOne 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 rowsCancelled 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.
| Visual | Type | Fields |
|---|---|---|
| VesselSlicer | Slicer | Vessel[Vessel] |
| RouteSlicer | Slicer | Route[Route] |
| PassengersCard | Card | [Passengers] |
| On-Time %Card | Card | [On-Time %] |
| Reliability %Card | Card | [Reliability %] |
| CancellationsCard | Card | [Cancelled Sailings] |
| Load Factor %Card | Card | [Load Factor %] |
| On-Time % by MonthColumn chart | Column chart | Calendar[Month], [On-Time %] |
| Cancellations by ReasonDonut chart | Donut chart | Reason[Reason], [Cancelled Sailings] |
| Passengers by RouteBar chart | Bar chart | Route[Route], [Passengers] |
| Vessels by Load FactorTable | Table | Vessel[Vessel], [Passengers], [On-Time %] |
Rubric
Deterministic: the same code scores every entry. Worked example: the starter page itself.
| Criterion | Starter scores | Why |
|---|---|---|
| Design Check | 40/40 | Scores 100/100 (ready to export). |
| Text contrast | 15/15 | All 2 text boxes meet WCAG AA contrast against the background actually behind them. |
| Binds to the model | 22.7/25 | 10 of 11 built-in visuals are titled after a field in the dataset. |
| Covers the brief | 20/20 | 5 of 5 must-show items are on the page. |
| Total | 97.7/100 | Covers 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.