The business
The Fruit Basket is an independent grocer on Cranford Avenue in Mount Pleasant, Perth, trading since 2004. It’s a proper neighbourhood shop under new ownership: seasonal fruit and veg, gourmet cheese and deli meat, grazing platters, and the kind of stock a supermarket can’t be bothered curating. Open seven days, 7am to 7 or 8pm depending on the season, with a A$60 minimum for local delivery across 18 suburbs from Applecross to Willetton.
What they had before
No website that told this story. The shop’s real activity, this week’s stone fruit, the loaded platters, the regulars who order every Friday, lived on a Facebook page and Google Business Profile, and nowhere else. There was no analytics and no Search Console verified on any domain, so nobody could see what was actually working. A legacy Rails e-commerce site from a previous owner era had gone offline years earlier. Online ordering itself is handled through a third-party catalogue, A Better Choice, rather than anything built here, and internally the shop investigated Shopify and then a Merlin POS product-sync before concluding both were overkill for a single-store operation at this volume.
What we built
An Astro 6 site with 18 hand-written suburb delivery pages (/areas-we-deliver/[suburb]), each carrying its own distance, drive time, same-day cut-off, three local-context notes and a landmark list, rather than one paragraph that name-drops every suburb it wants to rank for. Each suburb page carries its own FAQPage schema built from real, suburb-specific facts (distance, cut-off, the A$60 minimum, nearby landmarks), not templated copy repeated 18 times.
Beyond the suburb pages: a produce-led /range section split by category (fruit and veg, cheese and antipasto, meat and deli, platters, pantry), a /catering page, a /shop route that’s currently a browse-only “coming soon” preview (products and indicative prices are visible, add-to-cart is intentionally disabled so no real order gets placed against a mock catalogue), and a weekly-specials-style content structure. The stack is React 19 islands on Astro 6, Tailwind 4, framer-motion and GSAP for the motion layer, react-hook-form for the contact flow, and a custom Sharp image service that defaults JPEG/WebP quality to 72 instead of Astro’s default 80, around 18% smaller output with no visible loss on produce photography. Three of the used photos (grazing and cheese board shots) were upscaled with Real-ESRGAN from 1280×896 to 2400×1680 to hold up at full width.
LocalBusiness/GroceryStore, FAQPage and BreadcrumbList JSON-LD are wired in, plus a dynamic llms.txt and robots.txt for AI crawler discovery. Sitemap entries carry a single deliberately-stamped lastmod date rather than a fresh timestamp on every deploy, a fresher-looking sitemap that never actually changes teaches Google to distrust the signal.
Where it stands
This is a measurement story, not a growth story yet. Before this build there was no way to see whether any of it was working. Google Search Console was verified for the domain via a Vercel DNS TXT record on 29 June 2026, and Vercel Web Analytics went live the same day. The first three-month baseline pulled from GSC: 97 impressions, 4 clicks, average position 7.5, 4.1% CTR, with impressions sitting near zero until a Google Business Profile link fix in late June, then climbing in the final week of the window. Early non-branded queries already showing up include “veggie shop near me,” “fruit and veg near me,” “fruit box delivery” and “fruit platter.” Separately, Google Business Profile data (unaffected by the site rebuild) shows the shop already gets real search volume, over 25,000 profile views and 3,200+ searches surfacing the profile across the first half of 2026, sitting third in the Maps 3-pack for “grocery store mount pleasant wa” on just 29 reviews. The site now gives that existing demand somewhere real to land, and the suburb pages, platter schema and delivery-page FAQ content were built specifically to convert search queries GSC has already started surfacing.
18 of 47 known pages showed as “discovered, not yet indexed” as of early July, which for a young site’s programmatic location pages is normal crawl rationing, not a fault: robots.txt allows crawling, pages self-canonicalise, there’s no noindex, and internal linking is strong. It resolves with time and authority, not a code fix.
What’s included
A one-off build plus a month-to-month retainer covering GBP management, tracking and content upkeep. The site, the suburb pages, the schema and the domain are the shop’s from day one. Cancel the retainer any time after 90 days and everything stays with the business.
