a system that extracts, catalogs, and generates marketing content for a large fintech company's website.
a content intelligence system for square's marketing site: extract what the site says, catalog it, generate new pages from verified content only.
designed and built layers 1–3 (extraction, canonical model, generation) and the gap dashboard; used ai as a query partner before designing.
a working prototype adopted as the review surface for the content team; layer 4 (personalization) is scoped. metrics under nda.
the marketing site had hundreds of pages across regions and locales. individual pages were well written, but there was no machine-readable model of what the site actually said: no documented rules for structure, no record of which entities appeared where, no consistent description of products across locales. without that, there was no way to author at the system level, and no way to generate a new page without starting from scratch.
instead of writing pages one at a time, i built a system that extracts what the site already says, organizes it into reusable content entities (features, benefits, ctas, pricing, testimonials), and lets an llm compose new pages from those entities. content authoring becomes data-driven instead of ad hoc.
URLs
│
▼
[ crawler + llm extractor ]
│ structured entities
▼
┌──────────┐
│ postgres │
└────┬─────┘
├────────────────┐
▼ ▼
DASHBOARD (L2) GENERATION (L3)
entity browser scaffold(product,
heatmaps audience, locale)
product dna │
knowledge graph ▼
┌──────┬────────┬───────┬─────┐
│ hero │features│pricing│ cta │
└──────┴────────┴───────┴─────┘the dashboard prototype has a toggle-able annotation layer. on, open design questions appear in red next to the data they refer to ("should pricing be its own entity type or a property of a product?" sits right on the pricing section). off, the dashboard is clean. the prototype was both a working tool and the design-review surface, instead of keeping feedback in a separate document.
pages crawled 3,060
entities 8,412
products 18
building blocks
feature 2,841 · benefit 1,209
cta 890 · product 412
pricing 318 · testimonial 167
statistic 94
locale coverage en-US en-GB fr-FR ja-JP
translation gaps es-ES fr-CA ja-JP en-AU
graph: 847 nodes · 312 contains
94 co-occurs · 41 cross-pageunderstand the data first; the design follows from its shape. the part i'm most proud of is the separation between layers.
sitemapper ↗ — a personal project with the same approach: crawl a site, extract entities, build a queryable model. full source.
this work was done at block, inc. (square). the case study covers process and design thinking only; metrics, screenshots and proprietary details are omitted per nda. more available on request, under the right agreement.