// src/pages/seo-consultant-montreal.astro --- import CityPage from '../components/CityPage.astro'; import data from '../data/cities/montreal.en'; --- // src/data/cities/montreal.en.ts import type { CityPageData } from '../../lib/city-types'; // Written against English Montreal queries ("SEO consultant Montreal", "SEO agency Montreal"), // not translated from the French page. const data: CityPageData = { lang: 'en-CA', slug: 'seo-consultant-montreal.html', alternate: { lang: 'fr-CA', slug: 'consultant-seo-montreal.html' }, city: 'Montreal', region: 'Quebec', updated: '2026-10-22', title: 'SEO Consultant in Montreal: Google & AI Search | Hicham Souilmi', description: 'Montreal SEO and GEO consultant: published pricing, realistic timelines, agency vs freelancer, bilingual SEO and getting cited by ChatGPT and Google AI.', imageAlt: "Hicham Souilmi, SEO and AI search consultant, beside the line: if AI can't find you, your customers can't either.", eyebrow: 'SEO · GEO · Montreal', h1: 'SEO Consultant in Montreal', h1Accent: 'found on Google and in AI answers.', lede: "Looking for someone to take on your SEO in Montreal? This page answers what people ask me before signing: what it costs, how long it takes, agency or freelancer, English or French, and how to get named by ChatGPT and Google AI.", takeaways: [ { label: 'What I offer', text: 'an SEO & GEO audit from CA$2,500 and ongoing support from CA$2,000/month, with one senior point of contact from first call to monthly reporting.' }, { label: 'Timeline', text: '3 to 6 months for visible progress and first leads, 6 to 12 months for consolidated rankings.' }, { label: 'English or French', text: 'in Montreal, both. Each language has its own queries and its own competitors; a translation is not enough.' }, { label: 'Agency or freelancer', text: 'an agency for a very large site or several parallel workstreams; an independent consultant to work directly with the person on your site.' }, { label: 'AI search', text: "GEO is part of the work, not an add-on: it builds on the same foundations as Google." }, ], market: { eyebrow: 'SEO in Montreal', h2: 'A mature, bilingual and crowded market.', paragraphs: [ 'Montreal packs a dense ecosystem: SaaS and tech (Plateau, Mile End, Griffintown), video games, manufacturing, e-commerce and professional services downtown. Established agencies, freelancers and in-house teams compete for the same keywords.', "Then there's the Montreal-specific layer: two languages. Your buyers search in English and French, with different queries. If you're English-first, your French version is both a legal requirement and an underused growth channel.", 'I start from your business goals: which keywords bring qualified leads, which pages need to convert, where the quick wins are.', ], }, sectors: { eyebrow: 'What works in Montreal', h2: "SEO doesn't play out the same in every sector.", items: [ { title: 'SaaS, tech and B2B', text: "Demand is national, often North American, and English-first. The city page is just one entry point: what matters is use-case and comparison pages." }, { title: 'Manufacturing and industrial', text: 'Rare, technical queries from buyers comparing suppliers. Search volume says nothing about revenue: one inquiry can pay for the year.' }, { title: 'Clinics and multi-location networks', text: 'It all happens in the local pack: one Google Business Profile per location, managed reviews, and one page per location that actually names the neighbourhood.' }, { title: 'Professional services', text: 'A dense market where search stays local. What sets you apart is precise service pages and proof of expertise that AI engines can quote.' }, ], }, comparison: { eyebrow: 'Comparison', h2: 'SEO agencies and consultants in Montreal', intro: "Providers Google shows for \"SEO consultant Montreal\" and \"SEO agency Montreal\", compared on criteria you can check by opening their sites. I wrote this comparison and I'm in it: judge it on its criteria, not its order.", headers: ['Provider', 'Type', 'GEO work shown', 'Published method', 'Published pricing', 'Google rating'], // FILL IN after your SERP survey. The section stays hidden while this list is empty. competitors: [], note: 'Surveyed on Month DD, YYYY on Google.ca for "SEO consultant Montreal" and "SEO agency Montreal". Directories and listicles excluded.', takeaway: '', }, pricing: { eyebrow: 'Pricing', h2: 'How much does SEO cost in Montreal?', intro: 'My rates are published before we talk. Exact scope is set during the free discovery call.', rows: [ { item: 'SEO & GEO audit', price: 'from CA$2,500', scope: 'Technical, content, links and AI visibility, with a prioritized page plan and a live debrief.' }, { item: 'Ongoing support', price: 'from CA$2,000/mo', scope: 'Direction, priorities, execution or supervision, and monthly measurement.' }, { item: 'Coaching and training', price: 'custom', scope: 'One-on-one sessions or a team day, worked on your own pages.' }, // ADD after survey: { item: 'Typical Montreal rates', price: 'CA$X–Y/mo', scope: 'Surveyed Month DD, YYYY among providers that publish pricing.' }, ], timeline: 'And how long until it works? 0–2 months for the audit and technical fixes, 3–6 months for visible progress, 6–12 months for consolidated rankings. Be wary of anyone promising the top spot in a few weeks.', }, labels: { takeawaysTitle: 'Key takeaways', updatedPrefix: 'Last updated', bookCta: 'Book a free audit call', servicesCta: 'See my services', servicesHref: 'services.html', homeLabel: 'Home', homeHref: 'index.html', breadcrumbAria: 'Breadcrumb', priceTableHeaders: ['Service', 'Price', 'What it covers'], faqEyebrow: 'FAQ · SEO in Montreal', faqH2: 'What people ask before signing', meshTitle: 'SEO consultant across Canada', meshFr: 'Français (Québec)', meshEn: 'English (Canada)', ctaEyebrow: 'Fastest way', ctaH2: 'Book a free audit call in Montreal', ctaText: "Thirty minutes, no pressure. We'll review where you stand on Google and AI search, and find your quickest wins.", ctaButton: 'Pick a time', navExtraLabel: 'Montreal SEO', altLangTitle: 'Cette page en français', }, faq: [ { q: 'How much does an SEO consultant cost in Montreal?', a: 'The SEO & GEO audit starts at CA$2,500 and ongoing support at CA$2,000 per month. Coaching and training are custom. Scope (site size, keyword competition, content volume, number of languages) is set during the free discovery call.' }, { q: 'How long until I see results?', a: '0–2 months for the audit and technical fixes, 3–6 months for visible progress and first leads, 6–12 months for consolidated rankings and measurable ROI.' }, { q: 'Do I need SEO in both English and French?', a: "In Montreal, yes. I build each language against its own keyword set, with separate URLs and hreflang, so Google serves the right version to each audience without the two competing." }, { q: 'My site is English-only. Is that a problem in Quebec?', a: "According to the Office québécois de la langue française, a business operating in Quebec must make its website available in French, and Bill 96 tightened those rules. I'm not a lawyer: confirm your case with the OQLF or legal counsel. On the SEO side, the French version should target French queries, not just mirror the English for compliance." }, { q: "What's the difference between SEO and GEO?", a: 'SEO targets your ranking in Google results; GEO targets your presence in answers generated by ChatGPT, Perplexity or Google AI. What makes you citable also strengthens your Google rankings, so I run both.' }, { q: 'I already paid an agency with nothing to show. Why would this be different?', a: "Usually two things were missing: an action plan ranked by business impact, and a monthly report you can read without being an SEO. Ask to see what was done in month one; with me, you can." }, { q: 'When does SEO pay for itself?', a: "The math runs on what a client is worth to you, not on traffic. Depending on your sector, a few contracts won over the year often cover the engagement. We run that math together on the call." }, { q: 'Do you work with businesses outside Montreal?', a: 'Yes. Based in Greater Montreal, I work with businesses in Laval, the West Island, the South Shore and across Quebec, and across Canada in English: Toronto, Ottawa, Calgary, Vancouver and beyond.' }, ], }; export default data; // src/components/CityPage.astro (gabarit partagé) --- // Gabarit unique des pages villes (FR et EN). // Toutes les variations viennent de `data` (src/data/cities/*.ts) et de shared-blocks.ts. import Base from '../layouts/Base.astro'; import type { CityPageData } from '../lib/city-types'; import { shared, BOOK_URL } from '../lib/shared-blocks'; import { buildCitySchema } from '../lib/city-schema'; import { ICONS } from '../lib/icons'; interface Props { data: CityPageData } const { data: d } = Astro.props; const s = shared[d.lang]; const sub = (t: string) => t.replaceAll('{city}', d.city); const updatedLabel = new Date(d.updated + 'T12:00:00').toLocaleDateString(d.lang, { day: 'numeric', month: 'long', year: 'numeric' }); const schema = buildCitySchema(d); const arrow = ''; ---

{d.eyebrow}

{d.h1} {d.h1Accent}

{d.lede}

{d.labels.updatedPrefix}

{d.labels.takeawaysTitle}

    {d.takeaways.map((t) => (
  • {t.label} :
  • ))}

{d.market.eyebrow}

{d.market.h2}

{d.market.paragraphs.map((p) =>

)}

{d.comparison.competitors.length > 0 && (

{d.comparison.eyebrow}

{d.comparison.h2}

{d.comparison.headers.map((h) => )} {d.comparison.competitors.map((c) => ( ))}
{h}
{c.name} {c.type} {c.aiWork} {c.method} {c.pricing} {c.rating}

{d.comparison.note}

)}

{d.pricing.eyebrow}

{d.pricing.h2}

{d.pricing.intro}

{d.labels.priceTableHeaders.map((h) => )} {d.pricing.rows.map((r) => ( ))}
{h}
{r.item} {r.price} {r.scope}

{d.sectors.eyebrow}

{d.sectors.h2}

{d.sectors.items.map((it) => (

{it.title}

))}

{s.geo.eyebrow}

{sub(s.geo.h2)}

{s.geo.paragraphs.map((p) =>

)}

{s.geo.cards.map((c) => (

{c.title}

{c.text}

))}

{sub(s.agency.eyebrow)}

{s.agency.h2}

{s.agency.agencyTitle}

    {s.agency.agencyItems.map((i) =>
  • •{i}
  • )}

{s.agency.freelanceTitle}

    {s.agency.freelanceItems.map((i) =>
  • ✦{i}
  • )}

{s.agency.note}

{sub(s.services.eyebrow)}

{s.services.h2}

{s.services.intro}

{s.services.items.map((it, i) => (
{String(i + 1).padStart(2, '0')}

{it.title}

{it.text}

{it.stepsLabel}
    {it.steps.map((st) =>
  • {st}
  • )}
{it.cta}
))}

{s.authority.eyebrow}

{s.authority.h2}

{s.authority.cards.map((c) => (

{c.name}

{c.role}

))}

{d.labels.faqEyebrow}

{d.labels.faqH2}

{d.faq.map((f) => (
{f.q}+

))}

{d.labels.meshTitle}

{d.labels.meshFr}

{s.mesh.fr.map((l) => {l.label})}

{d.labels.meshEn}

{s.mesh.en.map((l) => {l.label})}

{d.labels.ctaEyebrow}

{d.labels.ctaH2}

{d.labels.ctaText}

{d.labels.ctaButton}