A fictional business. The figures are a modelled scenario, not a client result.
SEO case study · Inter-island ferry operator · Cebu
Tamarind Ferries
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
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
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.
Diagnosis
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.
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.
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.
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.
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.
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.
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
Built on our Signal plan, scoped to the pages passengers actually open on the way to the pier.
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.
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.
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.
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
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 DELAYEDOne page per route and season, server-rendered. Page weight from 4.8 MB to 1.4 MB. First schedule rich results appear.
3.9s DELAYED214 photos re-encoded with sizes and dimensions. CLS from 0.31 to 0.04. LCP drops under 3 s on 3G.
2.7s DELAYEDHidden tabs removed; fares and vessel names in the HTML. Terminal pages launch for six ports.
2.1s ON TIMETrip markup generated from the schedule feed for every route and seasonal variant. 78 routes eligible.
1.8s ON TIMEPerformance budget enforced in the build. Any page over 300 KB fails the deploy. 86 routes with rich results.
1.6s ON TIMEResults after 6 months
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
TF-R02 · ADMIT ONE
Organic bookings / month
4,700
from 1,900
TF-R03 · ADMIT ONE
Routes with timetable rich results
86
from 0
1,900 → 4,700 per month
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
tamarindferries.example › timetable
Timetable | Tamarind Ferries
Tamarind Ferries timetable. All routes. Click to view schedule...
Position 14 · page 2
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.
Position 2 · rich result
Cebu to Tagbilaran
Crossing 2h 00m
Search: “cebu to bohol ferry schedule”
Cebu to Ormoc
Crossing 2h 45m
Search: “cebu ormoc ferry time”
Cebu to Dumaguete
Crossing 4h 30m
Search: “ferry cebu to dumaguete today”
Danao to Camotes
Crossing 1h 30m
Search: “camotes island ferry schedule”
Hagnaya to Bantayan
Crossing 1h 10m
Search: “hagnaya to bantayan ferry”
Cebu to Siquijor
Crossing 5h 00m
Search: “cebu siquijor boat trip”
| Search term | Monthly volume | Before | After | SERP feature |
|---|---|---|---|---|
| cebu to bohol ferry schedule | 12,100 | 14 | 2 | Rich result |
| cebu ormoc ferry time | 4,400 | 22 | 3 | Rich result |
| ferry cebu to dumaguete today | 3,600 | 31 | 4 | Rich result |
| tamarind ferries timetable | 2,900 | 3 | 1 | Sitelinks |
| hagnaya to bantayan ferry | 2,400 | 18 | 2 | Rich result |
| camotes island ferry schedule | 1,900 | 9 | 1 | Rich result |
| cebu siquijor boat trip | 1,300 | 40 | 6 | Rich result |
| ferry with car cebu bohol | 880 | — | 5 | FAQ |
Modelled scenario for a fictional business — not a client result. Rankings and traffic are never guaranteed; see our Terms.
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.