Leadpages
Internal · Team MeetingVol. 11 / 2026Sep 4 → Sep 11

This week at  Leadpages

201 board items across a full Friday-to-Friday week, from sixteen names in the deploy notes. Widgets shipped with no flag on it at all. Routines shipped complete and switched off. And last week's checkout warning turned out to be exactly right.

BOARD ITEMS
201
Released / Merged / Done, Sep 4 through this morning.
CONTRIBUTORS
16
Names in the deploy notes, including Ross Fisher's first three.
NEW PRODUCTS
2
Widgets, live to everyone. Routines, built and inert.
CHECKOUT BUGS
4
Found on last week's dark ship. All four already fixed.
01

Build it once, use it everywhere.

The largest user-facing thing in the window, and it is not behind a flag. 

NewHP-2701#5393Greg Jewell

Widgets.

Save a block of content once and embed it across pages, linked rather than copied, so editing the definition updates every placement at once. Placed copies are locked from inline editing on purpose, which is what makes the guarantee hold; per-page presentation lives in structured settings outside the widget markup. The design choice worth calling out is that widgets are stored as special pages, so they reuse the existing editor, publish pipeline and version history instead of spawning a parallel system. Ships with a catalog, a dashboard section, edge rendering, and live data providers including a poll and a Stripe-backed fundraiser. The AI can now also see every page in a site and apply an edit across several at once.

02

Work that runs while you're asleep.

The week's other new product, built end to end and deliberately inert. 

NewHP-4093#5427#5438routinesMichael Sacca

Routines: scheduled work an agent can create.

Three kinds to start: find an A/B test, send a digest, write a blog post. Three new tables track the schedule, its backlog and its run history, with skips counted separately from failures and credit spend and refund tracked independently so a failed run still shows what it cost. An hourly cron is registered behind an environment kill switch. The guardrail worth naming in the room: validation lives in the store layer rather than the UI, so an agent creating a routine cannot promote it to unattended mode. Agent-created routines are forced to draft output.

Fix#5472Michael Sacca

All three kinds can now actually be created.

The dialog was rejecting every kind server-side because config fields and output modes weren't wired to each kind's supported set. Output mode now derives from the kind, with unsupported options shown disabled and explained rather than hidden. Email recipients are parsed and displayed back so a typo fails visibly instead of silently not delivering.

Polish#5416Michael Sacca

The schedule grammar came out of the blog agent.

Timezone-aware parsing, next-run computation and DST handling were never blog-specific, so they moved to a shared module with a re-export shim and 121 tests passing unchanged. The live scheduled-reports scheduler was deliberately left alone, because it is UTC-only by design and migrating it would have shifted existing customers' reports by up to an hour.

03

Last week's checkout warning was correct.

Vol. 10 shipped the checkout element dark and said production verification against real Stripe was still needed because every Stripe call in it was mocked. QA then found four real defects on live pages. All four are fixed, and the element gained three genuine features on top. 

04

Migration stopped being a plan.

Wave 1 was pinned to Sep 7 and most of the week's volume is the machinery behind it. Little of it demos, but it explains the item count. 

New#5322Desmond Small

A batch driver that survives a closed laptop.

Migration chunks were running through shell loops with no memory. An append-only ledger now records which accounts completed, skips them on re-run, and persists across sleeps, tunnel drops and operator breaks. It separates migrated, census-ok, sub-account, infra, failed and interrupted outcomes, retries infra failures without spending budget, and halts on consecutive real failures. A read-only census mode finds unmigrable accounts before a wave starts rather than mid-run.

NewHP-2910#5407Pedro Gyrao

Custom-domain sites can migrate at all.

The cutover was refusing them outright. They now resolve through the migration map, publish their routes and bind the domain. Two data bugs fixed alongside: legacy site-level published content wasn't being imported, and per-route drafts were being overridden to published, so migrated content didn't match what was actually live in Classic.

New#5261Pedro Gyrao

Migrated sites go live by themselves.

Google-hosted images are pulled into the customer's own Media Library at full resolution and references rewritten off external servers. Domain connection and publication then run through a background job that waits for both the import and the Cloudflare certificate before publishing atomically, so a domain never goes live half-migrated.

Fix#5358Desmond Small

Shared favicons were killing whole pages.

A favicon with no Classic asset identity got routed to shared storage and then assigned to a column that only accepts library assets, so the entire page insert failed silently. IDs are now validated at all three call sites and shared assets adopted into the importing org's library.

NewHP-4885#5333Greg Jewell

Accounts are frozen while they move.

Migrated annual customers with active monthly add-on charges can't change plan, seats or domain add-ons until their first Paddle renewal, because proration quotes would be wrong. The block lifts automatically. Modals now also distinguish a user declining from a lost session, so people can retry instead of restarting.

New#5003#4995Desmond Small

Zapier and Leadbox carryover.

Classic Zapier connections carry across, and Leadbox capture serves through Nova. Landed late in the window with board detail only.

06

Nova headers, finally.

Four customer reports about one surface, spanning the whole window, and the thread was still open when I wrote the mid-week draft. 

FixHP-4932#5417Greg Jewell

Applying a layout preset stripped all nav styling.

The preset was reparenting links out of both their widget div and their link container, so every scoped CSS rule stopped matching even though no styles were deleted. It now adopts the customer's existing container rather than creating a duplicate, keeping the cascade intact. Verified with computed styles in headless Chromium before and after.

FixHP-4932#5443Ross Fisher

And it zeroed the link spacing.

Where links share a row with the logo or a CTA, the container can't be adopted, and the gap was silently falling back to a default 16px. It now walks up to find the row that actually holds the spacing. Correct spacing is never replaced, since the fallback only engages when no real value was found.

FixHP-4813#5307Greg Jewell

The panel showed every nav item twice.

Headers with both a desktop bar and a mobile drawer render each link twice and the panel listed both, so edits updated whichever copy it happened to resolve. Each item now appears once, edits update every rendering, and undo restores them together.

FixHP-4851#5352Greg Jewell

New links went into the mobile drawer.

On migrated Classic headers where the nav sits in a div rather than a nav element, Add link inserted into the drawer instead of the desktop bar, and dropdowns couldn't be built at all. Pairing now recognises non-nav containers and cloned links inherit the right styling.

FixHP-4576Greg Jewell

Two hamburgers, one of them dead.

Imported Classic sites rendered a non-functional hamburger inside the header and a working one outside it, so mobile visitors had even odds of tapping the wrong one.

07

The AI stopped inventing things.

Three fabrication bugs, all customer-visible, all with real commercial consequences. The strongest narrative thread of the week and a direct continuation of Vol. 10's. 

FixHP-4940#5406Greg Jewell

Grounded pages were fabricating testimonials.

When a run is grounded in the customer's own material, invented proof is the one thing it must not produce. It was leaking in four places: stage two ordered testimonials and ratings unconditionally, the stage 1.5 scaffold committed invented numbers that then outranked the safety rules, the scorer penalised honest pages and recommended adding proof, and brief variants received inconsistent grounding signals. A single module now owns the grounding decision so every stage agrees, with explicit markers carried downstream.

Fix#5441Michael Sacca

It invented brand colours over the brand kit.

Style directions ignored the selected kit palette in prose, and those invented colours then won in the page's final CSS through spreading order. Identity roles, primary, CTA, background, text and accent, are now snapped back to the committed kit after the model responds, while surface, mood, type pairing and section rhythm stay the direction's own. The note records this as reported twice as a major blocker to purchase.

FixHP-4939#5424Shaukat Iqbal

The validator forbade a shape it never checked.

Rules at the top level of the responsive stylesheet were never inspected, only those inside media blocks, so the AI kept writing exactly the unscoped shape the validator's own error message prohibited. Now classified the same way at both levels.

Fix#5410Michael Sacca

Empty style attributes broke blog rendering.

A leftover style="" on a list item or table cell escalated the whole block to raw HTML on publish, so styled content rendered as visible escaped markup. Only styles with actual declarations escalate now.

08

Chat that holds together.

Shaukat had a strong week on AI chat reliability, and Tarek found two pricing bugs pointing in opposite directions. 

Fix#5364Tarek Alakkad

Undercharging by half, overcharging by 28x.

GLM 5.3 Flash was billed off a rate table copied from a promotional badge, so it undercharged by half. Meanwhile blog generation, blog ideation and optimize review all hardcoded Sonnet pricing regardless of what ran, overcharging by 25 to 28 times. Both corrected by measuring real per-request cost, and all three surfaces now bill model-aware.

Fix#5375Shaukat Iqbal

Messages landed in the wrong conversation.

Switching between saved chats left the conversation ID pointing at the previous one, so the next message was filed against the chat you had just left. Now resynced on selection, with a guard so a background fetch of the default conversation can't race and overwrite a manual choice.

Fix#5381Shaukat Iqbal

Switching models broke the chat.

Reference numbers minted by non-Claude providers were being replayed to Claude, which rejected them, so a Kimi-to-Claude or Turbo-to-Standard switch failed. Compliant IDs are now generated for other providers, with a migration for conversations already affected. Retry also stopped silently downgrading to Standard.

FixHP-4924#5425Jhoan Sanchez

One retry wasn't enough for an outage.

A single immediate retry can't ride out a multi-minute upstream degradation, so users hit the fallback message repeatedly during Anthropic outages. Retries now use bounded jittered backoff with different schedules for an empty stream and a 529 overload, are abortable so a cancel doesn't hang, and stay gated on nothing having streamed yet so commands can't double-apply.

Fix#5373#5372Shaukat Iqbal

History order and voice dictation.

Chat history was sorting on a timestamp that froze at conversation start and got bumped by unrelated page edits, so the list showed the wrong chats as active. And dictation overwrote anything typed between pauses, because the recogniser replayed its whole transcript each time rather than only new results.

Polish#5350Tarek Alakkad

A tenfold latency cut on GLM.

Its reasoning can't be disabled but can be set to low effort, dropping reasoning tokens about seventy percent and reasoning latency from 30 to 50 seconds down to 17 to 39. Provider routing now steers OpenRouter traffic to faster upstreams instead of its default cheapest-and-slowest pick.

09

Penn learned the business.

The blog agent went from working to usable. 

New#5262Michael Sacca

Writers get an author and standing categories.

A pinned author validated against workspace scoping, plus standing categories. A Scheduled posts section lists every writer with state pills and the next three firing times, DST-correct, all editable in one modal. Cancel and resume disable runs reversibly without losing history.

New#5362Michael Sacca

Chat-written posts use the real pipeline.

Posts written from the chat editor were authored by whichever model happened to be pinned for page editing, so voice drifted and a provider pin change could silently alter blog content. Chat now collects a brief and delegates to the same two-stage pipeline the scheduler uses. Truncated output is rejected before saving, and a failed copyedit saves the draft while reporting the failure honestly.

New#5411Michael Sacca

Penn can generate images in posts.

With the same credit discipline as cover images. The screenshot button is now hidden in the blog editor, since the sandboxed preview iframe meant it could never work there.

Fix#5263Michael Sacca

Every post had the same laptop photo.

Cover prompts anchored on shared blog tags rather than the post, so they converged on one stock frame. A cheap concept generator now invents a post-specific idea from the title and excerpt, explicitly forbids the laptop-desk-mug-plant cliché, and falls back to rotation rather than costing more.

NewHP-4925#5445publish_chat_shellJhoan Sanchez

Create Blog goes through Piper now.

Blog creation was stuck on the old field-based form while page creation had long since moved to the AI flow. The dashboard route now redirects into Piper, which fixes the Create menu, direct links and bookmarks at once, with the legacy form still there as a fallback for accounts without the flag.

Fix#5142#5086Katherine Patrick

Two Piper blog bugs.

Refining a template replied "noted, that goes into the build" to every follow-up, meaning refinement did not exist; templates are now read, rewritten and saved in place. And AI-generated blogs were publishing the model's internal reasoning as their public description, cut off mid-word, which leaked into public headers, generated landing pages and every downstream prompt.

10

Converted measures the right things.

Tarek on measurement and agent parity, Michael on audiences. One item logged today is worth watching. 

NewHP-3682#5311Tarek Alakkad

Funnel steps link to real tracking destinations.

A conversion step can now be bound to an existing Conversion Tracking destination, or a hand-added "our tracking" step converted into one in place, preserving its wires and lane position. Nodes are minted in the shape the sync expects, so it refreshes them rather than creating a twin, and the step name locks to the destination's.

NewHP-4891Tarek Alakkad

Cost per acquired customer.

CAC derived from purchase-type tracking destinations, on the Home "what moved" panel and the campaign canvas. The metric people ask for, in the two places they look.

FixHP-4982#5426Tarek Alakkad

Four of nine bid strategies returned 400.

An omitted optional target produced an empty submessage, which Google rejects as a field mask naming a message with subfields. Masking the subfield as an explicit clear fixes it. Verified against a real Google Ads account, because unit tests could not catch this.

FixHP-4874HP-4877Tarek Alakkad

Chips reading 3.8K% on every lane.

Period-compare was stamping the funnel-wide rollup onto every internal conversion step, so each lane copy showed the same inflated delta. The companion fix makes a lane copy's chip measure by the same rules as the box it sits on.

New#5343#5318Michael Sacca

Audiences from HubSpot, attached to live campaigns.

Funnel pools can pull contacts straight from a HubSpot list through the existing hash-and-upload path, with a picker rather than an ID to paste. And an existing synced audience can now be attached to a live or queued campaign instead of forcing a duplicate: on Google as a targeting criterion, on Meta merged into each ad set with a read before write so a retry can't duplicate.

FixHP-5017HP-5018Tarek Alakkad

Trial to paid was undercounted by about half.

Logged today: trials-only conversion tracking misses the paid conversion, with a backfill planned for everything missed since the Paid Subscriber destination was created, including click-identity resolution. Board only, no deploy note yet, so treat as in flight rather than shipped.

11

Everything else worth showing.

Small surface work that demos well and needs no setup, plus the rest of your own week. 

NewHP-4921#5444Jhoan Sanchez

Bullets can finally be styled.

Seven symbol presets, dot through star, with independent colour and size, in a new List section in the inspector. Bullets render through counters and scoped styles so they look identical across browsers, the styling survives save, publish and reopen, changes coalesce into one undo entry, and the AI can produce styled lists directly. People were previously faking this with manual icons.

NewHP-4574#5479Jhoan Sanchez

Form field text colour without paying for it.

It could only be changed by asking the AI, which cost credits for a style change. There is now a colour picker in the per-field inspector, persisting in the same inline format the AI produces so manual and AI-set colours are indistinguishable. Clearing it returns to theme inheritance with an explicit hint.

New#5429Ross Fisher

Reset an evergreen countdown for everyone.

Returning visitors were seeing stuck or expired timers with no way to restart them short of duplicating the page and breaking existing links. A Reset timer button bumps a version segment in the stored key so every visitor's clock restarts on their next load. The deploy itself never re-clocks anyone.

New#5428Shreyanshi Vashistha

Salesforce, natively.

Built directly into the platform with no Paragon in the middle, mirroring the native OAuth providers, so customers migrating to Nova keep their Salesforce connection. Handles the awkward parts: per-org API hosts, missing expiry in token responses, and strict lead field validation with fallbacks.

Fix#5420#5342Shaukat Iqbal

Preview is full-bleed, and Optimize reads in dark mode.

The inspector stayed pinned over the canvas during preview. Separately, two Optimize headings were hardcoded near-black and invisible on dark backgrounds, and completed opportunity cards weren't dismissing; they now clear server-side against the ledger, with a classifier matching whether an edit actually accomplished a suggestion rather than matching wording.

FixHP-4944#5421Greg Jewell

Absolute positioning left its dimensions behind.

Returning an element to static or relative kept the width and height the editor had locked while it was absolute. Elements now record exactly which dimensions they locked, and those are cleared only if they still match, so anything the user deliberately changed survives.

New#5319Katherine Patrick

46 more templates, 166 to 212.

Thirty-seven ported from the Classic builder and nine from Page Studio, with no broken images. Also fixed a seeder bug that would have deleted user-created templates published through the in-editor flow. Worth knowing before you announce it: the templates do not appear until someone with AWS access runs the seed and thumbnail commands.

NewHP-3725#5339Katherine Patrick

Enrichment quotas the pricing page already sold.

IP and lead enrichment limits were published per tier and never metered, so billable third-party volume was uncapped. Monthly counters now enforce them at the single chokepoint, metering delivered results rather than attempts so retries don't consume quota. Plan version 2 only; legacy customers stay unlimited on their original terms.

NewHP-3150HP-4199#5203Katherine Patrick

Three smaller ones.

Alignment controls in the Layout pane, a notice on blog post layout explaining that styling comes from the template, and a fix for + Add field closing the entire inspector because insertion was deselecting the element.