Illustrative case study

A fictional business. The figures are a modelled scenario, not a client result.

SEO case study · Inter-island ferry operator · Cebu

Tamarind Ferries

How a Cebu ferry line made its timetable load on a 3G signal

Passengers checked schedules on patchy mobile data, and a heavy timetable page timed out before it loaded.

TF-001 · ADMIT ONE

Mobile LCP

1.6s

from 7.1s

VALID6months

Headline: Mobile LCP 7.1s → 1.6s · Asia-Pacific

Each ferry takes as long to cross as the timetable page took to paint on a 3G phone.

The challenge

The pier has one bar of signal.

Passengers checked schedules on patchy mobile data, and a heavy timetable page timed out before it loaded.

Most of Tamarind Ferries' passengers check departures from a jeepney, a pier or a guesthouse on another island, on prepaid mobile data that drops to 3G the moment they leave the city. The timetable was the most visited page on the site and the slowest: a single page holding every route's schedule for a full year, behind a hero photograph and a heavy booking script.

When it timed out, passengers did what anyone would: went back to search and booked through an aggregator, or turned up at the terminal and queued. Search engines saw the same slow, half-empty mobile page and ranked it accordingly.

timetable page weight
4.8 MB
timetable page weight
rows in one schedule table
11,000
rows in one schedule table
JavaScript before any time showed
640 KB
JavaScript before any time showed
routes with structured data
0
routes with structured data

Diagnosis

The inspection manifest.

Field data from real phones in the Visayas, a crawl of 1,140 URLs and lab runs on a throttled 3G profile produced six findings, ranked by how many passengers they cost.

  1. No. 01CriticalPerformance

    The timetable page shipped 4.8 MB: a 2.1 MB hero photo of a ship at sunset, plus every route's full-year schedule rendered as one 11,000-row table.

    Fix: Hero re-encoded to 38 KB AVIF with a WebP fallback; the table split into one lightweight page per route and season.

  2. No. 02CriticalPerformance

    Schedules were fetched client-side after a 640 KB JavaScript bundle loaded, so on a 3G signal the departure times never painted before the browser gave up.

    Fix: Departures server-rendered into the HTML; the booking widget loads only on tap.

  3. No. 03HighMobile-first

    The mobile template hid fares and vessel names behind tabs that Googlebot's smartphone crawler could not expand, so the indexed page had less content than desktop.

    Fix: Parity restored: every fare, vessel and port note present in the mobile HTML.

  4. No. 04HighStructured data

    No schema at all. Departures, ports and fares existed only as table cells, invisible to rich results.

    Fix: Trip and BoatTrip markup with departure and arrival ports, times, offers and the operating vessel, per route.

  5. No. 05MediumImages

    214 uncompressed port and deck photos, none with width or height set, causing a layout shift score of 0.31.

    Fix: Responsive sizes, explicit dimensions, lazy loading below the fold. CLS fell to 0.02.

  6. No. 06MediumLocal

    Six port terminal offices had no individual pages, so 'ferry terminal near me' searches went to aggregators.

    Fix: One page per terminal with hours, map directions written in text and a link to that port's departures.

The strategy

Four tickets, one destination: a fast timetable.

Built on our Signal plan, scoped to the pages passengers actually open on the way to the pier.

  1. 1

    Core Web Vitals

    Make the first useful thing paint first

    We set a budget of 300 KB per route page and 2.5 s LCP on a throttled 3G profile, then cut to it: critical CSS inlined, fonts swapped for system stacks, the booking script deferred until a passenger taps Book.

  2. 2

    Schedule schema

    Turn the timetable into data search engines can read

    Each route page now carries Trip and BoatTrip markup generated from the operator's schedule feed, so departure times can surface directly in search, and a nightly job keeps it in step with seasonal changes.

  3. 3

    Mobile-first indexing

    Make the phone version the complete version

    The smartphone crawler sees exactly what a passenger on the pier sees: fares, vessels, luggage rules and port notes, all in the initial HTML instead of behind tabs and scripts.

  4. 4

    Image compression

    Keep the sunset, lose the megabytes

    An image pipeline produces AVIF and WebP at five widths with explicit dimensions. Deck photos lazy-load; the hero is a 38 KB file that still looks like the Visayas at golden hour.

6 months, gate by gate

Departures.

  1. M01

    Audit and weigh-in

    Field data from real Cebu phones, a crawl of 1,140 URLs, and a 3G lab profile. The heaviest page in the fleet: the timetable.

    5.4s DELAYED
  2. M02

    Split the timetable

    One page per route and season, server-rendered. Page weight from 4.8 MB to 1.4 MB. First schedule rich results appear.

    3.9s DELAYED
  3. M03

    Image pipeline

    214 photos re-encoded with sizes and dimensions. CLS from 0.31 to 0.04. LCP drops under 3 s on 3G.

    2.7s DELAYED
  4. M04

    Mobile parity

    Hidden tabs removed; fares and vessel names in the HTML. Terminal pages launch for six ports.

    2.1s ON TIME
  5. M05

    Schema at scale

    Trip markup generated from the schedule feed for every route and seasonal variant. 78 routes eligible.

    1.8s ON TIME
  6. M06

    Hold the line

    Performance budget enforced in the build. Any page over 300 KB fails the deploy. 86 routes with rich results.

    1.6s ON TIME

Results after 6 months

Faster than the ferry it sells tickets for.

Modelled scenario for a fictional business — not a client result. Rankings and traffic are never guaranteed; see our Terms.

  • TF-R01 · ADMIT ONE

    Mobile LCP

    1.6s

    from 7.1s

    VALID6months
  • TF-R02 · ADMIT ONE

    Organic bookings / month

    4,700

    from 1,900

    VALID6months
  • TF-R03 · ADMIT ONE

    Routes with timetable rich results

    86

    from 0

    VALID6months
Mobile LCP by month (seconds, 3G field profile)
0s2s4s6s8sGood: under 2.5s7.1Start5.4M13.9M22.7M32.1M41.8M51.6M6
Organic bookings / month

1,900 → 4,700 per month

86
Routes with timetable rich results0 → 86 of 92 published routes and seasonal variants.

Crossing replay

The ferry takes exactly as long to cross as the timetable page took to paint on a throttled 3G phone that month.

1.6sMonth 6: mobile LCP, 290 KB page

CEBUTAGBILARAN
Bookings
4,700
Rich results
86 routes
Speed gained
100%
Before · baseline

tamarindferries.example › timetable

Timetable | Tamarind Ferries

Tamarind Ferries timetable. All routes. Click to view schedule...

Position 14 · page 2

After · month 6

tamarindferries.example › routes › cebu-tagbilaran

Cebu to Tagbilaran Ferry: Today's Departures & Fares

6 sailings daily · 2h crossing · from ₱ 520 · vehicle deck on the 06:00 and 13:30.

06:0008:3011:0013:3016:0018:30

Position 2 · rich result

One ticket per route. Tear the stub to see where it ranks now.

  • TF-101DEP 06:00

    Cebu to Tagbilaran

    Crossing 2h 00m

    Search: “cebu to bohol ferry schedule”

  • TF-214DEP 07:30

    Cebu to Ormoc

    Crossing 2h 45m

    Search: “cebu ormoc ferry time”

  • TF-318DEP 08:15

    Cebu to Dumaguete

    Crossing 4h 30m

    Search: “ferry cebu to dumaguete today”

  • TF-405DEP 05:30

    Danao to Camotes

    Crossing 1h 30m

    Search: “camotes island ferry schedule”

  • TF-522DEP 09:00

    Hagnaya to Bantayan

    Crossing 1h 10m

    Search: “hagnaya to bantayan ferry”

  • TF-630DEP 13:00

    Cebu to Siquijor

    Crossing 5h 00m

    Search: “cebu siquijor boat trip”

Keyword positions

Modelled Google positions before and after, by search term
Search termMonthly volumeBeforeAfterSERP feature
cebu to bohol ferry schedule12,100142Rich result
cebu ormoc ferry time4,400223Rich result
ferry cebu to dumaguete today3,600314Rich result
tamarind ferries timetable2,90031Sitelinks
hagnaya to bantayan ferry2,400182Rich result
camotes island ferry schedule1,90091Rich result
cebu siquijor boat trip1,300406Rich result
ferry with car cebu bohol880—5FAQ

Modelled scenario for a fictional business — not a client result. Rankings and traffic are never guaranteed; see our Terms.

Get a plan like this

If your customers find you on a weak signal, speed is the ranking factor you can actually control. Start with the Signal plan, or tell us where your pages are slowest.