Better Than Good for
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
WorkstreamTasksClosed this periodIn progressReadyBlockedQueuedAsks of Rod
Website 3.06916600324
CRM5601436409
Campaigns8224203
Wallboard7720050

Website 3.0

Website 3.0 and the Build board
69 open tasks1 closed66 in progress0 blocked24 for Rod
4 of 284 steps
WB-22In 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
Open in Todoist
WB-57In progress

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
Open in Todoist
WB-58In progress

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
Open in Todoist
WB-59In progress

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
Open in Todoist
WB-60In progress

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
Open in Todoist
WB-61In progress

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
Open in Todoist
WB-62In progress

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
Open in Todoist
WB-63In progress

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
Open in Todoist
WB-64In progress

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)
  • WB-64.4 Build the content sections: ContentBlockSection (media left/right, cta on/off), ThumbnailGridSection (2/3/4 columns), GallerySection (grid/carousel)
  • WB-64.5 Build the interactive sections: FilterSection (facets, source), FormSection shell (fields from WB-72), TestimonialSection (single/carousel), LogoSection (grid/marquee), CtaSection (background, alignment)
  • WB-64.6 Write one Storybook story per section covering every variant; add a CI check that every file in src/sections has a matching .stories.tsx
  • WB-64.7 Designer review of each story against Figma; log deltas; fix; merge
Open in Todoist
WB-65In progress

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
Open in Todoist
WB-66In progress

Provision Sanity project and Studio; define document types Page, Product, CaseStudy, BlogPost

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.2 Define document types with defineType: page (title, slug, seo, pageBuilder[]), product (name, slug, tier, price, features[], seo), caseStudy (customer, persona, industry, deploymentSize, problem, solution, results[], quote, seo), blogPost (title, slug, author, publishedAt, body, seo)
  • 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
Open in Todoist
WB-67In progress

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
Open in Todoist
WB-68In progress

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
Open in Todoist
WB-69In progress

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
Open in Todoist
WB-70In progress

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
Open in Todoist
WB-71In progress

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
Open in Todoist
WB-72In progress

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
Open in Todoist
WB-73In progress

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
Open in Todoist
WB-74In progress

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
Open in Todoist
WB-75In progress

Wire GA4 + HubSpot persona tracking: persona_type population, UTM structure, cross-storyline attribution

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
Open in Todoist
WB-76In progress

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
Open in Todoist
WB-77In progress

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
Open in Todoist
WB-78In progress

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
Open in Todoist
WB-79In progress

Build /security: scannable deep-dive with jump links, RBAC diagram, encryption, compliance, deployment options

/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
Open in Todoist
WB-80In progress

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
Open in Todoist
WB-81In progress

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
Open in Todoist
WB-82In progress

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
Open in Todoist
WB-83In progress

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
Open in Todoist
WB-84In progress

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
Open in Todoist
WB-85In progress

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.2 Owner page: load WB-37 copy, 90s walkthrough video, SMB testimonial, price comparison table, hardware compatibility list
  • WB-85.3 Architect page: load WB-38 copy, API docs link, architecture diagram, tech case study, MCP demo embed, data source catalogue
  • WB-85.4 Guardian page: load WB-39 copy, security docs download (WB-48 form), pre-filled security questionnaire download, on-prem case study, compliance matrix, RBAC diagram
  • WB-85.5 Builder page: load WB-40 copy, partner economics calculator (WB-91), growth case study, API/SDK docs, platform comparison table
  • 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
Open in Todoist
WB-86In progress

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
Open in Todoist
WB-87In progress

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
Open in Todoist
WB-88In progress

Optimise page speed: lazy loading, WebP/AVIF images, deferred JS, CDN caching; target Lighthouse 90+

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
Open in Todoist
WB-89In progress

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
Open in Todoist
WB-90In progress

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
Open in Todoist
WB-91In progress

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
Open in Todoist
WB-92In progress

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
Open in Todoist
WB-93In progress

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
Open in Todoist
WB-94In progress

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
Open in Todoist
WB-95In progress

Build /pricing: tiered layout with monthly/annual toggle, feature matrix, FAQ accordion, persona-aware CTA

/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
Open in Todoist
WB-08In progress

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
Open in Todoist
WB-12In progress

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
  • WB-12.3 Share with Rod and get sign-off Rod
Open in Todoist
WB-25In progress

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
  • WB-25.2 Define key events: form submissions, demo requests, KB visits, partner enquiries
  • WB-25.3 Link HubSpot and Search Console; grant access to Rod and marketing
Open in Todoist
WB-33In progress

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)
Open in Todoist
WB-34In progress

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
Open in Todoist
WB-35In progress

Wireframe pricing, partners (Builder + Reseller paths), persona-aware demo, about, customers and resources pages

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
  • WB-35.2 Wireframe /pricing: tier cards, monthly/annual toggle, feature matrix, FAQ, CTA
  • WB-35.3 Wireframe /partners: public story, Builder path, Reseller path, calculator slot, portal link
  • WB-35.4 Wireframe /demo (persona-aware scenario, booking, video library), /about, /customers (filter + grid), /resources (gated + ungated)
  • WB-35.5 Map every block to a registered section; write a justification for any new section type; review with Rod and Iain Rod
Open in Todoist
WB-37In progress

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
  • WB-37.4 Select proof points: SMB testimonial, price comparison table inputs, hardware compatibility list (from John)
  • WB-37.5 Tighten, blog-review, compose in Sanity, preview, submit for review
Open in Todoist
WB-38In progress

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
Open in Todoist
WB-39In progress

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
Open in Todoist
WB-40In progress

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)
  • WB-40.4 Select proof points: growth case study, platform comparison table, calculator link; tighten; blog-review; compose; submit
Open in Todoist
WB-41In progress

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
Open in Todoist
WB-42In progress

Write homepage copy: hero headline, selector labels, platform overview, CTA

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
Open in Todoist
WB-43In progress

Write the security deep-dive page: auth, RBAC (6 roles), encryption, Kubernetes, GDPR/SOC 2/ISO 27001, deployment options

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
Open in Todoist
WB-44In progress

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
Open in Todoist
WB-45In progress

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
Open in Todoist
WB-46In progress

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
Open in Todoist
WB-47In progress

Write copy for pricing tiers, partner paths, about (est. 2012), demo options, resources hub and legal pages

Copy for /pricing (tiers, monthly/annual, feature matrix, FAQ), /partners (Builder and Reseller paths), /about (founded 2012, team, Hungary and US), /demo (options), /resources (hub), and legal pages (privacy, terms, cookies, accessibility statement). Composed in Sanity, blog-review clean, legal pages reviewed by Rod.

0 of 6 steps
Website 3.0 · Content2 for Rod
Steps (6 open)
  • WB-47.1 Confirm with Rod whether pricing is published publicly, and pull tier names, prices and inclusions from Chargebee and WB-05 Rod
  • WB-47.2 Write /pricing copy: tier descriptions, feature matrix labels, FAQ (10 questions from Fireflies objections), CTA
  • 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
Open in Todoist
WB-48In progress

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
Open in Todoist
WB-49In progress

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
Open in Todoist
WB-50In progress

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
Open in Todoist
WB-51In progress

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
Open in Todoist
WB-52In progress

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
Open in Todoist
WB-53In progress

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
Open in Todoist
WB-54In progress

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
Open in Todoist
WB-55In progress

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
Open in Todoist
WB-56In progress

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
Open in Todoist
3 more Website 3.0 tasks with no movement this periodqueued, ready or closed earlier

CRM

CRM and the HubSpot cleanup
56 open tasks0 closed14 in progress4 blocked9 for Rod
27 of 206 steps
CRM-01In 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
Open in Todoist
CRM-10In progress

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
Open in Todoist
CRM-11In progress

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
Open in Todoist
CRM-12In progress

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
Open in Todoist
CRM-23In progress

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
Open in Todoist
CRM-29In progress

Owner cleanup: 711 records on deactivated users

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
Open in Todoist
CRM-32In progress

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
  • CRM-32.6 Resolve Morgan's 3 remaining Opportunity contacts (incl. Brent Condit)
Open in Todoist
CRM-33In progress

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
Open in Todoist
CRM-42In progress

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
Open in Todoist
CRM-48In progress

Churn process: Former Customer anchor and automation

5 of 10 steps
HubSpot cleanup
Steps (5 open)
  • CRM-48.2 Build win-back workflow: Former Customer to Customer on closed won
  • CRM-48.3 Build churn review workflow: six month inactivity task
  • CRM-48.4 Build renewal-lost review workflow
  • CRM-48.9 Schema question for Rod: churn_reason dropdown
  • CRM-48.10 Ruling: company-level Former Customer for churned channel end users
  • CRM-48.7 Write and publish the churn How To guide
  • CRM-48.6 Backfill Chargebee-churned companies to Former Customer
  • CRM-48.5 Rename list 967 to Former customer contacts
  • CRM-48.1 Build workflow: Former customer - contact list remove (churn)
  • CRM-48.8 Ruling: contact Lead Status at churn, leave or clear
Open in Todoist
WB-03In progress

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
Open in Todoist
WB-05In progress

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
Open in Todoist
WB-16In progress

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
Open in Todoist
WB-28In progress

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
Open in Todoist
CRM-08Blocked

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
Open in Todoist
CRM-13Blocked

Sweep the Other bucket (29 companies)

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
  • CRM-13.1 Draft the 29-row Other retype proposal
Open in Todoist
CRM-19Blocked

Backfill partner agreement dates (~30 known)

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
Open in Todoist
WB-09Blocked

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
Open in Todoist
WB-13Ready

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
Open in Todoist
44 more CRM tasks with no movement this periodqueued, ready or closed earlier

Ready (HubSpot cleanup) · 30

Campaigns

Outbound and webinars
8 open tasks2 closed2 in progress2 blocked3 for Rod
2 of 36 steps
WB-26Blocked

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)
Open in Todoist
WB-29Ready

Chase Zoltan (via Rod) to move the four new GoDaddy domains to Cloudflare; confirmed NOT done as of 4 Sep

The four AutoVision v2 sending domains are on Cloudflare DNS under Zoltan's management, and Iain can proceed with InboxKit and Instantly setup.

1 of 3 steps
1 closed this period
Steps (2 open)
  • WB-29.1 Draft a chase to Rod and Zoltan referencing Iain's 3 Sep message, listing the four domains still on GoDaddy nameservers
  • WB-29.2 Re-check nameservers after they reply; confirm cloudflare.com on all four, then hand over to WB-26
  • dig NS on all four domains to confirm whether they are on Cloudflare
Open in Todoist
WB-01In progress

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
  • WB-01.9 Build the email invitation plan: audience lists (Wallboard + Nexmosphere), sequence, send dates
  • WB-01.10 Set up the Livestorm event, registration page and HubSpot sync for registrants
  • WB-01.11 Confirm webinar date and Wallboard speakers with Rod Rod
Open in Todoist
WB-27In progress

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
Open in Todoist
WB-18Blocked

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
Open in Todoist
WB-04Ready

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)
Open in Todoist
2 more Campaigns tasks with no movement this periodqueued, ready or closed earlier

Wallboard

General and case studies
7 open tasks7 closed2 in progress0 blocked0 for Rod
0 of 22 steps
Done

Update the Flower Mound case study

A revised Flower Mound case study saved to the case study repository and the Notion library entry updated.

3 of 3 steps
4 closed this period
Steps (0 open)
  • Revise, file in the repository, and update the Notion library entry
  • Locate the current Flower Mound version and pull new material from the Fireflies recording
  • Confirm scope of the Flower Mound update with Rod or Jodie
Open in Todoist
Done

Document repository for case studies in Sharepoint

0 of 0 steps
1 closed this period
Open in Todoist
Done

Sync Sharepoint case study repository to Hubspot

0 of 0 steps
1 closed this period
Open in Todoist
Done

Tidy up ClearLED records

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.

0 of 0 steps
1 closed this period
Open in Todoist
WB-07In progress

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
Open in Todoist
WB-30In progress

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
Open in Todoist
5 more Wallboard tasks with no movement this periodqueued, ready or closed earlier