Skip to content
nm.works

Noah Michaels

email, print, and the web, from Raleigh, NC


« Back to projects

NCGA Variable Data Stationery

A variable data workflow for the NCGA print shop: one legislator record drives locked letterhead and envelope templates, and a merge step lays each recipient’s address and letter body onto that stationery in a single pass.

Project details
RoleSolo designer & developer
Year2026
Built withHTML/CSS/JS, PDF generation, browser-based and basic Python merge tools
DisciplinesVariable Data, Production QA, HTML/CSS
What I can showAn internal print-shop tool, not publicly hosted. Screenshots use fictional legislator data; I can demo it on request.
NCGA letterhead editor with a form sidebar and print-accurate preview of legislator stationery.

Overview

The North Carolina General Assembly print shop produces official stationery for all 170 legislators. Every order follows the same formal brand guidelines, but each member needs their own contact details, committee assignments, and chamber wording. Repeat orders used to rely on a separate file for each member, so small differences in spacing, ink color, and committee data crept in across all 170.

I split the job into two parts: locked templates that keep the stationery consistent, and a merge step that adds each recipient’s address and letter so the whole mailing prints in one pass.

1. StationeryLegislator record into a locked template
2. MergeRecipient address and letter body, one per page
OutputOne flat PDF, printed in one pass

Locked Templates

Each legislator is one record. The template decides what can change and what can’t.

Locked

  • State seal and official masthead
  • Licensed typefaces
  • Page grid and margins
  • Recycling mark

From the record

  • Member name and chamber
  • Office address and phone
  • Committee list
  • Ink color

Visibility toggles hide a section without deleting its data. The browser preview renders in exact inches and points, and the PDF renderer shares the same logic for chamber copy, ink colors, and visible committees, so the preview matches what prints.

Envelopes

Envelopes use the same record with a simpler form. There’s no phone number, committee list, or state seal, matching the production artwork, and the return address is picked from the official legislative buildings instead of typed in.

Envelope editor with a building picker and a print-accurate envelope preview.
The envelope editor: a building picker instead of a free-text address, and no seal. Recipients are added in the merge step.

One-Pass Mail Merge

The personalization comes from a Word mail merge: one letter, or one recipient address, per page. The merge step lays the letterhead or envelope template onto every page of that output, so the stationery, address, and letter print together on the shop’s Xante En/Press digital press.

I built two versions and use whichever the job needs:

  • Browser merge, built into the stationery tool. It runs entirely in the browser, so files never leave the machine.
  • Python pipeline with a terminal UI, for jobs that need deeper checks.

Production QA

The press queue spools slowly when a PDF carries transparency, so both versions output flat PDF 1.3 files. Before anything goes to press:

  • The browser merge blocks the run on a page-size mismatch, which would otherwise stretch the letterhead instead of failing.
  • The Python pipeline flattens the letterhead once at the source instead of across the whole merged file, then runs a deep transparency audit, confirms the page count matches the merge, and checks page dimensions and file size.
  • Each finished job is archived with a manifest of its run options and verification results.

Outcome

Personalized mailings to all 170 members now run in one press pass instead of two. It’s the same model as a personalized email send: a locked template, one data record per recipient, and QA before anything goes out.

Related NCGA work includes the Print Split Calculator, plus identity systems, job tickets, proofing tools, and high-volume production workflows.


I’m open to email marketing, marketing automation, and production roles.
Say hi »

Next project: Print Split Calculator »