Week to Wednesday 9 SeptemberThu 3 Sep to Sun 6 Sep · swept 21:08 Sun 6 Sep · next call Thu 10 Sep, 4pm UK (10am Central)
In brief
The written summary for this edition follows on Wednesday evening.
Closed this period
10
steps and tasks, Thu 3 Sep to Sun 6 Sep, plus 3 folded into other tasks
3 Sep6 Sep
Tasks with movement
7
of 140 on the board
Waiting on Rod
36
23 on work in progress
Blocked
6
tasks waiting on someone else
Days to 1 October
25
0 build tasks not started
The numbers as a table
Workstream
Tasks
Closed this period
In progress
Ready
Blocked
Queued
Asks of Rod
Website 3.0
69
1
66
0
0
3
24
CRM
56
0
14
36
4
0
9
Campaigns
8
2
2
4
2
0
3
Wallboard
7
7
2
0
0
5
0
Website 3.0
Website 3.0 and the Build board
69 open tasks1 closed66 in progress0 blocked24 for Rod
4 of 284 steps
WB-22●In progress
Write copy for the Services & Support and Contact pages of the new site
Final copy for the two top-level pages the Website 3.0 tracker does not cover: the Services & Support page (Rod's requirement that Support is visible, with a dedicated area) and the Contact page. Written in the two-persona register (AV professionals and everyday operators), no internal persona names, delivered in Sanity or as markdown ready to load.
4 of 7 steps
Website 3.0 · Content1 closed this period3 folded into other tasks
Steps (3 open)
WB-22.1 Wait for sitemap sign-off (WB-12), then confirm where Services & Support and Contact sit in it and what each page must do
WB-22.4 Write the Services & Support page
WB-22.6 Write the Contact page copy (About is WB-47.4)
✓WB-22.7 Run the copy through blog-review style checks and load into Sanity (each WB-4x task loads its own copy)
✓WB-22.5 Write the public Partners page (distributors, certified sub-partners, how to become one; portal link only) (folded into WB-47.3) folded
✓WB-22.3 Write the capabilities / product pages (one per pillar) (folded into WB-46) folded
✓WB-22.2 Write the homepage copy (three pillars, Support visible, strapline) (folded into WB-42) folded
Scaffold the monorepo: pnpm workspaces + Turborepo with packages/tokens, packages/ui, packages/schemas, apps/web
A GitHub monorepo where pnpm install && pnpm turbo build succeeds from clean; four workspaces (tokens, ui, schemas, apps/web) with shared tsconfig and eslint; packages/schemas imported by both Sanity Studio and the Next.js runtime; README documenting the layout. Merged to main.
0 of 5 steps
Website 3.0 Build · Infrastructure
Steps (5 open)
WB-57.1 Confirm the repo URL and access with Iain; clone; check what already exists (Infra #2 is In progress)
WB-57.2 Set up pnpm-workspace.yaml and turbo.json with build, dev, lint, typecheck, test pipelines and caching
WB-57.3 Create packages/tokens, packages/ui, packages/schemas, apps/web with package.json, tsconfig extending a shared base, and eslint config
WB-57.4 Wire packages/schemas as a dependency of both apps/web and the Sanity Studio config; verify pnpm turbo build from clean
WB-57.5 Write the README (layout, commands, package roles); open PR; merge to main
Stand up the CI skeleton in GitHub Actions: typecheck, lint, test placeholders, Vercel preview deploy per PR
A .github/workflows/ci.yml that runs on every PR: pnpm install with cache, turbo typecheck, lint, test (placeholder passing), and a Vercel preview deployment with the URL posted to the PR. Branch protection requires CI green. Secrets (Vercel token, org, project) stored in GitHub, not in the repo.
0 of 4 steps
Website 3.0 Build · Infrastructure
Steps (4 open)
WB-58.1 Add ci.yml: checkout, pnpm/action-setup, node cache, turbo typecheck lint test on pull_request and push to main
WB-58.2 Connect the Vercel project to the repo (Git integration) so every PR gets a preview URL comment; confirm env vars per environment
WB-58.3 Store Vercel, Sanity, HubSpot and Figma secrets in GitHub Actions secrets and Vercel env; none in the repo; document which secret lives where
WB-58.4 Enable branch protection on main requiring CI green and one review; test with a deliberate failing PR
Confirm Figma Variables are systematised as the token source: colour, type, spacing, radii
Written confirmation from the designer (branding agency) that the Figma file exposes colour, typography, spacing and radii as Variables (collections and modes), not only as styles or hard-coded values on delivered components; a Figma REST API call returns them; naming convention agreed and documented.
0 of 4 steps
Website 3.0 Build · Infrastructure
Steps (4 open)
WB-59.1 Get the Figma file key and a read token from Iain (never store); call the Variables REST endpoint and save the raw response
WB-59.2 Inspect: are colour, type, spacing, radii present as Variables with collections and modes, or only as styles and hard-coded component values?
WB-59.3 If gaps exist, draft an Outlook email to the branding agency listing exactly which values must become Variables and the naming convention to use
WB-59.4 Document the agreed naming convention (collection/group/token) on the Notion Design page; mark Infra #5 Done
Build the GitHub Action that fetches Figma Variables via REST API, pins the API version, and schema-checks the response
A workflow (tokens-sync.yml) on schedule and manual dispatch that calls the Figma Variables endpoint with a pinned API version, validates the JSON against a Zod or JSON Schema, writes packages/tokens/src/figma.json, and opens a PR if it changed. Fails loudly on schema mismatch.
0 of 4 steps
Website 3.0 Build · Infrastructure
Steps (4 open)
WB-60.1 Write tokens-sync.yml: schedule (daily) + workflow_dispatch; curl the Variables endpoint with pinned API version header; save to packages/tokens/src/figma.json
WB-60.2 Write a Zod schema for the Variables response (collections, modes, variables with resolvedType and valuesByMode); fail the job on mismatch
WB-60.3 If figma.json changed, open a PR via peter-evans/create-pull-request with a diff summary; label tokens
WB-60.4 Store FIGMA_TOKEN and FIGMA_FILE_KEY as GitHub secrets; run once manually and confirm the PR appears
Style Dictionary transform and publish the wallboard/tokens package as CSS variables + Tailwind config, versioned semver with tagged releases
packages/tokens builds from figma.json via Style Dictionary into tokens.css (CSS custom properties) and tailwind.tokens.js (theme extension); published to the GitHub package registry as @wallboard/tokens with semver and a git tag per release; consumed by packages/ui.
0 of 4 steps
Website 3.0 Build · Infrastructure
Steps (4 open)
WB-61.1 Add Style Dictionary v4 to packages/tokens with a parser for figma.json (collections to token groups, modes to themes if present)
WB-61.2 Configure two outputs: dist/tokens.css (CSS custom properties on :root) and dist/tailwind.tokens.js (theme.extend for colour, fontSize, spacing, borderRadius)
WB-61.3 Decide registry with Iain (GitHub Packages vs private npm); set up Changesets; publish 0.1.0 with a git tag
WB-61.4 Consume the package in packages/ui (import tokens.css, extend Tailwind config); verify a component renders with token colours
Token snapshot test and lint rule banning literal colours, both as merge blockers
A Vitest snapshot of the generated tokens.css that fails CI on unreviewed changes, and an ESLint rule (or Stylelint) that fails on any hex/rgb/hsl literal in packages/ui and apps/web. Both wired into WB-58 CI as required checks.
0 of 3 steps
Website 3.0 Build · Infrastructure
Steps (3 open)
WB-62.1 Add a Vitest snapshot test on dist/tokens.css; commit the baseline; CI fails on any diff without pnpm test -u
WB-62.2 Add Stylelint with color-no-hex and color-named:never for CSS; add an ESLint rule (custom or no-restricted-syntax) catching hex/rgb/hsl literals in TSX and Tailwind arbitrary values
WB-62.3 Wire both into WB-58 CI as required checks; verify a PR with a hard-coded #ea0b25 is blocked
Stand up Storybook in packages/ui as the docs and visual-regression home
Storybook 8 running in packages/ui, consuming @wallboard/tokens, deployed to a Vercel preview on every PR, with Chromatic or Playwright screenshots configured as the visual regression baseline.
0 of 3 steps
Website 3.0 Build · Infrastructure
Steps (3 open)
WB-63.1 npx storybook@latest init in packages/ui with the Vite builder; import dist/tokens.css in .storybook/preview.ts
WB-63.2 Add a storybook-static build to CI and deploy to a Vercel preview per PR
WB-63.3 Decide with Iain: Chromatic (paid) or Playwright screenshot baseline; configure the chosen one against Storybook stories
Build the registered section components against tokens, one Storybook story per section as the merge gate
Every component in the section library built in packages/ui with typed props, no raw values, variants as props: NavBar, Footer, CtaButton, HomeHeaderSection, RoleHeaderSection, FeatureHeaderSection, ContentBlockSection, ThumbnailGridSection, GallerySection, FilterSection, FormSection, TestimonialSection, LogoSection, CtaSection. Each has a Storybook story covering its variants; a PR without a story is blocked.
0 of 7 steps
Website 3.0 Build · Infrastructure
Steps (7 open)
WB-64.1 Define the shared section props contract: every section takes {_type, _key, ...props} and renders no raw colour, spacing or radius values
WB-64.2 Build the chrome and atoms: NavBar (sticky, transparent-on-hero), Footer (columns, newsletter toggle), CtaButton (primary/secondary)
WB-64.3 Build the headers: HomeHeaderSection (selector, media type), RoleHeaderSection (role variant), FeatureHeaderSection (layout, media side)
Vitest + Playwright + visual regression on section variants
Unit tests (Vitest) for section prop handling, Playwright component tests rendering each section variant, screenshot baselines committed, CI fails on visual diff above threshold. Closes the preview-accuracy gap.
0 of 3 steps
Website 3.0 Build · Infrastructure
Steps (3 open)
WB-65.1 Vitest unit tests per section: renders with minimal props, applies each variant prop, handles missing optional props
WB-65.2 Playwright component tests rendering each Storybook story; capture screenshot baselines at desktop and mobile widths; commit
WB-65.3 Add the visual diff step to CI with a threshold; document how to update baselines intentionally
Sanity project with prod and staging datasets (per Infra #3), Studio deployed (sanity.studio or embedded at /studio in apps/web), four document types defined in packages/schemas with slugs, SEO fields, and the pageBuilder array on Page; CORS and tokens configured; team invited.
0 of 5 steps
Website 3.0 Build · Sanity and runtime
Steps (5 open)
WB-66.1 Confirm the Sanity project ID, prod and staging dataset names, and admin access with Iain; add packages/schemas as the Studio schema source
WB-66.3 Add navigation and footer singleton documents and a siteSettings singleton (logo, social links, default SEO)
WB-66.4 Deploy the schema (sanity-plugin:deploy-schema), run typegen (sanity-plugin:typegen), configure CORS for localhost, preview and prod origins
WB-66.5 Deploy Studio (embedded at /studio or sanity.studio); invite Iain, Rod, John as editors; create a read token for the runtime and a write token for migrations, stored in Vercel env
Author section schemas mirroring component props; configure page-builder for marketing pages vs typed schemas for product, case study, blog
One Sanity object schema per registered section whose fields mirror the React component props exactly; a dual-update PR template requiring schema and component to change together; a contract test comparing the two; the Page type uses an open pageBuilder array of those sections; Product, CaseStudy and BlogPost use fixed typed fields. One named owner of the contract (gating decision 1).
0 of 4 steps
Website 3.0 Build · Sanity and runtime
Steps (4 open)
WB-67.1 For each of the 14 registered sections, write a Sanity object schema whose field names and types mirror the component props exactly (variants as string enums)
WB-67.2 Register all section schemas as members of the page.pageBuilder array; keep product, caseStudy, blogPost as fixed typed fields (no pageBuilder)
WB-67.3 Write the contract test: extract each component's props via ts-morph, compare to schema fields; fail on any mismatch; add to CI
WB-67.4 Add .github/PULL_REQUEST_TEMPLATE.md with a dual-update checklist (component changed? schema changed? story updated?); name the contract owner in CODEOWNERS
Wire Sanity Presentation preview to the production components
Studio's Presentation tool renders draft content through apps/web using the same section registry as production, with click-to-edit overlays; no separate preview components.
0 of 3 steps
Website 3.0 Build · Sanity and runtime
Steps (3 open)
WB-68.1 Add next-sanity presentationTool to the Studio config with the preview origin per environment
WB-68.2 Add the draft-mode enable/disable routes in apps/web and stega-encoded fetches so click-to-edit overlays map back to fields
WB-68.3 Verify a draft edit in Studio appears live in Presentation using the production section registry; no separate preview components exist
Build the editorial workflow in Sanity including reviewer-to-editor send-back
A workflow status on documents (Draft, In review, Changes requested, Approved, Published), roles for editor and reviewer, a send-back action with a comment, and a Studio view listing what awaits each role. Documented for the team.
0 of 3 steps
Website 3.0 Build · Sanity and runtime1 for Rod
Steps (3 open)
WB-69.1 Confirm with Iain who edits and who reviews (Rod? John?); choose the Sanity workflow plugin or a custom status field Rod
WB-69.2 Implement statuses Draft, In review, Changes requested, Approved, Published; a send-back action that requires a comment; roles restricting who can Publish
WB-69.3 Add Studio structure views: 'Awaiting my review', 'Sent back to me'; write a one-page how-to in Notion
Build the Next.js runtime: App Router, RSC, GROQ queries, section-type to component registry, ISR + on-demand revalidation
apps/web renders any Page document by mapping each pageBuilder block _type to its component via a registry; typed GROQ queries with sanity-typegen; ISR with tag-based revalidation; global navigation and footer from singletons; 404 and error routes; deployed to Vercel preview.
0 of 4 steps
Website 3.0 Build · Sanity and runtime
Steps (4 open)
WB-70.1 Set up apps/web with App Router, next-sanity client, and typed GROQ queries (defineQuery) for page by slug, navigation, footer, siteSettings
WB-70.2 Build the section registry: a map from _type to component; a PageBuilder component that iterates pageBuilder[] and renders each block; unknown types log a warning and render nothing
WB-70.3 Implement [[...slug]] route with generateStaticParams from Sanity, ISR revalidate, and cache tags per document ID for on-demand revalidation
WB-70.4 Add typed routes for product, caseStudy and blogPost documents; 404 and error pages; deploy to Vercel preview and render one page end to end
Two-path deploy: code path via Vercel, content path via Sanity webhook to /api/revalidate, with delivery logging, alerts and a manual fallback
Content publishes in Sanity trigger a signed webhook to /api/revalidate that revalidates by tag; every delivery is logged (Vercel logs or a small table) and a failed or missing delivery raises an alert (Sentry or email); a manual revalidation route exists for fallback; schema changes still ship via the code path.
0 of 4 steps
Website 3.0 Build · Sanity and runtime
Steps (4 open)
WB-71.1 Create /api/revalidate: verify the Sanity webhook signature, read the document ID and type, call revalidateTag; return 200 with what was revalidated
WB-71.2 Configure the Sanity webhook (publish, unpublish, delete) with the secret; log every delivery with timestamp, doc ID and result
WB-71.3 Add alerting: Sentry cron monitor (or Vercel log drain rule) that fires if a publish has no matching delivery within 5 minutes
WB-71.4 Add a manual revalidation route (protected) accepting a slug or 'all'; document the fallback procedure in Notion
FormSection: HubSpot field shape + server-side Forms v3 POST, with build-time form-definition sync and a contract test
FormSection renders a form from a HubSpot form ID, posts server-side to the Forms v3 API with hutk cookie and page context, handles success/error states accessibly; a build step fetches form definitions from HubSpot and a contract test fails the build if field shapes drift from what the component expects.
0 of 5 steps
Website 3.0 Build · Integrations
Steps (5 open)
WB-72.1 Confirm the HubSpot private-app token exists with forms scope; add to Vercel env; take the form list from WB-49.2
WB-72.2 Build a build-time script that fetches each form definition (fields, required, options) from the HubSpot Forms API and writes forms.generated.json
WB-72.3 Build FormSection: renders fields from forms.generated.json by form ID, client validation, accessible labels and errors, hidden persona_type from the WB-78 cookie
WB-72.4 Server action posting to Forms v3 (secure/submit/5122961/{formId}) with hutk cookie, pageUri, pageName; success and error states; honeypot
WB-72.5 Contract test: compare forms.generated.json field shapes to what FormSection expects; fail the build on drift; run the fetch step in CI before build
Wire observability: Vercel Analytics, Sentry, HubSpot tracking code, with a pre-launch baseline
Vercel Analytics and Speed Insights enabled; Sentry SDK in apps/web with source maps and release tagging in CI; HubSpot tracking script loaded with consent handling; a baseline snapshot of Core Web Vitals and error rate recorded before go-live.
0 of 4 steps
Website 3.0 Build · Integrations
Steps (4 open)
WB-73.1 Enable Vercel Analytics and Speed Insights in apps/web; confirm data arriving on the preview deployment
WB-73.2 Confirm the Sentry account with Iain; install the Sentry Next.js SDK, upload source maps in CI, tag releases with the git SHA
WB-73.3 Load the HubSpot tracking script behind consent (align with WB-25 cookie decision); verify _hsq fires on page views
WB-73.4 Record the pre-launch baseline: Core Web Vitals per template, JS error rate, TTFB p95; save on the Notion QA & Launch page
Confirm all guardrails live and set the quarterly section audit
A checklist confirming each guardrail is enforced in CI: dual-update PR template, token lint and snapshot, form contract test, webhook alerts, visual regression, preview parity; plus a recurring quarterly Todoist task to audit the section library for sprawl and drift.
0 of 3 steps
Website 3.0 Build · Integrations
Steps (3 open)
WB-74.1 Inspect the last 10 CI runs and confirm each guardrail executes and can fail: PR template present, token lint, token snapshot, form contract test, visual regression, preview parity check
WB-74.2 Confirm webhook alerting fired at least once in a test (WB-71.3) and the alert reached a human
WB-74.3 Create a recurring Todoist task (every 3 months) in the Website 3.0 Build project: audit section library for unused sections, duplicated variants, schema/component drift
GA4 events for selector clicks, storyline views, CTA clicks and form submits with persona dimension; HubSpot tracking code populating persona_type on contacts from the persona context (WB-78); UTM parameter convention documented and enforced in all outbound links; attribution report showing first-touch storyline to conversion.
0 of 4 steps
Website 3.0 Build · Integrations
Steps (4 open)
WB-75.1 Define the GA4 event schema with WB-49: selector_click(option), storyline_view(persona), cta_click(persona, destination), form_submit(form_id, persona); create the persona custom dimension in GA4 admin
WB-75.2 Instrument the events in apps/web via a thin analytics helper; verify each in GA4 DebugView
WB-75.3 On persona set, call _hsq.push(['identify', {persona_type}]) so HubSpot populates the property on the tracked contact; verify on a test contact
WB-75.4 Enforce the UTM convention: a link helper that appends utm_content=storyline on outbound CTAs; build the first-touch storyline to conversion report in HubSpot
Implement technical SEO on the runtime: schema.org JSON-LD, semantic HTML, meta and OG tags, sitemap.xml, 301 redirect layer, llms.txt, canonicals
Every page emits JSON-LD (Organization, WebPage, Product, Article as applicable), semantic landmarks, title/description/OG/Twitter meta from Sanity SEO fields, canonical URLs; sitemap.xml generated from Sanity; the redirect layer consumes WB-33's map (next.config redirects or middleware for regex); llms.txt updated. Rich Results Test passes on each template.
0 of 5 steps
Website 3.0 Build · Integrations
Steps (5 open)
WB-76.1 Implement generateMetadata from Sanity seo fields (title, description, canonical, OG image, Twitter card) on every route; siteSettings defaults as fallback
WB-76.2 Add JSON-LD: Organization on all pages, WebPage per page, Product on product routes, Article on blog posts; validate with Rich Results Test
WB-76.3 Generate app/sitemap.ts from Sanity published documents; add robots.ts allowing all except /studio and /api
WB-76.4 Load the WB-33 JSON redirect map into next.config redirects (exact) and middleware (regex); write a test that every map row resolves
WB-76.5 Audit semantic HTML in each section (one h1 per page, landmarks, heading order); update public/llms.txt with the new site structure
Execute DNS cutover, verify site live, test redirects + forms + HubSpot in production, 24-hour monitoring
wallboard.us (and www) pointed at Vercel, SSL issued, old Webflow site left reachable at a fallback host for 30 days, redirect map verified in production by script, a live form submission confirmed in HubSpot, GA4 real-time showing traffic, Sentry quiet, and a 24-hour watch with a rollback plan (DNS back to Webflow) documented.
0 of 5 steps
Website 3.0 Build · QA and cutoverdeadline 1 Oct2 for Rodpriority 2
Steps (5 open)
WB-77.1 Confirm Cloudflare access with Zoltan; lower TTL on the wallboard.us apex A and www CNAME records to 300s at least 48 hours before the window; agree the window with Rod Rod
WB-77.2 Add wallboard.us and www to the Vercel project; confirm SSL issues; keep the Webflow site reachable on a fallback hostname for 30 days
WB-77.3 Write the rollback runbook (DNS back to Webflow, expected propagation time, who decides) and get Rod's agreement before cutover Rod
WB-77.4 Cut over: switch DNS; rerun the WB-53.1 redirect script and WB-53.2 form test against production; confirm GA4 real-time and HubSpot tracking
WB-77.5 24-hour watch: Sentry, Vercel logs, Search Console crawl, HubSpot form submissions; write the go-live note for Rod
Build the persona context system: URL param or cookie carrying storyline to platform to demo, with dynamic CTA swap
A persona value set from the homepage selector or a ?p= URL param, persisted in a first-party cookie, read by CtaButton and FormSection to swap CTA copy/destination and prefill the hidden persona_type field; works with RSC (cookie read server-side) and respects consent.
0 of 4 steps
Website 3.0 Build · Pages
Steps (4 open)
WB-78.1 Define the persona value set with WB-32 and WB-49 (same values as HubSpot persona_type); document the cookie name, lifetime and consent category
WB-78.2 Middleware: read ?p= on any route, validate against the set, set the first-party cookie; selector click sets it client-side too
WB-78.3 Add per-persona overrides to the ctaLink schema (label, href) and make CtaButton read the cookie server-side to choose the override
WB-78.4 FormSection reads the cookie to prefill hidden persona_type; write a Playwright test: land with ?p=operator, navigate, submit, assert the field value
/security page built from FeatureHeaderSection + ContentBlockSection + a jump-link nav, rendering WB-43's copy and RBAC diagram, with a security docs download CTA (WB-48), passing WB-51 accessibility checks.
0 of 3 steps
Website 3.0 Build · Pages
Steps (3 open)
WB-79.1 Wait for WB-43 verified copy and diagrams; compose the page in Sanity: FeatureHeaderSection + one ContentBlockSection per section with anchor IDs
WB-79.2 Build an in-page jump-link nav (sticky on desktop, dropdown on mobile) as a justified new section or a ContentBlockSection prop
WB-79.3 Add the security docs download CTA (WB-48 form) and the compliance matrix table; run axe; ship to staging
Load test and Core Web Vitals: LCP under 2.5s, INP under 200ms, CLS under 0.1, concurrent-user capacity, mobile speed
Lighthouse CI in the pipeline with budgets (LCP 2.5s, INP 200ms, CLS 0.1, performance score 90+ on mobile); a k6 or Artillery load test against staging at 10x expected peak concurrent users with p95 TTFB recorded; results in the Notion QA table. (Tracker says FID; INP replaced FID as the Core Web Vital in 2024.)
0 of 3 steps
Website 3.0 Build · QA and cutover
Steps (3 open)
WB-80.1 Add Lighthouse CI (@lhci/cli) to the pipeline with budgets: performance 90, LCP 2500ms, INP 200ms, CLS 0.1, on homepage, a storyline, /platform, /pricing (mobile)
WB-80.2 Estimate peak concurrency from GA4 (max hourly sessions in the last year x 10); write a k6 script hitting the four pages; run against staging; record p95 TTFB and error rate
WB-80.3 Log results in the Notion QA table; hand any budget failures to WB-88
Build /platform: UI, AI and API as three equal interface modes, capability story not feature list
/platform page built from FeatureHeaderSection and three parallel ContentBlockSections (UI, AI, API) plus links to the five feature pages (WB-93), rendering WB-46 copy, with persona-aware CTA (WB-78).
0 of 2 steps
Website 3.0 Build · Pages
Steps (2 open)
WB-81.1 Compose /platform in Sanity: FeatureHeaderSection + three ContentBlockSections (UI, AI, API) + ThumbnailGridSection linking the five feature pages + CtaSection
WB-81.2 Load WB-46 copy; persona-aware CTA via WB-78; preview; QA on mobile; ship to staging
Build the site chrome: header mega-menu nav, utility bar (Login / Contact / Trial), sticky scroll, mobile hamburger, footer
NavBar and Footer components (chrome, rendered outside the page-builder) driven by Sanity navigation and footer singletons; mega-menu grouped per the signed-off sitemap (WB-12), utility bar with Login (app link), Contact, Trial; sticky with transparent-on-hero variant; accessible mobile menu; footer with columns and newsletter toggle.
0 of 4 steps
Website 3.0 Build · Pages
Steps (4 open)
WB-82.1 Model the navigation singleton: top-level items with mega-menu groups (from the signed-off Octopus sitemap), utility bar links (Login app URL, Contact, Trial)
WB-82.2 Build NavBar: mega-menu with keyboard support, sticky with transparent-on-hero variant, mobile hamburger with focus trap and escape-to-close
WB-82.3 Build Footer from the footer singleton: link columns, newsletter toggle (FormSection), legal links, social
WB-82.4 Confirm Support is visible in the nav and the partner portal link is separate from the public /partners page (Rod's requirements); ship
Build /demo: detect persona context, self-guided demo with persona scenarios, booking flow, video library
/demo reads the persona cookie (WB-78) and shows the matching scenario first; embeds the interactive demo tool chosen in WB-24 (Storylane or Navattic) or the WB-44 videos; a booking flow (HubSpot meetings link or FormSection) and a filterable video library (GallerySection).
0 of 3 steps
Website 3.0 Build · Pages1 for Rod
Steps (3 open)
WB-83.1 Confirm WB-24 outcome; embed the chosen interactive demo (or WB-44 videos) with a persona-first ordering driven by the WB-78 cookie
WB-83.2 Booking flow: HubSpot Meetings link per region/persona (Guy US, Zoltan EMEA; confirm with Rod) or FormSection with routing Rod
WB-83.3 Video library via GallerySection with persona and topic filters; ship to staging; test all six persona entries
Build the storyline CMS template: 4-beat arc, persona-specific content fields, proof points, CTA mapping, rich media
A Sanity document or page-builder preset for storylines with fixed slots for Hook, Change, Practice, AI + CTA, proof-point fields (stat, quote, logo), a CTA mapping reference, and media slots; rendered by RoleHeaderSection + ContentBlockSections; one instance created per storyline for WB-85. Naming of the persona field follows WB-32.
0 of 3 steps
Website 3.0 Build · Pages
Steps (3 open)
WB-84.1 Model the storyline document type: persona (values per WB-32), hook, change, practice, aiAndCta as structured blocks; proofPoints[] (stat, quote, logo); media[]; ctaMapping ref
WB-84.2 Build the storyline route rendering RoleHeaderSection then one ContentBlockSection per beat, proof points interleaved, CtaSection last
WB-84.3 Create six empty storyline documents in Sanity for WB-85; verify Presentation preview works on the template
Build the six storyline pages on the template: Operator, Owner, Architect, Guardian, Builder, Reseller, each with its specified proof assets
Six pages built on WB-84 with the copy from WB-36 to WB-41 and these assets: Operator (side-by-side video embed, non-tech user quote, template gallery, AI speed stat); Owner (90s walkthrough video, SMB testimonial, price comparison, hardware compatibility list); Architect (API docs link, architecture diagram, tech case study, MCP demo, data source catalogue); Guardian (security docs download, pre-filled questionnaire, on-prem case study, compliance matrix, RBAC diagram); Builder (partner economics calculator, growth case study, API/SDK docs, platform comparison); Reseller (uptime stats, reseller testimonial, support model overview, margin calculator, retention data). Routes and labels per WB-32.
0 of 6 steps
Website 3.0 Build · Pages
Steps (6 open)
WB-85.1 Operator page: load WB-36 copy, embed side-by-side video, non-tech quote, template gallery (GallerySection), AI speed stat
WB-85.6 Reseller page: load WB-41 copy, uptime stats, reseller testimonial, support model overview, margin calculator (WB-91), retention data; then QA all six on mobile
Set up A/B testing for the homepage selector (label wording, order, visual treatment) and storyline CTAs
An experimentation mechanism (Vercel Edge Config flags or a Sanity-managed variant field) that serves variants of the selector and storyline CTAs, with GA4 experiment dimension and HubSpot property recording the variant, a sample-size calculation, and the first test defined (WB-55).
0 of 3 steps
Website 3.0 Build · Pages
Steps (3 open)
WB-86.1 Choose the mechanism (Vercel Edge Config flags vs a Sanity variant field); implement middleware bucketing with a sticky cookie and a variant dimension sent to GA4 and HubSpot
WB-86.2 Make HomeHeaderSection selector labels, order and visual treatment variant-aware; same for storyline CtaSection copy
WB-86.3 Write the experiment protocol (hypothesis, primary metric, sample size from current traffic, duration, stop rule) per sanity-plugin:content-experimentation-best-practices; define test 1 for WB-55
Build /partners: separate Builder (API / custom builds) and Reseller (reliability / margins) paths with distinct CTAs; portal link only
/partners built from WB-35 wireframe and WB-47 copy: a public partner story, two paths with their own CTAs (Builder to partner programme application, Reseller to partner economics guide), certified sub-partner explanation consistent with WB-09, and a single link to the gated portal (not the portal itself).
0 of 3 steps
Website 3.0 Build · Pages
Steps (3 open)
WB-87.1 Compose /partners in Sanity from the WB-35 wireframe: public story, Builder path block, Reseller path block, CalculatorSection slots, single portal link
WB-87.2 Load WB-47.3 copy; wire Builder CTA to the partner application form (WB-49.2) and Reseller CTA to the partner economics guide (WB-48)
WB-87.3 Check terminology against WB-09 (contracting distributor, certified sub-partner); QA; ship to staging
Lighthouse performance 90+ on mobile for homepage, a storyline, /platform and /pricing; next/image with AVIF/WebP and Sanity image CDN params; below-fold sections lazy; third-party scripts (HubSpot, GA4) deferred or loaded on interaction; cache headers verified; results recorded in WB-80.
0 of 3 steps
Website 3.0 Build · Pages
Steps (3 open)
WB-88.1 Replace all img with next/image using Sanity image URLs with auto=format and width params; set priority on the hero image only
WB-88.2 Lazy-load below-fold sections (dynamic import for GallerySection, CalculatorSection); defer GA4 and HubSpot via next/script strategy afterInteractive or on interaction (check WB-75 attribution is unaffected)
WB-88.3 Verify cache headers on Vercel (static assets immutable, pages s-maxage with stale-while-revalidate); rerun WB-80 Lighthouse budgets; record before/after
Build the homepage: animated selector (A/B testable), social proof, capability overview, CTA, lazy loading
Homepage built from HomeHeaderSection (selector variant), LogoSection, ContentBlockSection x3, TestimonialSection, CtaSection, rendering WB-42 copy; selector writes the persona cookie (WB-78) and supports variants (WB-86); Lighthouse 90+.
0 of 3 steps
Website 3.0 Build · Pages1 for Rod
Steps (3 open)
WB-89.1 Compose the homepage Page document: HomeHeaderSection (selector variant), LogoSection, three ContentBlockSections, TestimonialSection, CtaSection; load WB-42 copy
WB-89.2 Build the animated selector: sets the WB-78 cookie on click, navigates to the storyline, honours prefers-reduced-motion, keyboard operable, variant-aware for WB-86
WB-89.3 Lighthouse 90+ on mobile; axe clean; ship to staging; Rod review Rod
Test all six persona conversion paths end to end: storyline to platform to CTA to form to HubSpot field population
A Playwright suite that, for each persona, lands on the homepage, selects the persona, follows the storyline to platform to CTA, submits the form with a test email, then asserts via the HubSpot API that a contact exists with persona_type, source and UTM fields set correctly. Runs against staging in CI and once against production after cutover.
0 of 4 steps
Website 3.0 Build · QA and cutover
Steps (4 open)
WB-90.1 Create a test-contact suppression property in HubSpot and exclude it from nurture and routing workflows before any automated submissions
WB-90.2 Write one Playwright spec per persona: homepage, select persona, storyline, CTA, platform, form submit with a unique test email and the suppression flag
WB-90.3 After each submit, poll the HubSpot CRM API for the contact and assert persona_type, hs_analytics_source, UTM fields and form ID; then archive the test contact
WB-90.4 Run in CI against staging on every deploy; run once against production after WB-77 cutover; record results in the Notion QA table
Build interactive margin calculators: Builder (network size to margin) and Reseller (client count to revenue)
Two client-side calculators as a registered section (justified as new: CalculatorSection) with inputs, formula, and result display; formulas and price points supplied by Rod; outputs feed CTAs to the partner economics guide (WB-48); embedded on /partners and the Builder and Reseller storylines.
0 of 3 steps
Website 3.0 Build · Pages1 for Rod
Steps (3 open)
WB-91.1 Get the formulas and price points from Rod in writing: Builder (network size to margin), Reseller (client count to revenue); do not build until agreed Rod
WB-91.2 Justify and register CalculatorSection (inputs[], formula ref, result copy) in packages/ui and packages/schemas; keep formulas in code, inputs in Sanity
WB-91.3 Build both calculators with accessible sliders and live results; CTA to the partner economics guide; unit tests on the formulas; embed on /partners and the two storylines
Verify SEO before launch: Rich Results Test, sitemap, redirects, canonicals, GA4 events, HubSpot attribution, OG tags
A QA pass on staging confirming WB-76 and WB-75 work: Rich Results Test passes on each template; sitemap.xml lists every published page and nothing else; every WB-33 redirect returns 301 to the right target with no chains; canonicals self-reference; GA4 DebugView shows every defined event; a test submission shows correct attribution in HubSpot; OG tags render in a social preview tool. Results in the Notion QA table.
0 of 3 steps
Website 3.0 Build · QA and cutover
Steps (3 open)
WB-92.1 Script: fetch sitemap.xml, assert every published Sanity document is present and nothing else; curl every WB-33 row and assert a single 301 to the mapped target; assert canonical self-references on 20 sampled pages
WB-92.2 Rich Results Test on homepage, a storyline, a product page, a blog post, a case study; fix any error
WB-92.3 GA4 DebugView: trigger every WB-75 event; HubSpot: one test submission shows correct attribution; OG tags checked in a social preview tool for five page types; log all in Notion
Build the feature page template (headline, scenario, expandable tech detail, CTA) and the five feature pages: CMS, scheduling, devices, data, AI
A reusable feature page composition (FeatureHeaderSection, ContentBlockSection with scenario, an expandable tech-detail block, CtaSection) and five instances rendering WB-46 copy, cross-linked from /platform (WB-81).
0 of 2 steps
Website 3.0 Build · Pages
Steps (2 open)
WB-93.1 Build an accessible disclosure component for the expandable tech detail (or justify a new section); compose the feature template: FeatureHeaderSection, scenario ContentBlockSection, disclosure, CtaSection
WB-93.2 Create the five feature Page documents (CMS, scheduling, devices, data, AI) with WB-46 copy; cross-link from /platform; ship to staging
Build /about, /customers (filterable case studies), /resources (gated and ungated hub), /blog, and legal pages
/about from WB-47 copy; /customers using FilterSection + ThumbnailGridSection over CaseStudy documents with persona, industry and size facets; /resources listing gated lead magnets (WB-48) and ungated content; /blog listing BlogPost documents with a migration of existing posts (WB-33 covers their redirects); legal pages as Page documents.
0 of 4 steps
Website 3.0 Build · Pages
Steps (4 open)
WB-94.1 Build /customers: FilterSection (persona, industry, deployment size facets) over CaseStudy documents with ThumbnailGridSection results; empty-state copy
WB-94.2 Build /about from WB-47.4 copy and /resources listing WB-48 lead magnets (gated) plus ungated content; ship
WB-94.3 Export existing Webflow blog posts (Webflow connector), convert to Portable Text (sanity-plugin:portable-text-conversion), import as BlogPost documents, confirm each old URL is in the WB-33 map; build /blog listing and post route
WB-94.4 Create legal pages (privacy, terms, cookies, accessibility statement) as Page documents from WB-47.5; link from footer; Rod sign-off
/pricing page rendering WB-47 copy: tier cards with a monthly/annual toggle, a feature matrix, an accessible FAQ accordion, and CTAs that swap by persona (WB-78). Pricing values sourced from Sanity Product documents, not hard-coded.
0 of 3 steps
Website 3.0 Build · Pages1 for Rod
Steps (3 open)
WB-95.1 Create Product documents in Sanity for each tier with price (monthly, annual) and feature flags; compose /pricing with tier cards reading from them
WB-95.2 Build the monthly/annual toggle, the feature matrix from Product feature flags, and an accessible FAQ accordion from WB-47.2 copy
WB-95.3 Persona-aware CTA via WB-78; Rod confirms prices before publish; ship to staging Rod
Integrate the HubSpot Service Hub Knowledge Base with the new Wallboard website
The Service Hub Knowledge Base reachable from the new site (linked from Services & Support, ideally on a Wallboard subdomain such as help.wallboard.com), styled consistently, and the old docs location redirected.
0 of 3 steps
Website 3.0 · Support docs
Steps (3 open)
WB-08.1 Confirm KB content status and integration approach (embed, link, or help.wallboard.com subdomain)
WB-08.2 Configure the KB domain and styling in HubSpot; add links from Services & Support and the footer
WB-08.3 Set up redirects from the old docs location and test
Review Rod's input and create an alternative sitemap in Octopus
An alternative sitemap in Octopus.do that reflects Rod's vision, shared with Rod and signed off, so page copy can start. Hard deadline: a workable version of the new site live by 1 October.
0 of 3 steps
Website 3.0 · Decidedeadline 1 Oct1 for Rod
Steps (3 open)
WB-12.1 Audit Rod's input against the current Octopus sitemap and list every change
WB-12.2 Draft the alternative sitemap in Octopus: three pillars, Services & Support area, no persona names, public partner story separate from portal
Set up a new GA4 property for the new Wallboard website
A GA4 property created for the new site, tagging installed on the Next.js build, key events defined (form submissions, demo requests, KB visits), HubSpot and Search Console linked, and access granted to Rod and marketing.
0 of 3 steps
Website 3.0 · HubSpot and analytics
Steps (3 open)
WB-25.1 Create the GA4 property (or new data stream) and install tagging on the Next.js build
Build the 301 redirect map from every old Webflow URL to its new route
A complete spreadsheet (Old URL, New URL, Type: exact/regex, Status) covering every indexed and linked wallboard.us URL, stored in Notion on the SEO & Redirects page and as an xlsx in SharePoint, ready for the Next.js redirect layer (WB-76) to consume. Search rankings preserved: every URL with organic traffic in the last 12 months has a 301 target, none go to the homepage as a catch-all.
0 of 8 steps
Website 3.0 · Content
Steps (8 open)
WB-33.1 Fetch wallboard.us/sitemap.xml with curl and list every URL; add CMS collection URLs via the Webflow connector
WB-33.2 Export GA4 landing pages (last 12 months, sessions) and Search Console top pages (clicks, impressions) to xlsx; join to the URL list
WB-33.3 Export Search Console Links report (top linked pages) and flag any URL with external backlinks as must-redirect
WB-33.4 Pull the completed Content Audit page from Notion and carry its Sanity document-type tag onto each URL row
WB-33.5 Once WB-12 is signed off, map each old URL to a new route from Octopus; mark exact vs regex (blog, case study patterns)
WB-33.6 Decide retire-with-410 vs redirect for zero-traffic, zero-backlink pages; list them separately
WB-33.7 Write the map into the Notion SEO & Redirects page table and save the xlsx to SharePoint; export a JSON version for WB-76
WB-33.8 Validate: no redirect chains, no loops, no old URL missing (script over the sitemap list)
Wireframe the homepage: hero, need-state selector, proof bar, platform overview, CTA
A low-fi homepage wireframe in Figma covering hero, the selector (six persona need-state paths per tracker, or the three pillars per WB-32), proof bar (logos, stats), platform overview (UI / AI / API as equals), final CTA band; each block mapped to a registered section from the library (HomeHeaderSection, LogoSection, ContentBlockSection, CtaSection). Reviewed by Rod and Iain.
0 of 5 steps
Website 3.0 · Content1 for Rod
Steps (5 open)
WB-34.1 Confirm with the designer whether the Done hi-fi homepage mockup supersedes this wireframe; if so, mark done and move on
WB-34.2 List the homepage blocks in order and map each to a registered section (HomeHeaderSection, LogoSection, ContentBlockSection, TestimonialSection, CtaSection)
WB-34.3 Wireframe the selector both ways (six need-states; three pillars) so the WB-32 decision can be applied without rework
WB-34.4 Wireframe mobile layout for the hero and selector
WB-34.5 Review with Rod and Iain; record sign-off on the Notion Design page Rod
Low-fi wireframes for six page types, each composed only of registered sections (or with a written justification for any new section type), with the partners page split into two paths (Builder: API/custom builds; Reseller: reliability/margins) with distinct CTAs, and the demo page showing how it adapts to visitor context. Reviewed by Rod and Iain.
0 of 5 steps
Website 3.0 · Content1 for Rod
Steps (5 open)
WB-35.1 Pull the pricing tiers from Chargebee and WB-05 SKUs so the pricing wireframe has real tier names
Write the Owner storyline: templates, update from anywhere, scalability, CTA to 'Start free' in under 2 minutes
4-beat storyline copy for the Owner (SMB) need-state: templates, update from anywhere, scale as you grow, with a CTA to a self-serve start path that takes under two minutes. Composed in Sanity, previewed, blog-review clean.
0 of 5 steps
Website 3.0 · Content1 for Rod
Steps (5 open)
WB-37.1 Pull Owner persona evidence (SMB, budget-conscious, multi-site) from the persona validation output and Fireflies
WB-37.2 Confirm with Rod or John whether a self-serve 'Start free' flow exists and its URL; if not, agree the CTA (trial request form) Rod
WB-37.3 Write the four beats: Hook (one person, several locations, no time), Change, Practice (templates, update from phone), AI + CTA
Write the Architect storyline: API depth, data sources, scheduling complexity, CTA to API docs and sandbox
4-beat storyline copy for the Architect need-state with real technical depth (API surface, data source catalogue, scheduling model, MCP), CTA to API docs and a sandbox. Reviewed by John Kesinger for accuracy. Composed in Sanity, blog-review clean.
0 of 4 steps
Website 3.0 · Content
Steps (4 open)
WB-38.1 Collect technical facts from John Kesinger: API surface, auth model, data source catalogue, scheduling model, MCP integration, sandbox availability
WB-38.2 Write the four beats: Hook (integration complexity), Change (API-first platform), Practice (a real integration walkthrough), AI + CTA (MCP demo, CTA to docs and sandbox)
WB-38.3 Select proof points: architecture diagram (commission via Nano Banana or Canva), tech case study, data source count
WB-38.4 Technical accuracy review by John; tighten; blog-review; compose in Sanity; submit
Write the Guardian storyline: security-first, RBAC, compliance, deployment options, CTA to security docs download
4-beat storyline copy for the Guardian (security/IT) need-state, CTA to a gated security documentation download (the lead magnet from WB-48). Claims verified against WB-43 (security deep-dive). Composed in Sanity, blog-review clean.
0 of 4 steps
Website 3.0 · Content1 for Rod
Steps (4 open)
WB-39.1 Confirm with Rod and the Hungary team the exact compliance status: GDPR (yes), SOC 2 (certified / in progress / no), ISO 27001 (same); list deployment options actually offered Rod
WB-39.2 Align every claim with WB-43 (security deep-dive) so the storyline and the deep-dive never contradict
WB-39.3 Write the four beats: Hook (IT's real fear: another unmanaged device fleet), Change, Practice (RBAC, SSO, on-prem option), AI + CTA (CTA to gated security docs)
WB-39.4 Select proof points: compliance matrix, RBAC diagram, on-prem case study reference; tighten; blog-review; compose; submit
Write the Builder storyline: one platform for every client, API, AI expands market, CTA to partner programme
4-beat storyline copy for the Builder (integrator/developer partner) need-state, CTA to the partner programme (Builder path on /partners). Composed in Sanity, blog-review clean.
0 of 4 steps
Website 3.0 · Content1 for Rod
Steps (4 open)
WB-40.1 Pull Builder persona evidence (integrators, developers, agencies building for clients) from persona validation and Fireflies
WB-40.2 Get partner programme terms and the Builder economics inputs from Rod and Zoltan (WB-09, WB-91) Rod
WB-40.3 Write the four beats: Hook (one platform for every client), Change, Practice (API + SDK workflow), AI + CTA (AI expands what you can sell; CTA to partner programme)
Write the Reseller storyline: reliability, support included, margins that work, CTA to partner economics
4-beat storyline copy for the Reseller need-state (uptime, support model, margins), CTA to the partner economics guide (WB-48 lead magnet). Composed in Sanity, blog-review clean.
0 of 3 steps
Website 3.0 · Content1 for Rod
Steps (3 open)
WB-41.1 Get verified uptime, support model description and retention figures from Rod or ops; do not proceed without them Rod
WB-41.2 Write the four beats: Hook (reseller's margin squeezed by support burden), Change, Practice (support included, reliability), AI + CTA (CTA to partner economics guide)
WB-41.3 Select proof points: reseller testimonial (Special Electronics or Media Solutions with permission), uptime stat, calculator; tighten; blog-review; compose; submit
Final homepage copy: hero headline and subhead, the selector labels (six need-states or three pillars per WB-32), proof bar captions, platform overview (UI / AI / API as equals), final CTA. Strapline agreed: 'Heavy foundations make light work.' Composed in Sanity against HomeHeaderSection etc., blog-review clean.
0 of 5 steps
Website 3.0 · Content2 for Rod
Steps (5 open)
WB-42.1 Write five hero headline options and subheads against the wireframe; shortlist two with Rod Rod
WB-42.2 Write the selector labels in both models (six need-state labels of 3-5 words each; three pillar labels) pending WB-32
WB-42.3 Write proof bar captions (customer count, screens managed, uptime, countries) with each number sourced from Rod or HubSpot Rod
WB-42.4 Write the platform overview block (UI / AI / API as equals) and the final CTA band copy
WB-42.5 Tighten, blog-review, compose in Sanity on the homepage Page document, preview, submit; then close WB-22.2
A scannable /security page with jump links: authentication, RBAC with the six roles diagrammed, encryption in transit and at rest, Kubernetes deployment architecture, compliance posture (only what is certified or in progress, stated accurately), deployment options (cloud, on-prem, hybrid). Every technical claim verified by John Kesinger or the Hungary engineering team. Composed in Sanity, blog-review clean.
0 of 5 steps
Website 3.0 · Content
Steps (5 open)
WB-43.1 Collect the technical facts from John and the Hungary team: auth methods (SSO/SAML?), the six RBAC roles and permissions, encryption in transit and at rest, Kubernetes topology, backup and DR, deployment options
WB-43.2 Confirm compliance status per framework in writing (GDPR, SOC 2, ISO 27001, any others) and how each may be stated publicly
WB-43.3 Commission the RBAC diagram (six roles, permission matrix) and a deployment options diagram via Nano Banana or Canva; get John's sign-off
WB-43.4 Write the page in sections with jump links: Authentication, Access control, Encryption, Infrastructure, Compliance, Deployment options, FAQ
WB-43.5 Technical review by John; tighten; blog-review; compose in Sanity; submit
Produce four persona-matched videos: Operator 60s side-by-side, Owner 90s walkthrough, Architect API dive, Guardian security walk
Four videos scripted, recorded, edited and hosted (YouTube unlisted or Vercel-served), embedded on the matching storyline pages, with captions. Scripts approved by Rod; product accuracy checked by John Kesinger.
0 of 4 steps
Website 3.0 · Content2 for Rod
Steps (4 open)
WB-44.1 Decide with Rod and John which of the four videos go ahead given WB-24 (interactive demo tool) and who records them Rod
WB-44.2 Write four scripts with shot lists: Operator 60s side-by-side (old way vs Wallboard), Owner 90s walkthrough, Architect API dive, Guardian security walk
WB-44.3 Rod approves scripts; John records screen captures; edit with captions and Wallboard end card Rod
WB-44.4 Upload to the Wallboard YouTube channel (unlisted until launch), record URLs, embed via GallerySection on the matching storyline pages
Source and write six case studies, one per persona, tagged by persona, industry and deployment size
Six CaseStudy documents in Sanity, one per need-state, each with customer name (with permission), problem, solution, results with numbers, quote, and tags for persona, industry, deployment size. Filterable on /customers.
0 of 5 steps
Website 3.0 · Content
Steps (5 open)
WB-45.1 Map every case study in the Notion Case Study Library and WB-19 repository to a persona; list which personas have none
WB-45.2 For each gap, shortlist three candidate customers from HubSpot Closed Won deals in that vertical; ask Guy or Jodie for the warmest
WB-45.3 Draft the permission request email per customer for Iain or the rep to send; track responses in the Notion library
WB-45.4 Interview or mine Fireflies calls for each; write the case study (problem, solution, results with numbers, quote) with blog-writer; tighten; blog-review
WB-45.5 Author as CaseStudy documents in Sanity with persona, industry and deployment-size tags; file the PDF version in the WB-19 repository
Write the platform overview (UI / AI / API capability story) and five feature pages: CMS, scheduling, devices, data, AI
/platform copy presenting UI, AI and API as three equal interface modes (capability story, not feature list), plus five feature pages on the shared template (headline, scenario, expandable tech detail, CTA). Composed in Sanity against FeatureHeaderSection and ContentBlockSection, blog-review clean, technical detail checked by John Kesinger.
0 of 5 steps
Website 3.0 · Content
Steps (5 open)
WB-46.1 Confirm the feature taxonomy after WB-32: five features (CMS, scheduling, devices, data, AI) or Rod's three pillars
WB-46.2 Collect product facts per feature from John and the KB; note what is shipped vs roadmap (Wallboard 2.1 rollout, 1.x phase-out by year end)
WB-46.3 Write /platform: UI, AI and API as three equal modes with one capability story each
WB-46.4 Write five feature pages on the template: headline, scenario, expandable tech detail, CTA
WB-46.5 John reviews tech detail; tighten; blog-review; compose in Sanity; submit
WB-47.3 Write /partners copy: public story, Builder path, Reseller path, certified sub-partner explanation (consistent with WB-09), portal link text
WB-47.4 Write /about (founded 2012, Hungary engineering, US and EMEA sales, team) using existing wallboard.us copy via Webflow connector as source; and /demo options copy
WB-47.5 Write /resources hub copy and adapt legal pages (privacy, terms, cookies, accessibility statement) from existing; flag any new clause to Rod
WB-47.6 Tighten, blog-review, compose each in Sanity, submit; Rod reviews legal pages Rod
Create three gated lead magnets: security whitepaper, AI vision paper, partner economics guide
Three PDFs (btg-doc styled to Wallboard brand), each gated behind a HubSpot form with its own form ID, landing page in Sanity, download delivery email in HubSpot, and lead-scoring rules attached (WB-49). Security whitepaper draws on WB-43; partner economics on WB-09 and WB-91; AI vision on Wallboard 2.1 roadmap.
0 of 5 steps
Website 3.0 · Content1 for Rod
Steps (5 open)
WB-48.1 Outline all three: security whitepaper (from WB-43), AI vision paper (from Wallboard 2.1 roadmap and Rod's AI positioning), partner economics guide (from WB-09 and WB-91); Rod approves outlines Rod
WB-48.2 Draft each with blog-writer, tighten, blog-review; render as btg-doc PDFs in Wallboard colours
WB-48.3 Create three HubSpot forms (Chrome, Marketing > Forms) with persona_type hidden field; record form IDs for WB-72
WB-48.4 Create three HubSpot delivery workflows (form submit sends the PDF link, sets a downloaded property, adds to nurture)
WB-48.5 Build three landing pages in Sanity (FeatureHeaderSection + FormSection) and test a download end to end
Configure HubSpot for the new site (marketer-owned): persona_type property, lead scoring per persona, nurture sequences, attribution and UTM model
In HubSpot portal 5122961: a persona property with the agreed values; form field definitions for every site form matching the FormSection contract (WB-72); lead scoring rules per persona; nurture sequences per persona; UTM and cross-storyline attribution model documented; routing and notification workflows. Documented in Notion.
0 of 6 steps
Website 3.0 · HubSpot and analytics
Steps (6 open)
WB-49.1 Decide with Iain and Rod: repurpose the existing hs_persona property (six legacy values, checked 4 Sep) or create persona_type; first count contacts per hs_persona value and find lists/workflows that use it
WB-49.2 List every site form (demo, contact, trial, three lead magnets, partner application, newsletter) with fields, hidden fields, and the HubSpot form ID; hand to WB-72
WB-49.3 Define lead scoring per persona (which actions score what) and build it in HubSpot (Chrome, Settings > Lead Scoring)
WB-49.4 Write and build one nurture sequence per persona (3-5 emails) with blog-writer copy; enrol on form submit by persona_type
WB-49.5 Document the UTM convention (source, medium, campaign, content=storyline) and the attribution report definition; save on the Notion Integrations page
WB-49.6 Build routing and notification workflows for new site leads, consistent with the WB-15 routing assessment; test with a submission
Final proofread across all pages: cross-storyline consistency, no persona disparagement, AI depth appropriate, no dead ends
Every page on staging read end to end with a checklist: terminology consistent across storylines, no page talks down another persona, AI claims match product reality and depth suits the reader, every CTA and link resolves, no placeholder text, house style rules pass (no em dashes, no banned words). Issues logged and fixed in Sanity.
0 of 5 steps
Website 3.0 · QA and launch
Steps (5 open)
WB-50.1 Export all published page copy from Sanity (GROQ) to markdown and run blog-review check.py and structure_check.py over every file
WB-50.2 Crawl staging with a link checker; list every broken internal link, external link and CTA with no destination
WB-50.3 Read each storyline against the others for terminology consistency and any line that disparages another persona; log
WB-50.4 Check every AI claim against WB-46.2's shipped-vs-roadmap list; flag anything roadmap stated as shipped
WB-50.5 Fix in Sanity, re-run checks, record pass in the Notion QA table
Run a WCAG 2.1 AA audit: keyboard navigation, screen readers, contrast, alt text, ARIA labels, selector accessibility
An audit report per page type with pass/fail against WCAG 2.1 AA, every issue logged with severity and fix, fixes applied in components (WB-64) or content, and a re-test confirming zero critical issues before launch.
0 of 5 steps
Website 3.0 · QA and launch
Steps (5 open)
WB-51.1 Add axe-core to the Playwright suite and run against every page type on staging; export violations by severity
WB-51.2 Keyboard-only walkthrough of homepage selector, nav mega-menu, FAQ accordion, forms, calculators; log any trap or missing focus state
WB-51.3 Screen reader pass (VoiceOver on Safari, NVDA on Firefox) on homepage, one storyline, /pricing, one form; log announcements that mislead
WB-51.4 Contrast check every token colour pair used for text against WCAG AA (4.5:1 body, 3:1 large); flag failing pairs for the designer
WB-51.5 GROQ query for images with empty alt across all documents; fill or flag; verify ARIA labels on selector, accordion, mega-menu; re-run axe and record zero critical
Cross-browser and device test every page: Chrome, Safari, Firefox, Edge on desktop, tablet, mobile; storyline flow on small screens
A test matrix (page x browser x device) with results, screenshots of failures, issues logged and fixed, and specific confirmation that the 4-beat storyline narrative reads correctly on a phone.
0 of 4 steps
Website 3.0 · QA and launch
Steps (4 open)
WB-52.1 Configure Playwright projects for chromium, webkit and firefox with desktop, tablet (iPad) and mobile (iPhone, Pixel) viewports
WB-52.2 Run the full-page screenshot suite across the matrix on staging; diff against WB-65 baselines; export failures
WB-52.3 Manual pass on real iOS Safari and Android Chrome: read one storyline top to bottom, use the selector, submit a form, open the mega-menu
WB-52.4 Pull browser share from GA4 to rank any failure by audience size; log and fix in priority order
Pre-launch sign-off: all pages on staging, redirects tested, analytics live, forms working, SSL active, DNS ready
A signed-off launch checklist (Notion QA & Launch page) with evidence for each item: every sitemap page renders on staging; redirect map (WB-33) tested with a script against staging; GA4 and HubSpot tracking firing (WB-75); every form posts to HubSpot and creates a contact with persona_type (WB-72, WB-90); SSL valid; DNS TTL lowered and cutover plan agreed (WB-77). Rod signs off. This gates WB-77.
0 of 4 steps
Website 3.0 · QA and launchdeadline 1 Oct
Steps (4 open)
WB-53.1 Script: for every URL in the Sanity sitemap query, curl staging and assert 200; for every WB-33 row, curl the old URL on staging and assert 301 to the mapped target
WB-53.2 Submit one test entry per form; confirm each contact in HubSpot via search_crm_objects with persona_type, UTM and source set; delete test contacts
WB-53.3 Confirm GA4 DebugView and HubSpot tracking fire on staging; confirm SSL (openssl s_client) and that wallboard.us DNS TTL has been lowered to 300s
WB-53.4 Export the Search Console and GA4 baseline (top pages, rankings, organic sessions) for WB-56; fill the launch checklist in Notion; get Rod's written sign-off
Post-launch: review storylines with sales, capture missing objections, iterate copy
A session with Rod, Guy, Jodie, Matt and Zoltan walking each storyline, asking whether they recognise the persona in real deals; a list of objections the pages do not answer; copy revisions made in Sanity within two weeks.
0 of 4 steps
Website 3.0 · Post-launch1 for Rod
Steps (4 open)
WB-54.1 Mine Fireflies for objections per persona (keywords: concern, worried, budget, security, integration, support) across the last 90 days of sales calls; tabulate by persona
WB-54.2 Book a 60-minute session with Rod, Guy, Jodie, Matt, Zoltan (outlook_find_available_time); circulate the storyline links and objection table beforehand Rod
WB-54.3 Run the session: per storyline, ask 'do you meet this person?' and 'what do they ask that this page does not answer?'; capture in Notion
WB-54.4 Revise copy in Sanity within two weeks (blog-writer, tighten, blog-review); note changes on the Notion Content page
Post-launch: monitor 2-4 weeks of persona conversion rates, selector click-through, bounce, and run the first A/B test
A weekly dashboard (GA4 exploration or Looker Studio) for four weeks after launch: selector click-through by option, storyline page bounce and scroll depth, form conversion by persona_type, comparison to the old site's baseline; and the first A/B test (WB-86) launched on selector wording with a documented result.
0 of 4 steps
Website 3.0 · Post-launch
Steps (4 open)
WB-55.1 Build a GA4 exploration (or Looker Studio report): selector CTR by option, storyline bounce and scroll depth, form conversion by persona dimension, week over week
WB-55.2 Pull HubSpot conversions by persona_type per week (query CONTACT grouped by persona_type, createdate) and add to the report
WB-55.3 Compare week 1 to 4 against the old-site baseline from WB-53.4; write a short weekly note for Rod (btg-doc)
WB-55.4 Launch the first A/B test on selector wording via WB-86; run to sample size; record the result and the decision
Post-launch: monitor Search Console for indexing, crawl errors, rankings and organic traffic old vs new
Daily checks for two weeks then weekly for two months: index coverage (no unexpected 404s or noindex), crawl errors zero, redirect chains none, keyword rankings for the top 50 terms tracked against pre-launch baseline, organic sessions old vs new. Any regression triaged within 48 hours.
0 of 3 steps
Website 3.0 · Post-launch
Steps (3 open)
WB-56.1 Daily for 14 days: Search Console index coverage, crawl errors, 404 report; log anything new against the WB-33 map
WB-56.2 Track the top 50 keywords from the WB-53.4 baseline weekly; flag any drop of more than 5 positions
WB-56.3 Compare organic sessions old vs new weekly for 8 weeks; run Rich Results Test on each template monthly; log on the Notion SEO & Redirects page
56 open tasks0 closed14 in progress4 blocked9 for Rod
27 of 206 steps
CRM-01●In progress
Partner tiering: decide what blank means
Only 91 of 678 partner-typed companies carry a tier. Since 10 August the report WB Partner Activity and the Active Partners view count only companies with a tier or real revenue, so 587 partners are invisible to partner reporting, and neither property sits in any alert. Backfilling tiers would multiply the report population roughly sevenfold overnight and break every period comparison.
2 of 3 steps
HubSpot cleanup
Steps (1 open)
CRM-01.2 If backfill approved: schedule tier writes + report rebaseline as one job
✓CRM-01.3 Log tiering ruling to hub; unblock ticket 20
✓CRM-01.1 Get Rod's ruling: blank tier deliberate, or backfill approved
Decision 5 cold triage: run the three approved moves
None of the three approved cold-triage moves has run. archive_reason holds zero Stale values (only No engagement, at 649), SQL stands at 1,466, and the roughly 100 quiet hand-raisers were never routed anywhere. Verified live on 20 August.
0 of 6 steps
HubSpot cleanup
Steps (6 open)
CRM-10.1 Re-derive 5a/5b/5c populations with 90-day form-fill exclusion
CRM-10.2 Approve the refreshed counts
CRM-10.3 Run 5b Stale flagging by connector
CRM-10.4 After grading verdicts: run 5c demotion as UI bulk edit
CRM-10.5 Park 5a into ticket 06
CRM-10.6 Verify all moves by direct ID read; log to hub
Rebuild channel role stamp workflows (association trigger + clearing)
The channel role stamp workflows (1863235489 Partner, 1863236139 Hardware Partner) fire on company Type change only, and they set a value they never clear. So a contact linked to an already-Partner company arrives unstamped, and a contact whose company is retyped away keeps a stale stamp forever. 52 stale stamps stand today, 1 Hardware Partner contact is unstamped, and every auto-associated partner contact since the 18 August auto-create re-enable joins the unstamped side until the trigger changes.
2 of 4 steps
HubSpot cleanup
Steps (2 open)
CRM-11.1 Chrome: rebuild stamp workflow + build review-flag workflow (NO clearing branch, see rewritten spec + amendments 30 Aug)
CRM-11.3 Verify by census and direct reads; log to hub
✓CRM-11.4 Identify the third writer of channel_role (INTEGRATION source, 14 Aug) - blocks 11.1
✓CRM-11.2 Connector pass: clear 52 stale, stamp HP 1 + arrivals since 20 Aug
Resolve the unassociated-contact backlog (view 69769717)
Contacts created while company auto-create was switched off have no company association. View 69769717 holds the remainder needing manual resolution, including seven held for human review.
1 of 1 steps
HubSpot cleanup
Steps (0 open)
✓CRM-12.1 Review and resolve the view 69769717 remainder
Bucket 30 March connector cohort as webinar-sourced
The 282 contacts loaded through the connector on 30 March 2026 still sit in the unknown-source pool and in the re-opt-in review list (283), skewing source attribution and the re-opt-in audience maths.
0 of 3 steps
HubSpot cleanup
Steps (3 open)
CRM-23.1 Confirm the source value and carrying property
CRM-23.2 Apply across the 282-contact cohort; verify
CRM-23.3 Retire the review list; note for ticket 06
462 contacts and 249 companies sit with owners who no longer work here, verified live today. 30 of the portal's 45 owner records are deactivated. Three owner records carry blank names, and one blank-named owner (97467630) is still active. A record on a departed owner gets no follow-up and appears in nobody's queue.
4 of 5 steps
HubSpot cleanup
Steps (1 open)
CRM-29.5 Archive deactivated seats; resolve the blank-name owner records
✓CRM-29.4 Clone-and-replace saved views owned by deactivated users
✓CRM-29.3 Route what routes; fold the residue into ticket 10
✓CRM-29.2 Rod confirms the routing rule for records with no signal
✓CRM-29.1 Re-derive the deactivated-owner backlog by owner and by company
Redesign the SQL grading pass around activity evidence
The grading pass asks reps "is this contact still live?", and that question cannot be answered, because nobody qualified these contacts in the first place. On every record sampled, createdate and hs_v2_date_entered_salesqualifiedlead are identical to the millisecond: contacts were created AS Sales Qualified Lead by an account default. Asking reps to grade records nobody ever worked produces guesswork dressed as data.
4 of 6 steps
HubSpot cleanup
Steps (2 open)
CRM-32.3 Demote remaining no-engagement group (Chargebee check first)
CRM-32.5 Revise ticket 10's 5c premise, then feed verdicts
✓CRM-32.4 Activity-evidence check on the 133 now with Jodie and 12 with Matt
✓CRM-32.2 Segment the bucket: automated-touch only vs genuine rep activity
✓CRM-32.1 Rewrite the grading question around activity evidence
Restore-window register: track every 90-day deadline
Several irreversible deadlines are running and nobody is tracking them. The archived properties (Verticals, Areas of Interest, three persona fields) expire around 6 November. The custom mrr deal field, archived 9 July, expires around 7 October. wb_tracked_partner, archived 10 August, expires around 8 November. Deleted contacts from the June purge and from later rep deletions carry their own windows. Each is a decision that gets taken by default if nobody looks.
2 of 3 steps
HubSpot cleanup
Steps (1 open)
CRM-33.2 Calendar each deadline with a two-week warning
✓CRM-33.3 Publish the register on the hub
✓CRM-33.1 List every archived property and deleted-record batch with its expiry
Internal-domain containment: confirm the tripwire, decide the end state
Nothing removes internal contacts any more. The auto-delete workflow was retired on 13 August because its survival test was "has an open deal", which has nothing to do with whether someone is internal, and because it ignored the is_internal_user flag the guides tell reps to set. The guard that replaced it only flags. A fortnight's watch was agreed to see whether anything still slipped past Never Log; nobody reported back, and one record already proved the gap.
1 of 4 steps
HubSpot cleanup
Steps (3 open)
CRM-42.2 Decide the end state: flag-only containment, or flag-and-notify
CRM-42.3 If a replacement is wanted, specify it for ticket 37
CRM-42.4 Record the outcome; close the fortnight watch
✓CRM-42.1 Census internal-domain contacts created since 13 Aug and their sources
Write a show-and-tell guide for creating deals in HubSpot
Screenshot-led guides (Notion, plus Loom scripts) showing the Wallboard team how to create a deal correctly: under the company, with catalogue SKU line items, correct pipeline and stage, amount fields filled as defined. Delivered before the next themed clinic.
0 of 3 steps
1 for Rod
Steps (3 open)
WB-03.1 Confirm the correct deal creation rules (company association, SKUs, pipeline, amount fields) with Rod Rod
WB-03.2 Write the guide with screenshots and record a Loom walkthrough
WB-03.3 Share with the sales team and link from the HubSpot onboarding page in Notion
Establish the canonical home and update process for the HubSpot product catalogue and new SKUs (with Rod)
The HubSpot product library is the single source of truth for SKUs, every deal uses catalogue-linked line items, and there is a documented process for requesting new SKUs that routes to Rod or Lisa. The library is cleaned so the sales team can find the right SKU quickly.
0 of 8 steps
4 for Rod
Steps (8 open)
WB-05.1 Restrict the Claude HubSpot connector so it cannot create deals with non-SKU line items
WB-05.2 Export the 266 products (98 without SKU) and classify: keep and rename to WB- pattern / retire / duplicate
WB-05.3 Agree with Rod where the canonical product/SKU list lives (Chargebee, HubSpot, or a controlled sheet) Rod
WB-05.4 Define the new-SKU intake mechanism: request form or field, approver, and how HubSpot is updated
WB-05.5 Write the SKU request process (route to Rod or Lisa) and the WB-HW naming convention in Notion; link from the deal-creation guide
WB-05.6 Find out who ran the 1 Sep 16:14 bulk edit on all 266 products and what it changed (HubSpot audit log or ask Rod/Jodie) Rod
WB-05.7 Decide with Rod: retire or back-fill the 98 products with no SKU, and rename the ~52 on vendor part numbers to the WB pattern Rod
WB-05.8 Confirm with Rod or Lisa the exact names and prices of the generic professional and interactive licence SKUs, then create them Rod
Clean deal data and build deal-value reporting (MRR / hardware / services split)
Active pipeline free of stale records and zero-dollar placeholders, deal amount fields defined and documented, credited deal-progression activities agreed, a HubSpot report showing MRR, hardware, services, implementation and total value separately, and a weekly administrative-drag field added. A separate conversation with Rod scheduled on the reporting build.
0 of 6 steps
2 for Rod
Steps (6 open)
WB-16.1 Audit the active pipeline for stale deals and zero-dollar placeholders; close or fix each
WB-16.2 Define and document the deal amount fields (MRR, hardware, services, implementation, total) in HubSpot
WB-16.3 Agree with Rod the list of credited deal-progression activities Rod
WB-16.4 Build the HubSpot report showing each value component separately, plus total
WB-16.5 Add a weekly administrative-drag field and brief the sales team on filling it
WB-16.6 Book a separate conversation with Rod on the revenue reporting build Rod
Freshdesk to HubSpot Service Hub migration: confirm connector limits, trial Help Desk Migration, decide scope before Freshdesk is decommissioned on 9 Sep
A go/no-go on the migration route (HubSpot native connector vs Help Desk Migration tool) with scope agreed (which tickets, whether company records are excluded), a full Freshdesk export taken as backup, and new-ticket handling live in HubSpot before Freshdesk is switched off on 9 September.
0 of 3 steps
deadline 9 Sep1 for Rodfocus
Steps (3 open)
WB-28.1 Draft the email to HubSpot's contact confirming native connector and smart-transfer limitations (ticket history, timestamps, custom fields); get the address from Rod Rod
WB-28.2 Export Freshdesk companies, match to HubSpot by domain, and quantify what dropping company records saves on the Help Desk Migration quote
WB-28.3 Write the go/no-go with Patrik's trial results and the Help Desk Migration demo notes; decide Unified Brand pipeline and confirm the full Freshdesk backup export
EMEA sub-partner certification: settle four edge cases
The EMEA sub-partner certification model is agreed in outline but four edge cases block the build: regional dual-status companies, sub-partners invoiced directly by Chargebee, graduation from sub-partner to a direct agreement, and whether certification applies to direct partners at all.
2 of 3 steps
HubSpot cleanup
Steps (1 open)
CRM-08.3 Type and associate known sub-partners; hand data work to Dominika
✓CRM-08.2 Chrome: build association label + two certification properties
✓CRM-08.1 Decision session with Rod and Dominika: settle four edge cases
The Other company type holds 29 records, and the contents are wrong: MidAmerica Nazarene University, 24 Hour Fitness, Norwegian Cruise Line and TForce Freight are Direct End Users, and Epiphan Video and MirageVision are hardware manufacturers. Other is quietly inheriting the catch-all role that Decision 1 spent real effort removing.
1 of 3 steps
HubSpot cleanup
Steps (2 open)
CRM-13.2 Jodie confirms or corrects the proposals
CRM-13.3 Apply by connector in three batches; verify
partner_agreement_date holds zero values across all 9,172 companies. The field exists only as an intention, while roughly thirty known agreement-YES flags sit in the prose of the Decision 1 manifest and in the tracker PDFs.
0 of 3 steps
HubSpot cleanup
Steps (3 open)
CRM-19.1 Hand the thirty-flag starter sheet to the AM team
CRM-19.2 AMs return dates from the agreement PDFs
CRM-19.3 Apply dates by connector; verify by census
Implement the distributor / certified sub-partner / end-user structure in HubSpot and Notion
Company-to-company association labels live in HubSpot (Contracting distributor, Certified sub-partner), a flag for sub-partners known but not yet visible, known chains applied, the Notion partner tracker reconciled with CRM, and a confirmation note sent to Zoltan and Dominika.
0 of 7 steps
Steps (7 open)
WB-09.1 Waiting on Dominika (dolah@wallboard.info): list of distributors, their sub-partners, and sub-partner end users, promised at the 1 Sep clinic
WB-09.2 Share the untiered partner spreadsheet with Dominika so she can help classify partners
WB-09.3 Create the company-to-company association labels in HubSpot: Contracting distributor, Certified sub-partner
WB-09.4 Add a company property or tag to flag sub-partners known to exist but not yet visible to Wallboard
WB-09.5 Apply labels to known chains: Media Solutions to Auviso and Kilchenmann; Special Electronics to the Swedish sub-partners
WB-09.6 Reconcile the Notion partner tracker with HubSpot and resolve discrepancies
WB-09.7 Send a confirmation note to Zoltan and Dominika describing the implemented model
Evaluate HubSpot Data Hub: use cases, ROI brief, and Pro vs Starter recommendation
A short brief for Rod that (a) defines 3-4 concrete Data Studio use cases (data quality monitoring, enrichment, reduced maintenance), (b) maps ROI across Sales, Service and Marketing Hub, and (c) recommends Pro or Starter with cost. Then a demo booked.
0 of 6 steps
1 for Rod
Steps (6 open)
WB-13.1 Read the Data Hub assets from the forwarded HubSpot email and list capabilities relevant to Wallboard
WB-13.2 Define 3-4 use cases for Data Studio: data quality monitoring, enrichment, duplicate prevention, reduced maintenance
WB-13.3 Map ROI per hub (Sales, Service, Marketing) against current manual cleanup effort
WB-13.4 Compare Data Hub Pro vs Starter: features, limits, annual cost
WB-13.5 Write the brief with a recommendation and share with Rod Rod
WB-13.6 Schedule a demo with HubSpot to walk through the use cases
8 open tasks2 closed2 in progress2 blocked3 for Rod
2 of 36 steps
WB-26▲Blocked
Provision four new sending domains in InboxKit and warm them in Instantly for upcoming campaigns
All four domains registered, DNS (SPF, DKIM, DMARC, tracking) configured, mailboxes created in InboxKit, connected to Instantly, warm-up running for 2-3 weeks, and deliverability checked before any campaign sends.
1 of 5 steps
1 closed this period
Steps (4 open)
WB-26.1 Wait for the Cloudflare move (all four confirmed still on GoDaddy NS on 4 Sep), then configure SPF, DKIM, DMARC and tracking domain in Cloudflare
WB-26.2 Create mailboxes in InboxKit and connect them to Instantly
WB-26.3 Start warm-up in Instantly and run for 2-3 weeks before any campaign sends
WB-26.4 Run a deliverability check (placement test, blacklist check) and record results
✓Check whether Zoltan has moved the four domains to Cloudflare (dig NS on each; Outlook search 'Cloudflare' after 3 Sep)
Nexmosphere joint webinar: agree content with Bo Merkx and deliver the invitation + Livestorm plan
Webinar content agreed with Nexmosphere, all six input items from Bo received and reviewed, and a written run-up plan covering email invitations and Livestorm setup, ready to execute.
0 of 11 steps
1 for Rodfocuspriority 1
Steps (11 open)
WB-01.1 Review Bo's suggested storyline and send consolidated feedback to Nexmosphere
WB-01.2 Agree the high-level content approach with the Wallboard team (Rod, Guy)
WB-01.3 Confirm the input brief received from Bo
WB-01.4 Review the 6-8 slide content suggestions
WB-01.5 Review the technical hardware/layout explanation and feed back
WB-01.6 Review the video and product visuals
WB-01.7 Set up the planning call with Bo, Rod and John for the week of 7 Sep and send calendar invites
WB-01.8 Agree the CTA / contact routing and the Q&A prep sheet with Bo
AutoVision v2: pull Apollo data for Guy's Northern California (14-18 Sep) and Texas (19-23 Oct) trips and run pre-visit email pushes in Instantly
For each trip, an Apollo list of dealership decision-makers in the visit area, deduplicated against HubSpot, loaded into an Instantly campaign with 'I'm in your neighbourhood' copy, sending ahead of the visit so Guy arrives with booked slots.
0 of 3 steps
focus
Steps (3 open)
WB-27.1 Decide now: send the NorCal (14-18 Sep) push from wallboard.biz, or skip it and target Texas in October
WB-27.2 Pull Apollo lists for NorCal and Texas metros, excluding premium and GM brands, deduplicate against HubSpot, load into Instantly
WB-27.3 Write the neighbourhood-visit sequence with a local reference customer per metro and Guy's booking link; launch at least a week before each visit
Set up Jodie with LinkedIn Sales Navigator Pro for municipalities prospecting
Jodie has a working Sales Navigator Pro seat, saved searches and lead lists built for the municipality personas, and a short how-to so she can run prospecting herself.
0 of 4 steps
1 for Rod
Steps (4 open)
WB-18.1 Confirm licence purchase and approval with Rod Rod
WB-18.2 Provision Jodie's Sales Navigator Pro seat
WB-18.3 Build saved searches and lead lists for municipality personas
WB-18.4 Write a short how-to (or Loom) for Jodie on running the searches and saving leads to HubSpot
Build the municipalities target list for Houston, Austin, Tulsa, Oklahoma City and the rest of Oklahoma in Apollo
A deduplicated Apollo list of municipality contacts for the target areas, matching the persona and title filters used for the DFW campaign, checked against HubSpot for existing relationships, and loaded into HubSpot (and Instantly if cold email is the channel).
0 of 4 steps
1 for Rod
Steps (4 open)
WB-04.1 Confirm the target persona titles with Rod (or lift them from the DFW campaign list) Rod
WB-04.2 Build Apollo saved searches for each segment (Houston, Austin, Tulsa, Oklahoma City, rest of Oklahoma) and pull the lists
WB-04.3 Deduplicate against HubSpot and flag existing relationships
WB-04.4 Load into HubSpot with source and campaign tags (and into Instantly if cold email is the channel)
Matt couldn't confirm details. Investigate if ClearLED Displays (clearled.com) and clearledusa.com are one company. Determine if they are a partner or end user, and if they resell Wallboard or buy for own screens. Merge and retype records as necessary.
End-to-end review of partner / reseller sales enablement and resources
A short report listing every partner-facing enablement asset (location, owner, last updated, quality), the partner journey from certification to first deal mapped against it, the gaps, and a prioritised recommendation list for Rod.
0 of 3 steps
Steps (3 open)
WB-07.1 Inventory every partner-facing asset: location, owner, last updated, quality
WB-07.2 Map the partner journey (certification to first deal) and mark where each asset is used
WB-07.3 List gaps and write a prioritised recommendation for Rod
Hand over the X (Twitter) account @wallboardcms to the Hungary team
The Hungary team has working access to the @wallboardcms X account, 2FA and recovery email point to them, the password has been rotated after handover, and the old credentials no longer work.
0 of 3 steps
Steps (3 open)
WB-30.1 Confirm the named owner on the Hungary team and their recovery email
WB-30.2 Share credentials via a password manager and transfer 2FA to the new owner
WB-30.3 Rotate the password after handover and confirm the old one no longer works