Quick Answer: Create city page variants by separating the page intent along two axes: location and service line, then enforcing a one-page-per-intent rule in your information architecture. Each page should target a unique keyword set, unique proof points, and unique conversion path so the city page for "plumbing in Dallas" does not compete with "HVAC in Dallas" or "plumbing in Fort Worth".
To avoid overlap, build city pages from a controlled template system rather than cloning the same landing page across locations and services. Start by mapping each service line to its own canonical page hierarchy, then assign one primary city-page URL to one primary intent cluster only. Differentiate each variant with localized service evidence, distinct FAQs, service-specific internal links, unique schema markup, and unique title/H1 copy that reflects the exact query pattern. The objective is to prevent keyword cannibalization by ensuring every page answers a different search intent, supports a different conversion event, and earns rankings for a non-overlapping combination of city + service line + use case.