Skip to content

Thank-you page rebuild, plus the missing job task slugs - #266

Merged
jadhavgaurav merged 5 commits into
mainfrom
development
Sep 10, 2026
Merged

jadhavgaurav merged 5 commits into
mainfrom
development

Conversation

@jadhavgaurav

Copy link
Copy Markdown
Contributor

Five commits.

apps/web — thank-you pages (4 commits)

  • Rebuilt on the site's canonical dark band, with the panel lifted out of its lower edge. It previously shipped as a bare Section on the default background.
  • Fixed three defects found on the way: the primary CTA pointed at /clean-images (404, the route is /cleanstart-images), the secondary CTA was invisible (.cs-link-cta is white with a #33BAEC hover, built for dark bands, so on a white card it rendered white on white), and the copy promised a reply 'within one business day', reintroducing exactly what 9f0defc removed from every form and email the day before.
  • Dropped the success pill. Nothing on the site renders one, and eyebrow is a metadata convention consumed by og.ts, not a visual one.
  • Rewrote the copy from the confirmation emails each form actually sends, then cut what those emails could not back: a quoted subject line that had already drifted from the real one, an invented claim that a prospect is not contacted until the partner says so, and a route sending candidates to the sales contact form.

apps/cms — job task slugs (1 commit, from another session)
Adds five labels to enum_payload_jobs_task_slug that were registered in config without a migration, so queuing them failed and the scheduler still looked healthy. Two are GDPR retention jobs. Additive and idempotent (ADD VALUE IF NOT EXISTS), no data change.

Verified: lint, typecheck and build all pass on apps/web; all four thank-you routes prerender.

The page shipped as a bare left-aligned Section on the default background,
while every form that leads to it opens on the dark violet band. Arriving there
read as a drop onto an unstyled page rather than the last step of one flow.

Rebuilt on the canonical band with the faded grid asset, and lifted the panel
out of its lower edge, which is the idiom the Book a Demo form already uses.

Three real defects went with it:

- The primary CTA pointed at /clean-images, which 404s. The route is
  /cleanstart-images. The deal-registration secondary pointed at /compare,
  also a 404, and contact pointed at /knowledge-hub, which redirects into a
  single article rather than a listing.
- The secondary CTA was invisible. It used .cs-link-cta, which is white with a
  #33BAEC hover because it is built for the dark bands; on the white card that
  is white on white, and the hover measures 2.2:1. Added a light-surface
  variant on #3960F9, the blue already used for focus rings.
- The copy promised a response 'usually within one business day', reintroducing
  exactly what 9f0defc removed from every form and confirmation email a day
  earlier, on the grounds that it reads as a commitment the team has not
  agreed to.

Also dropped the defining-by-negation tic the copy had picked up in four
places ('not an autoresponder sequence', 'rather than a shared inbox nobody
owns'), and raised the band's top padding floor so the eyebrow pill clears the
overlaid header on narrow viewports.
The page opened with a green tick pill reading 'Demo requested'. Nothing else
on the site renders a success badge, and the eyebrow it was built from is a
metadata convention rather than a visual one: pages pass `eyebrow` to
buildPageMetadata so og.ts can print a category onto the share card. On the
page it read as a generic form-submitted toast, and it restated what the
headline underneath it already says.

Removed the pill and the now-dead `eyebrow` field, which duplicated
`metaTitle` verbatim in all four entries. The headline leads instead.
The 'what happens next' block was reassurance rather than information. It told
the visitor they would hear from 'a named person who has read your message,
not a sequence', which is corporate-speak wrapped around the same
defining-by-negation tic the previous pass was supposed to remove, and it
closed with 'say so in your reply' when the visitor has just submitted a form
and has no thread to reply to.

Rewritten from the confirmation emails these forms actually send, so the page
and the inbox agree. Each block now names the subject line the visitor is about
to receive and what to do with it.

The careers case is the reason this had to be per-form rather than generic:
that confirmation is sent from an unmonitored address and tells the applicant
not to reply, so pointing them at a reply would have contradicted it. It points
at the contact form instead.
Three things the copy asserted that it could not back.

It quoted the confirmation email's subject line so the visitor could find it.
That duplicated a string owned by apps/cms into apps/web, and it had already
drifted: the page said 'We have received your message' where the email sends
"We've received your message". One place to keep true is now zero, since the
page just says to check the inbox.

Deal registration claimed 'your prospect is not contacted until you say so'.
Nothing in the deal-registration flow or its email says that. It is a
commitment about how the partner process works, invented on a public page.

The careers page sent applicants to the contact form when they could not reply
to the unmonitored confirmation. Nothing routes candidate questions there, and
that form goes to a sales inbox.

Also trimmed the demo body to what its email actually says. Every remaining
sentence now traces to a line in the email the same form sends.
Five tasks were added to payload.config.ts without a matching migration, so
`enum_payload_jobs_task_slug` never learned them. Every attempt to queue one
failed the INSERT into payload_jobs with

  invalid input value for enum enum_payload_jobs_task_slug: "refreshCrux"

Payload's scheduleQueueable catches that and marks the task `errored`, while
defaultAfterSchedule still advances lastScheduledRun in the job-stats global.
So the scheduler reported healthy timestamps for tasks that had never run once,
and analyticsCache simply stopped updating for those keys with nothing anywhere
to explain it.

Affected, none of which has ever executed in production:

  purgeConsentLog         daily 04:00  GDPR consent-log 24-month retention
  purgeDealRegistrations  daily 03:30  GDPR deal-registration PII 365-day purge
  retryDealSync           every 10m    deal-registration HubSpot sync retry
  refreshContentInsights  daily 06:30  content-insights snapshot rebuild
  refreshCrux             daily 06:45  Core Web Vitals origin cache

Two are retention jobs, so this is a compliance gap rather than only a stale
dashboard. The task handlers themselves were never broken: refreshCrux was
verified end to end against production — credentials resolve, the CrUX API
returns both form factors, and the analyticsCache write succeeds.

ADD VALUE IF NOT EXISTS keeps the migration idempotent and lets it no-op on a
database built from a later baseline. Postgres cannot drop an enum value, so
`down` is deliberately a no-op.
@vercel

vercel Bot commented Sep 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
cleanstart Skipped Skipped Sep 10, 2026 6:41am UTC

Request Review

@jadhavgaurav
jadhavgaurav merged commit 9a139d2 into main Sep 10, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant