Build a dedicated page per location under your main domain—typically /locations/city-name/ or /city-name/. Each page needs its own NAP block matching the Google Business Profile exactly, unique on-page copy describing service in that area, embedded map, local testimonials if you have them, and schema markup for LocalBusiness. Clone-and-replace templates kill your rankings; Google wants proof you actually operate there. Create and verify a Google Business Profile for every physical location or service area. Use consistent categories, upload real photos of the office or team in that city, and post updates monthly. If you're service-area only with no storefront, hide the address but still set your service radius. Multi-location chains often lose here by using generic stock photos or skipping posts—GBP activity directly impacts local pack visibility. Internal linking matters more than most agencies admit. Your homepage should link to a /locations/ hub, which links to each city page. Build local citations (directories like Yelp, Yellow Pages, industry listings) for each location with matching NAP. Check data aggregators like Neustar Localeze in Canada to fix inconsistencies that cascade across hundreds of sites. - Avoid city-specific subdomains or separate websites unless you're franchising with truly independent operators. One strong domain with 10 location pages outranks 10 weak domains. - Don't stuff every city name into one page's title tag. Google reads that as spam, not relevance. - Track rankings and GBP insights separately per location. Tools like BrightLocal or Local Falcon show where you're visible in each market. At Ottawa SEO, we see the biggest lift when clients pair this structure with localized link-building—sponsoring a Toronto event gets you a link to /locations/toronto/, not just the homepage. It tells Google the page represents real presence, not keyword opportunism. Expect 60–120 days to see traction in competitive metros like Vancouver or Calgary, faster in smaller markets.