HeritageBox

A direct-to-consumer digitisation shop where households post in tapes, photos, film and audio and get back originals plus digital files.

heritagebox.com/services/vhs-conversion-near-me-new-york
HeritageBox: City-aware service page from a parsed slug

What they came with

Someone with a shoebox of VHS tapes searches for a different phrase in every part of the country, and usually puts a town in it. What they are being sold, though, is one physical box, priced by item count, that has to accept tapes, photos, film reels, audio cassettes and slides in the same shipment. So the site has to carry two answers at once: a national catalogue of a single product, and a local answer for every combination of format, buying intent and city. And the order is not finished when the card clears, because there is a box out, a box back, and a digital delivery weeks later.

What the build had to do

One box sold in four sizes

The catalogue is a single physical product offered at four item counts, and each tier has to explain a conversion between formats: three items means three tapes or seventy-five photos, mixed as the customer likes. That arithmetic has to sit on a card without becoming a table, and the same four tiers reappear inside every format page and again in the order summary.

A slug that carries three variables

Local pages arrive as one path segment holding an intent, a service and a place, all hyphenated and all of variable length. The parser splits on the connecting word first, then falls back to matching the known service list longest-first and treating whatever remains as the location, so vhs-conversion-near-me-new-york and best-photo-scanning-in-san-antonio both resolve; anything that fails to parse is sent to the products page rather than left as a dead end.

City records that write the copy

Each of the 210 city records carries a state, a state code, a region, a timezone, a population, a search modifier and a list of nearby areas. The regional sentence, the local trust block and the other-services links are assembled from that one record, which is why a New York page can name Brooklyn and Queens without anyone typing them.

Checkout that sells time and add-ons

Before payment the order can pick up a turnaround tier, a USB drive on a quantity stepper, and an online gallery that runs free for thirty days and then bills yearly. Payment methods stay shut until the contact and shipping fields validate, so the summary and the total settle before Stripe or PayPal is asked for anything.

Address entry that fills itself

The shipping form is wired to Google Places, restricted to US addresses, and splits the returned components into street, city, state and ZIP. A guard flag and a capture-phase input listener hold the form's own change handling back while autocomplete writes, so the picker and the fields do not overwrite each other.

Technical detail

One shell, every route

Every URL, the whole local matrix included, is served the same hashed shell from the Vercel edge and resolved in the browser, with the title, a route-specific meta description and Schema.org JSON-LD written into the head once the route matches. The deploy artefact therefore stays one bundle regardless of how many URLs exist, and page identity lives in data rather than in the build; the sitemap index and the per-page schema blocks are what carry discovery in exchange.

The content model is keyword research

A service record holds the slug and display name alongside search volume, cost per click, a primary keyword and a set of secondary ones, then the price, the supported formats and the benefit lines used on the page. Forty of those crossed with 210 cities and 25 intent modifiers is what the sitemaps enumerate at 5,250 URLs per service, and the description for each combination comes from a per-intent template that clips itself at 155 characters.

Three server calls behind one button

The checkout hits separate endpoints to validate a promo code, create the Stripe payment intent, confirm it, write the order, and open the annual gallery subscription, with PayPal orders handled on an endpoint of their own. One submission has to reconcile a one-time charge, an optional recurring plan and a physical fulfilment record, which is why the intent is created only once the form is complete and the express path creates its own separately.

The stack

Interface

ReactVite build outputReact RouterTailwind CSSRadix UIlucide-react

Commerce

StripeStripe ElementsStripe Express CheckoutPayPal JS SDK

Platform and services

VercelVercel serverless functionsGoogle Places APIOpenAISlack

Measurement

Google Tag ManagerGoogle Analytics 4ContentsquareSchema.org JSON-LD
Sector
Memory digitisation
Audience
US households, mail-in
Shape
Catalogue, checkout, landing matrix
Platform
React SPA on Vercel
HeritageBox on a phone
heritagebox.com/products
HeritageBox: The box, the item conversion, the four tiers
heritagebox.com/cities/new-york
HeritageBox: City record writing its own local copy