Corporate site · US SEO

NixMar StudioAn English-language site for a software studio, built for New York and Connecticut local SEO

English site for my studio in Greenwich, CT: 19 marketing pages, a 21-article blog and local SEO for New York and Connecticut.

Technologies

  • Next.js 15
  • React 18
  • TypeScript
  • Tailwind CSS v4
  • Framer Motion
  • GSAP
  • EmailJS
  • Google Analytics 4 (Consent Mode v2)
  • Vercel Speed Insights
  • Vercel
NixMar Studio website home page, a web design, apps and custom software studio in Greenwich, CT
  • 19

    main pages

  • 21

    blog articles

  • 40

    sitemap URLs

  • 3

    pricing plans

My role

Design, development and SEO of NixMar Studio, my own studio for the US market: from the first Vite version to the Next.js migration, and continuous maintenance since.

The problem

The studio competes in English for very specific service searches - “web design Greenwich CT”, “custom software New York”, “how much does a website cost” - against the agencies that already hold those results. The site started out bilingual, with every page duplicated under /en and /es, which split crawling in two for a market that only searches in English. Every new round of pages also brought articles competing with each other and prices that no longer matched across copy, plans and structured data.

What I built

  • A conversion-focused home: services, integrations, a comparison, visibility in AI search, FAQ and a call to request a quote.
  • Seven service pages - web development, ecommerce, custom software, web pages in the USA, create a website, mobile apps and app development - plus a healthcare app development landing for New York.
  • Three decision guides: how much a website costs, how long a mobile app takes and who builds web applications.
  • A pricing page with three plans (Launch, Scale and Evolve) and starting prices per project type, read from a single module.
  • A portfolio with six delivered projects, a methodology page and an “about” page with its own FAQ.
  • A 21-article blog with topic filtering, table of contents, reading time, share buttons and related articles.
  • Contact through an EmailJS form, a quote dialog reachable from any page and a floating call, WhatsApp and SMS button.
  • Per-route structured data - Organization, ProfessionalService, WebSite with SearchAction, Service with OfferCatalog, BlogPosting, FAQPage, HowTo, ContactPage and BreadcrumbList - and an OG image generated at build time.

How it's structured

Next.js 15 with the App Router and server rendering. Each route in app/ is a minimal page that exports its metadata and mounts a view from views/; all copy comes from a single English content file, and an SEO component builds each route's JSON-LD from the same table that defines its titles and descriptions.

  • Conversion: /, /services, /pricing, /contact, /about, /methodology and /portfolio.
  • Services: /web-development, /ecommerce, /custom-software, /web-pages-usa, /create-website, /mobile-app, /mobile-app-development and /healthcare-app-development-new-york.
  • Decision guides: /website-cost, /mobile-app-timeline and /who-builds-web-apps.
  • Blog: /blog and /blog/[slug]. The article index, with each post's publication date and real edit date, lives in data/blogs.ts; the content lives in the copy file.
  • Single sources: per-route SEO in lib/seo-metadata.ts, prices in lib/pricing.ts and copy in locales/en.json.
  • Generated at build time: sitemap, robots.txt and OG image, all static.
  • Integrations: EmailJS for forms, GA4 with Consent Mode v2 and Vercel Speed Insights; deployed on Vercel.

SEO to compete in English in New York and Connecticut

Each page targets a specific Greenwich, Stamford, Fairfield County or New York search, chosen by looking at who holds that result today. The rest of the work is not wasting signals.

  • Canonical host with www: the non-www version 308-redirects, because Google was indexing both as separate URLs.
  • Titles up to 65 characters and descriptions of 120 to 320, checked by hand on every new route, and no meta keywords.
  • Related-guide blocks on pillar pages and landings, so crawlers know which pages belong to the same group.
  • The visible FAQs and the JSON-LD FAQPage come from the same text, so they never contradict each other.
  • robots.txt with explicit rules for Googlebot, Bingbot and the AI crawlers: GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot and Google-Extended.
  • Security headers on every route - two-year HSTS, Permissions-Policy, X-Frame-Options - and long caching for images and fonts.
  • llms.txt removed on purpose: the AI-search citation strategy rests on schema.org and the content, not on that file.

Inside the site

  • NixMar Studio: Pricing page with the Launch, Scale and Evolve plans
    Pricing page with the Launch, Scale and Evolve plans.
  • NixMar Studio: Blog index with topic filtering
    Blog index with topic filtering.

Technical decisions

  • One language and one URL per page: the site went from bilingual to English-only, with no locale prefix, to halve the URL count and focus crawling on the market that actually searches. Every old /en and /es URL 308-redirects to its equivalent.
  • Public prices live in a single module, and any copy, plan or JSON-LD offer that quotes a price has to match it: the same service cannot cost two different amounts on the same site.
  • generate_lead fires only once EmailJS confirms the message arrived. Clicks on quote, WhatsApp, phone or email have their own events: a click is intent, not a lead.
  • GA4 loads with Consent Mode v2 denied by default: until the visitor accepts, only cookieless pings go out, and measurement does not depend on anyone touching the banner.
  • Nothing fabricated in the markup: no aggregateRating until verifiable reviews exist, sameAs only with profiles that exist, and lastModified only when content really changes, never the build date.
  • A geo landing only when it offers something of its own - the New York healthcare apps page - instead of a matrix of near-identical city × service pages that Google treats as doorway pages.

Challenges

  • Moving an already-indexed bilingual site to English-only without losing signals: every old /en and /es URL redirects in a single hop to its root version.
  • Cutting cannibalization: five articles that competed with stronger ones or with service pages were retired and redirect to the surviving URL.
  • Performance: the inline-CSS option was putting the full Tailwind bundle (~171 KB) into every page's HTML, and the hero preloaded a 2752 px image on every route. Both were removed.
  • Realigning prices that had drifted across service pages, plans and structured data after several rounds of new content.

Result

The site is in production in English, with one URL per page, 40 URLs in the sitemap and its service pages, guides, blog and structured data published and crawlable. Every submitted form is recorded as a lead in GA4, and clicks to WhatsApp, phone and email are measured separately.

Need something like this?

Tell me what you're building and I'll come back with scope, stack and a realistic timeline.