Back to home
Project 7 · Mar – Oct 2026

RedBridge Website V3

Role: Head of IT · Sole technical architect, developer & SEO implementer · Cross-subsidiary, Siddeley Group · 12 phases · 24+ routes · 182+ components · 429 commits

Business Impact

Cost

The entire V3 redevelopment — 24+ bilingual routes, 182+ components, a full design system, and a full technical SEO implementation across 12 phases — was delivered solo with zero agency or contractor spend. A comparable from-scratch agency build plus full technical SEO audit and implementation of this scope typically runs $43,000–$103,000 AUD, avoided entirely with no ongoing retainer.

Marketing

Phase 4's hreflang and canonical fixes plus Phase 5's sitemap submission and FAQPage/LocalBusiness schema directly improve organic visibility for a bilingual audience in a high-intent, competitive niche (skilled migration consulting, Melbourne). The Chinese-language pages are now properly indexed and eligible to rank in zh-CN Google Search — opening a channel to RedBridge's core Mandarin-speaking skilled migrant audience without any additional ad spend.

Revenue

The Phase 1 hub-and-spoke SEO architecture concentrates topical authority on the Employer Pathway service area, reinforced by structured data built across Phases 4–5 and 10: FAQPage (expanded to 23 Q&A pairs), BreadcrumbList, Organization/LocalBusiness, and social OG metadata — making the site eligible for FAQ accordions, breadcrumb trails, a knowledge panel, and professional social share cards, increasing click-through rate at zero marginal cost.

Scale at a Glance

429
Commits
24+
Routes
182+
Components
12
Phases
1 Jul
CSIT indexed on day of change
23
FAQPage Q&A pairs in structured data
7
Smoke tests per deploy
11
FAQ answers un-hidden from Googlebot
$0
External agency spend

Project Summary

FieldDetails
Project NameRedBridge Consulting Website V3 — Full Redevelopment, SEO Architecture & Technical SEO Audit
项目名称RedBridge Consulting 网站 V3 — 全面重构、SEO 架构与技术 SEO 审计
PeriodMar 6 – Oct 2026 (12 phases)
周期2026年3月6日–10月(12个阶段)
CompanyRedBridge Consulting Pty Ltd (ABN 88 678 186 091)
公司RedBridge Consulting Pty Ltd(ABN 88 678 186 091)
RoleHead of IT — Sole technical architect, developer & SEO implementer; bridging design intent and production delivery across an inter-subsidiary engagement
职能IT 总监 — 独立技术架构师、开发者兼 SEO 实施者;跨子公司协作中衔接设计意图与生产交付
Total Commits429
总提交数429
Routes24+ bilingual page routes (EN + ZH)
路由数24+ 个双语页面路由(中 + 英)
Components182+
组件数182+
StackNext.js 16 (App Router) + next-intl · TypeScript · Tailwind CSS · shadcn/ui · react-hook-form + Zod · libphonenumber-js · Cloudflare Workers via OpenNext · Cloudflare R2 · hls.js · FFmpeg · Google Apps Script · GitHub Actions CI/CD · Google Tag Manager · Google Ads · Google Sheets API · Meta Conversions API · Google Search Console
技术栈Next.js 16(App Router)+ next-intl · TypeScript · Tailwind CSS · shadcn/ui · react-hook-form + Zod · libphonenumber-js · 通过 OpenNext 部署至 Cloudflare Workers · Cloudflare R2 · hls.js · FFmpeg · Google Apps Script · GitHub Actions CI/CD · Google Tag Manager · Google Ads · Google Sheets API · Meta Conversions API · Google Search Console
Phase 1 ScopeV3 redevelopment from scratch — architecture, design system, hub-and-spoke SEO, full EN/ZH i18n, multi-step booking form, Google Sheets lead capture, Meta CAPI, GTM + Google Ads, attribution tracking
第一阶段范围从零开始的 V3 重构 — 架构、设计系统、轮辐式 SEO 架构、完整中英国际化、多步骤预约表单、Google Sheets 线索捕获、Meta CAPI、GTM + Google Ads、归因追踪
Phase 2 ScopeTechnical debt reduction, architecture restructure & content accuracy — removed 82 orphaned message files, corrected MARN number (1467670 → 1467870), renamed 482 TSS → Skills in Demand (SID), added Automotive sector, consolidated duplicated components
第二阶段范围技术债削减、架构重组与内容准确性核查 — 删除 82 个孤立 message 文件,修正 MARN 号码(1467670 → 1467870),将 482 TSS 更名为 SID 签证,新增汽车行业板块,整合重复组件
Phase 3 ScopeCodebase quality audit — Tailwind migration, design tokens, refactor
第三阶段范围代码库质量审计 — Tailwind 迁移、设计令牌、重构
Phase 4 ScopeTechnical SEO audit — hreflang, duplicate titles, robots.ts, BreadcrumbList, MARN/ABN constant, meta keywords removal
第四阶段范围技术 SEO 审计 — hreflang、重复标题、robots.ts、BreadcrumbList、MARN/ABN 常量、移除 meta keywords
Phase 5 ScopeFAQPage & LocalBusiness schema, sitemap submitted to GSC, /services/ URL flattening, inline contextual linking, founder support
第五阶段范围FAQPage 与 LocalBusiness 结构化数据、站点地图提交至 GSC、/services/ URL 精简、内联上下文链接、创始团队支持
Phase 6 ScopeCI/CD pipeline via GitHub Actions, 7-test post-deploy smoke suite (cache purge → route verification), production deployment bug fix, and three-root-cause FAQ inline link fix
第六阶段范围GitHub Actions CI/CD 流水线、7 项部署后冒烟测试套件(缓存清除 → 路由验证)、生产部署 bug 修复,以及三根因 FAQ 内联链接 bug 修复
Phase 7 ScopeContent cluster expansion (Clusters 1–7) — 6 new indexed pages covering 482 requirements, Skills in Demand rebrand, 482-to-PR pathway, visa sponsorship jobs (1,694 words), Career Launch expansion (1,738 words), employer pathway hub expansion (2,002 words) + FAQ Googlebot crawlability fix; grouped mega menu surfacing all 9 employer pathway pages in two labelled groups
第七阶段范围内容集群扩展(集群 1–7)— 6 个新索引页面,涵盖 482 签证要求、Skills in Demand 更名解释、482 转 PR 路径、签证担保工作(1,694 字)、职业启航计划扩展(1,738 字)、雇主担保通道枢纽扩展(2,002 字)+ FAQ Googlebot 可爬取性修复;分组大导航菜单将全部 9 个雇主担保通道页面分两组呈现
Phase 8 ScopeData hygiene (ZH About page orphaned keys removed), GSC-informed SEO metadata rewrite (6 pages, caught MARN inaccuracy in client copy), regulatory accuracy fix (MLTSSL → CSOL across 4 files, 6 strings), 10-gap internal linking audit & implementation (18 files: homepage, spoke pages, FAQ, success cases, for-employers fee table, About, booking success card)
第八阶段范围数据清理(删除 ZH 关于页面孤立 JSON 键)、基于 GSC 数据的 SEO 元数据改写(6 个页面,发现并纠正客户文案中的 MARN 不准确表述)、法规准确性修复(MLTSSL → CSOL,4 个文件 6 处字符串)、10 项内部链接缺口审计与实施(18 个文件:首页、子页面、FAQ、成功案例、雇主费用表、关于页面、预约成功提示卡)
Phase 9 Scope1 Jul 2026 CSIT indexation update ($76,515 → $79,499 across 6 files, 8 strings; TSMIT → CSIT label fix in 2 FAQ files); post-launch internal link audit (10 gaps reviewed, 2 genuine gaps implemented); PaymentMilestones tablet/mobile layout fix (2 independent CSS root-cause bugs); NavBar logo overflow fix & height increase (18 files updated)
第九阶段范围2026年7月1日 CSIT 薪资门槛年度更新($76,515 → $79,499,6 个文件 8 处字符串;2 个 FAQ 文件中 TSMIT → CSIT 标签修正);发布后内部链接审计(10 项缺口复查,2 项真实缺口实施);PaymentMilestones 平板端/移动端布局修复(2 个独立 CSS 根因 bug);导航栏 Logo 溢出修复与高度调整(18 个文件更新)
Phase 10 ScopeTechnical SEO overhaul (late Jun – Jul 2026): resolved live i18n rendering bug (raw key string surfacing in footer for all visitors); corrected title tags to 50–60 character range (5 pages); rewrote meta descriptions to ~150 chars with CTAs across all key pages; injected primary keywords (482, 186, Melbourne) into H1 headings (5 pages); fixed alt text on Xiaohongshu icons (2 components); upgraded OG image from broken 160×44px to 1200×630px branded image; upgraded Twitter Card to summary_large_image; verified hreflang alternate tags (en, zh, x-default) in production HTML; added LocalBusiness + Organization JSON-LD to homepage; expanded FAQPage structured data from 8 to 23 Q&A pairs across all three FAQ categories; improved anchor text specificity on SuccessStrip CTAs and SpokeNavCards; wired hero video poster frame (LCP fix). Agency-equivalent cost avoided: $3,000–$8,000 AUD
第十阶段范围技术 SEO 全面升级(2026年6月末–7月):修复上线 i18n 渲染 bug(页脚对全体访客显示原始键名字符串);将 5 个页面标题标签修正至 50–60 字符最优区间;将全部关键页面 meta 描述改写至约 150 字符并添加明确 CTA;在 5 个页面 H1 中注入主要关键词(482、186、墨尔本);修复两个组件中小红书图标 alt 文本;将 OG 图片从损坏的 160×44px 升级为 1200×630px 品牌图片;将 Twitter Card 类型升级为 summary_large_image;在生产 HTML 中验证 hreflang 备用标签(en、zh、x-default)渲染正确;在首页新增 LocalBusiness + Organization JSON-LD 结构化数据;将 FAQPage 结构化数据从 8 条扩展至 23 条(覆盖三个 FAQ 类别);优化锚文本特异性;为英雄视频添加 poster 帧(LCP 修复)。节省外部机构费用:$3,000–$8,000 澳元
Phase 11 ScopeZH success story localisation (cases.ts extended with ZH content, SuccessCards.tsx + CaseSpotlight.tsx made locale-aware via useLocale(), all 24 case studies, messages JSON updated); form analytics & data quality (locale tracking corrected from an unpopulated ?locale= query param to URL pathname across both client and employer enquiry forms; country dial code selection storing mobile numbers in E.164; minimum age 18 validation on date of birth); Google Apps Script silent data-loss fix (appendRow() → getLastRow() + 1 + setValues() with an all-empty guard); custom country dial code selector built without a third-party library, replacing react-phone-number-input; maintenance banner system built across 16 routes then fixed and removed; form submission route.ts end-to-end rewrite (Apps Script redirect/response parsing, Meta CAPI async confirmed); stale BOOKING_SHEET_URL Cloudflare env var identified and updated
第十一阶段范围中文版成功案例本地化(cases.ts 新增 ZH 内容、SuccessCards.tsx 与 CaseSpotlight.tsx 通过 useLocale() 支持语言切换、覆盖全部 24 个案例、messages JSON 补齐 ZH 键);表单分析与数据质量(将语言追踪从从未被填充的 ?locale= 查询参数改为读取 URL 路径,覆盖客户端与雇主端两个询盘表单;新增国家区号选择,手机号以 E.164 格式存储;出生日期新增 18 岁最低年龄校验);Google Apps Script 静默数据丢失修复(appendRow() → getLastRow() + 1 + setValues(),并新增全空值守卫);不依赖第三方库自建国家区号选择器,替换 react-phone-number-input;跨 16 个路由构建维护横幅系统,随后修复并移除;表单提交 route.ts 端到端重写(Apps Script 重定向解析、Meta CAPI 异步确认);识别并更新过期 BOOKING_SHEET_URL Cloudflare 环境变量
Phase 12 ScopeHLS video streaming on the About page (4K 111 Mbps master compressed to a web-optimised 1080p stream via FFmpeg, 4-second segments hosted on Cloudflare R2, client-side hls.js player with native Safari fallback, poster frame, CSP connect-src/media-src/img-src updated for R2, replacing a react-player v3 implementation that failed to initialise in the Workers runtime); phone validation extracted to src/lib/phone.ts (full-width character normalisation, paste-aware dial code composition, libphonenumber-js/mobile validation, blur-and-submit validation timing); brand and contact consolidation (Siddeley Talent Link references removed from the About page and footer group links, all contact emails standardised to info@redbridge-consulting.com.au, footer affiliation copy changed from 'Part of the' to 'Partners with', CI smoke test repaired after the copy change across 4 commits)
第十二阶段范围关于页面 HLS 视频流(4K 111 Mbps 母带经 FFmpeg 压缩为网络优化的 1080p 流,切分为 4 秒片段并托管于 Cloudflare R2,客户端 hls.js 播放器配 Safari 原生回退,新增 poster 封面帧,更新 CSP 的 connect-src/media-src/img-src 以允许 R2 请求,替换在 Workers 运行时无法初始化的 react-player v3 实现);电话校验逻辑抽离至 src/lib/phone.ts(全角字符归一化、支持粘贴的区号拼接、libphonenumber-js/mobile 校验、失焦与提交两处校验时机);品牌与联系方式统一(从关于页面及页脚集团链接中移除 Siddeley Talent Link 引用,全站联系邮箱统一为 info@redbridge-consulting.com.au,页脚关联表述从 'Part of the' 改为 'Partners with',并在文案变更后跨 4 次提交修复 CI 冒烟测试)
Cost ImpactEst. $43,000–$103,000 AUD agency cost avoided (V3 build + full technical SEO audit + implementation)
成本影响估计节省机构建站及完整技术 SEO 审计与实施费用 $43,000–$103,000 澳元
Live URLhttps://redbridge-consulting.com.au
上线链接https://redbridge-consulting.com.au
Production URLhttps://redbridge-v3.vanessachs-work.workers.dev/
生产环境链接https://redbridge-v3.vanessachs-work.workers.dev/

Phase Breakdown

  • Built an HLS streaming pipeline to deliver a self-hosted About page video to both domestic and China-based users — compressing a 4K master (111 Mbps) to a web-optimised 1080p stream with FFmpeg, segmenting it into 4-second chunks, and hosting the output on Cloudflare R2. Self-hosting rather than embedding a third-party player is what makes the video playable for RedBridge's core Mandarin-speaking audience inside China, where the major Western video hosts are unreachable
  • Implemented a client-side hls.js player with native Safari fallback via useEffect — Safari plays the HLS manifest natively while every other browser is served through hls.js — and added a poster frame thumbnail so the player shows a branded still immediately instead of a blank box while the first segments load
  • Updated the Content Security Policy (connect-src, media-src, img-src) to permit R2 requests, and replaced an earlier react-player v3 implementation that failed to initialise in the Cloudflare Workers runtime — the second component on this project to require replacing a third-party library that could not run in the Workers environment
  • Extracted all phone handling into a new src/lib/phone.ts module of pure functions with no React dependency, making the logic independently testable and reusable across both enquiry forms: normalizePhoneInput converts full-width 0-9 and + characters to ASCII and strips spaces, dashes, and brackets; buildCombinedPhone uses a local number as-is when it already starts with + (so a pasted international number survives intact) and otherwise strips leading zeros before prepending the selected dial code; phoneErrorMessage validates against the libphonenumber-js/mobile bundle and formats the country name plus a worked example into the error text
  • Chose the mobile-only libphonenumber-js bundle deliberately so that a landline or otherwise non-mobile number — for example +86412345678 — correctly fails validation rather than passing as a valid phone number, ensuring every captured number is actually reachable by SMS and mobile call
  • Tuned validation timing so the form corrects rather than nags: blurring either the dial code select or the number input validates and sets or clears the error, submitting without ever touching the field runs the same phoneErrorMessage callback through Zod so the wording is identical on both paths, and nothing validates mid-typing — no error appears while a user is still part-way through entering a number
  • Removed Siddeley Talent Link references from the About page and the footer group links, and changed the footer affiliation copy from 'Part of the' to 'Partners with' — bringing the site's description of the group relationship into line with how RedBridge now presents it
  • Standardised every contact email across the site to info@redbridge-consulting.com.au, eliminating the divergent addresses that had accumulated across service pages, the footer, and form confirmations — enquiries now reach a single monitored inbox regardless of which page a visitor contacts from
  • Repaired a CI smoke test that went red after the footer copy change: the post-deploy suite asserted on the old affiliation string, so the content edit broke the pipeline rather than the site. Fixed across 4 commits — a reminder that smoke tests asserting on exact copy need updating in the same change as the copy itself

SEO Architecture — Hub-and-Spoke Model

The Employer Pathway service area follows a hub-and-spoke model: a central hub page targets the broad keyword and links out to three dedicated spoke pages, each targeting a specific high-intent search query — concentrating topical authority and internal links toward conversion-ready content. In Phase 5, the spoke URLs were flattened to remove the redundant /services/ path segment, aligning every route with the sitemap and breadcrumb hierarchy.

Hub
Employer Pathway
/employer-pathway
Spoke 01
482 Visa Employer Matching
/employer-pathway/482-visa-employer-matching
Spoke 02
491 Direct Entry
/employer-pathway/491-direct-entry
Spoke 03
Career Launch Program
/employer-pathway/career-launch-program

Technical Highlights

🏗️
i18n Architecture

Full EN/ZH bilingual routing via next-intl across all 18 routes, with locale-aware metadata, hreflang, and sitemap generation.

🧩
V3 Component System

178 reusable components built on a shared design system — typography, spacing, and colour tokens standardised in Phase 3.

❓
FAQ Patterns

Reusable FAQ accordion components paired with FAQPage JSON-LD, enabling rich-result eligibility across service pages.

📋
Lead Capture

Multi-step consultation booking form feeds directly into a shared Google Sheet — real-time enquiry visibility for the RedBridge team with zero manual handling.

📡
Meta CAPI

Server-side Meta Conversions API integration tracks leads from Facebook and Instagram campaigns accurately, bypassing ad blockers that strip client-side pixel events.

📊
Conversion Tracking

Shared conversion-tracking components instrumented across all landing and service pages for consistent funnel measurement.

📦
Bundle & Weight Reduction

Dead code and duplicate dependencies removed in Phase 2, reducing the production bundle size.

🧹
Codebase Health

58 inline styles replaced with Tailwind utilities and ~699 lines of duplicated code refactored across the component library in Phase 3.

🧪
CI Smoke Tests

7 automated smoke tests run after every deploy: purge Cloudflare edge cache, wait for propagation, then verify critical links and i18n strings across 4 routes — catching regressions before users see them.

🐛
Three-Root-Cause Bug Fix

FAQ inline links silently dropped in production due to three independent causes: next-intl t.raw() stripping nested arrays, OpenNext esbuild dropping JSON array-of-objects outside src/, and next-intl rich-text parser incompatibility with the Workers runtime — fixed with a custom parseRichText() regex helper.

🏷️
Attribution Tracking

ctasrc and locale URL parameters captured into the booking form; Google Tag Manager managing Google Ads, Meta Pixel, and conversion events across the full funnel.

📐
Reusable Layout Patterns

Phase 7 established SpokeInfoLayout, Pillar186Layout, HubInfoSections, and PillarCareerLaunchLayout — each directly reused across subsequent clusters, compounding the return on each component investment.

🔍
FAQ Crawlability Fix

Independently discovered that the FAQ tab system was excluding 11 entries from Googlebot-visible server-side HTML. Fixed by always-mounting all category panels in the DOM with CSS-hidden inactive tabs — restoring indexability without any UI change.

🗂️
Grouped Mega Menu

Redesigned desktop and mobile navigation to surface all 9 employer pathway pages in two labelled groups, reducing homepage-to-guide click depth from 2 to 1 with 8 new translation keys (EN + ZH) and no hardcoded strings.

🖼️
OG Image & Social Sharing

Diagnosed the existing OG image reference as a 160×44px logo asset producing blank social cards. Upgraded to a correctly sized 1200×630px branded image and promoted Twitter Card from 'summary' to 'summary_large_image' — every RedBridge social share now displays a professional branded preview on LinkedIn, Facebook, and X/Twitter.

🏢
LocalBusiness & Organization JSON-LD

Added LocalBusiness and Organization structured data to the homepage, making RedBridge eligible for rich results including address, phone, opening hours, and geo-coordinates in Google Search — the broadest structured data coverage the site has held.

📊
FAQPage Schema Expansion

Expanded FAQPage structured data on /faqs from 8 to 23 Q&A pairs across all three FAQ categories, increasing the pool of questions eligible to appear as rich result accordions in Google Search.

🎬
Video LCP Poster Frame

Wired a poster frame to the homepage hero video — the page now displays a branded cover image during video load instead of a black frame, eliminating an LCP Core Web Vitals risk on the highest-traffic page.

🩸
Silent Data-Loss Fix

Google Apps Script's appendRow() was writing blank rows whenever sheet headers drifted — caused by Sheets table formatting converting the named range — so enquiries appeared to submit while landing empty. Replaced with explicit row targeting via getLastRow() + 1 and setValues(), plus a guard that throws when every mapped value is empty, surfacing header mismatches at the point of failure instead of silently corrupting the lead dataset.

📞
E.164 Phone Capture

A custom country dial code selector built with zero third-party dependencies — replacing react-phone-number-input, whose CDN-hosted flag sprites failed to load in production. Mobile numbers are stored in E.164 format (+61412345678), giving every captured lead one unambiguous shape for analytics, CRM import, and direct dialling.

🧭
Path-Based Locale Tracking

Enquiry forms recorded the submitted locale from a ?locale= query parameter that a path-based routing site never populates — so every Chinese-language enquiry was logged as English. Corrected to read from the URL pathname across both the client and employer forms, restoring the audience signal in all downstream lead analytics.

🚧
Maintenance Banner System

A fixed top bar z-indexed above the navigation, with matching nav and page padding offsets across 16 routes, built so the whole banner toggles on or off in a single commit — a one-step way to announce planned downtime sitewide. Removed cleanly once the maintenance period concluded.

🎥
HLS Video Streaming on R2

A 4K master at 111 Mbps compressed with FFmpeg to a web-optimised 1080p stream, segmented into 4-second chunks and served from Cloudflare R2. A client-side hls.js player with native Safari fallback and a poster frame delivers the video to viewers inside China, where the major Western video hosts are unreachable — self-hosting is what makes the About page video playable for the core Mandarin-speaking audience.

🔢
phone.ts — Pure Validation Logic

Phone handling extracted into a React-free module of pure functions: full-width 0-9 and + normalised to ASCII, pasted international numbers preserved as-is while local numbers have leading zeros stripped before the dial code is prepended, and validation run against the mobile-only libphonenumber-js bundle so a non-mobile number such as +86412345678 correctly fails. Blur and submit share one callback, so the error wording is identical on both paths and nothing validates mid-typing.