Every ZIP code has a National Park neighbor. We made 100,000+ share cards to prove it.
A microsite, a ZIP-code lookup, and a script that turned a public-lands dataset into a personalized card for every visitor. Two weeks, end to end. Built as a passion project at a time America's National Parks needed the attention.
Proximity builds pride.
America's National Parks were under pressure. Funding fights, attention drift, the sense that the system was something people fly to once a decade rather than a place that lives in their backyard. The team had a tool that could change the framing. So we built one.
How do we help people feel a personal connection to the National Park site closest to them?
Not the one they dream of visiting someday. The one already part of their regional story. The one they could photograph next weekend.
When somebody learns that a National Park site is close to them, the relationship changes. It stops being abstract. It becomes local. Personal. Shareable.
That meant the campaign had to do two things at once. Help every visitor discover their closest park, and give them something specific enough to that park that they would want to share it. Generic was the enemy. Specific was the entire point.
Four steps. No account. No friction.
The microsite was built around one user flow: type, find, get, share. No sign-ups, no apps, no education funnel. The shortest possible path from curiosity to a card you can post.
Enter your ZIP
Visitor types five characters into the homepage input. No account, no friction.
Find your park
The lookup matches that ZIP to its closest National Park site. Could be a famous one. Could be one you didn't know existed.
Get your cards
Three formats appear: Story, Portrait, Square. Same park, three social placements. Pre-rendered, served from cloud storage, ready in milliseconds.
Share
Download, copy, post. The visitor becomes the channel. The campaign reaches further than any ad budget could carry it.
One campaign. 100,000 audiences.
Every U.S. ZIP code got its own set of share cards. Same campaign identity, different park, different copy, different feel. Built once. Rendered for everybody.
-
100,000+personalized share cards generated end-to-end
-
3format variants per ZIP: Story, Portrait, Square
-
50states covered, every ZIP code in the U.S. mapped to its closest National Park site
-
1microsite delivering the lookup, results, and download in milliseconds per visit
Data on one side. Infrastructure on the other.
A campaign at this scale runs on two systems. The first matches a visitor to their park. The second delivers the asset. We built both, then wired them so that a single ZIP-code submission resolved to a finished card in milliseconds.
A lookup table from ZIP to park.
Every U.S. ZIP code mapped to its closest National Park site. Park type. State. Filename of the card it would resolve to. The microsite never had to compute. It just looked up.
Edge case caught early: ZIP codes with leading zeroes (Puerto Rico, parts of New England) were being parsed as integers, dropping the zero, breaking the lookup. We coerced every ZIP to a five-character string at the source.
// Lookup record schema { "zip": "00601", "state_name": "Puerto Rico", "closest_park": "Juan Bautista de Anza", "park_type": "National Historic Trail", "expected_file_name": "00601-NPSNeighbor.png" }
Cloud-rendered, statically served.
Asset hosting on Azure Blob Storage, served from assets.dittoditto.io. The microsite never bundled the 100,000+ images; it loaded only the three matching the visitor's ZIP.
Microsite hosting on Azure Static Web Apps, deployed continuously from GitHub. Custom subdomain, React Router for interior pages, static configuration so refreshing /results/00601 didn't 404.
Pre-rendered, not on-demand. Every card existed before any visitor asked for it. The user experience stayed fast because the system never made anyone wait on a render queue.
Five things we learned.
The campaign was a test. Here is what the test returned.
Personalization turns a broad cause into a local story.
"Support National Parks" is broad. "This is your National Park Neighbor" is personal. The shift from cause to story is the unlock.
Data creates emotional entry points.
The data isn't the story. The data helps each person find their way into the story. ZIP code in, identity out.
Microsites are a Ditto delivery layer.
Ditto doesn't have to live as backend asset generation only. It can power complete campaign experiences: lookup, delivery, sharing, and amplification, in one place.
Pre-rendering keeps the experience fast.
Generating cards on demand would have meant render queues, spinners, and abandoned sessions. Pre-rendering them all up front meant the visitor saw their park instantly.
The same model works for any audience with structured data.
Grant recipients. Small business owners. Franchisees. Event attendees. Athletes. Donors. Members. Customers. Employees. Alumni. If you have a list and a record per row, you have a campaign.
Two ideas. Both true. Neither optional.
Stop renting your audience.
Paid media buys reach you don't keep. The campaign ends. The audience disappears. Every dollar spent on borrowed attention is a dollar that didn't build something the audience would carry forward themselves.
Your audience is your distribution channel.
When an asset is made specifically for somebody, they don't just consume it. They share it. The campaign reaches further than the budget would have carried it, and the brand owns the work that got the reach.
If you have a list, you have a campaign.
Tell us your audience and the data you already hold about them. We will show you what we would build, on what timeline, at what cost.
Start a Ditto Campaign