← back to work case study · internal tooling

The product deck generator

a commercial led lighting manufacturer · 2026 · no development background, no developer, no budget beyond a subscription

42 measured minutes per product, across a 27-product queue, replaced by a four-field web form.

42 minmeasured manual build, per product
27products in the queue
19 hrsof designer time per cycle
411badge assets resolved automatically

the problem

Sales needed per-product slide decks for launches and distributor presentations. What existed was a fifty-three slide quarterly training deck covering a whole release — so someone who needed one fixture had to present all fifty-three or rebuild by hand.

A manual build meant pulling the spec sheet, retyping technical values, hunting photography across a shared drive, placing certification badges, sourcing a background, applying brand typography, generating a QR code, and proofreading. Error-prone, because it was retyping.

what it cost, measured

I timed it rather than estimating it.

stagetime per product
Before the template existedOne to two hours — an estimate, and the only figure here I didn't measure
With the nine-layout template42 minutes, measured — the template alone roughly halved it
With the generatorInstrumented as of this month; the number lands here when there's enough data to mean something

42 minutes across 27 products is roughly 19 hours per cycle — and that's the improved figure, after the template. The generator is measured against that rather than against the flattering original.

the first decision was not to build the generator

The template shipped first — a nine-layout slide master with correct brand typography, plus a mapping document showing which slide element draws from which spec sheet field. Usable immediately, and it validated the data model before any application code existed. The generator came after, once the template had been tested against real products.

what I built

Four fields: product name, category, product page URL, images. Collapsed from a much larger first draft. The output is a downloadable, correctly named, brand-compliant presentation file.

  • Data extraction. A serverless endpoint fetches the product page, finds the spec sheet PDF link in the markup, downloads it, size-checks it, and passes it to an LLM API for structured extraction. Manual upload as fallback.
  • Extraction contract. A tightly specified JSON schema: short name, category, description, five named features, six accessory slots, lumens, wattage, CRI, CCT, rated life, dimming, and an ordered certification list.
  • Asset resolution. A manifest endpoint reads the repository file tree to populate certification badges and category imagery from a library of 411 badge assets across six categories.
  • Image processing. A browser canvas pipeline handling alpha compositing, trim-to-content, padding and fit-inside placement.
  • Document generation. A tokenised donor template manipulated at the XML level inside the Office Open XML package.

the prompt is the artifact

The extraction prompt isn't "summarise this PDF." It encodes domain rules: metric values compacted for small display cards with ranges compressed rather than enumerated; certification tags limited to those with matching badge artwork, excluding test report standards that look like certifications but aren't; ordering matched to the spec sheet so output is checkable against source; available badge filenames passed in as context so extracted names resolve to real assets.

And the rule that matters most: anything not stated on the sheet returns an empty string, never an invented value. A generator that hallucinates a lumen output onto a sales deck is worse than no generator.

the parts that were hard

  • A grey box behind every product image. Several hypotheses eliminated. Root cause was alpha channel handling in canvas compositing.
  • Files that triggered the repair prompt on open. Duplicate bold attributes injected into slide XML, fixed by stripping before writing. Only surfaced through hands-on testing with real files — the automated checks passed.
  • Cover typography that broke on long names. A hard-coded font size that happened to work for a three-character product name, replaced with a measure-and-fit helper.
  • Badges assigned to the wrong products. Naive string containment, replaced with word-level scoring.
  • Squashed badge strips. Fixed by passing true computed dimensions so the frame adapts to the content.

the rules I set

  • Absent equals gone. Missing assets are removed, never replaced with placeholder or donor content. A visible gap beats a wrong image on a customer-facing deck.
  • Convention over configuration. Images map to slide positions by filename suffix, so correct naming produces correct output with no user decisions.
  • Spec sheet order preserved, uncapped, so output is checkable against source.
  • Ship the skeleton. The ordering matrix slide ships as a styled empty frame for manual completion rather than delaying release — a known limitation, scheduled for the next version.

what I'd do differently

I should have instrumented it on day one. I built the tool and then went back to measure the thing it replaced. A usage counter and a per-run timer went in this month, but the first months of evidence are gone. On the next build the counter ships with version one.

prompt engineeringserverless functionsedge middleware authllm integrationanti hallucination constraintsoffice open xmlcanvas image pipelinedesign systemsscope discipline

open to marketing operations, analytics and martech roles

Let's talk.

Remote, or Albuquerque and hybrid. Happy to walk through the architecture behind any of this.