Drew Poling

Content without a center

@da_poling| (1y ago)

Distributed organizations have a coordination problem that compounds quietly over time.

At a university the size of Penn State, dozens of sites serve different audiences: admissions, academic colleges, research institutes, and administrative units, each maintained by teams with different priorities and different levels of technical sophistication. The challenge is not that any individual site is poorly built. It is that without shared infrastructure, consistency becomes manual effort.

Mandated institutional elements that need to appear across every property have no reliable delivery mechanism. Each team implements what it can with what it has. Implementations diverge gradually. Nobody has a complete picture of what is deployed until something forces visibility.

This is what happens when frontend systems scale faster than the backend layer supporting them.

A federated API as coordination infrastructure

The federated API addressed that directly. A unified REST layer aggregated content across Contentful spaces, shared brand components, university-wide announcements, program information, and mandated institutional elements, and exposed it through a stable schema every site could consume without duplicating or manually syncing data.

Content that needed to remain consistent became a single API call returning the same payload to every tenant simultaneously. The coordination problem did not disappear. It moved from something every team solved independently to something infrastructure solved once.

Federated API layer: unified backend serving shared content and institutional payloads to many tenant frontends.
Federated API layer: unified backend serving shared content and institutional payloads to many tenant frontends.

Enrollment forms as a reliability pipeline

Enrollment form integration required the same reframe. Forms collecting prospective student information are high-stakes in ways most UI surfaces are not. Data has to arrive reliably, be attributed correctly, and connect cleanly to CRM systems enrollment teams depend on.

When that pipeline is fragmented, gaps are hard to see from inside any one team. Conversion data becomes incomplete. Attribution becomes ambiguous. The signal needed for decisions exists, but is noisy enough to be unreliable.

Connecting the form pipeline to Slate, standardized React form components, validation, normalized payloads, secure API submission, and environment-aware configuration for sandbox and production, created a traceable path from user action to CRM record to conversion attribution. Instrumentation that supports reliable enrollment decisions requires that path to exist first.

Analytics by deterministic identity

The analytics architecture came from how React already handles identity. Props hydrate components with context. A component knows what it is, where it sits in the tree, and what data it renders. That context already exists at render time. The only question is whether analytics can read it.

I built deterministic component IDs from context: component type, position, page, and hierarchy. Given a URL and a component, you can predict the tracking ID without manual instrumentation. GTM integrations, click events, impression tracking, and form engagement all tied to stable semantic identifiers instead of brittle DOM selectors that fail when markup changes.

Where reusability actually matters

The deeper finding is about reusability boundaries. The frontend is the only layer users actually experience. Consistency in user experience is therefore a function of frontend consistency, not backend uniformity for its own sake.

The backend should evolve with content strategy, site architecture, and organizational change. Forcing backend consistency at the expense of flexibility solves the wrong problem. The frontend has to be agnostic enough that lower-layer changes propagate everywhere without coordinated effort across every consuming team.

Users only see the appearance of centralization. Making that appearance reliable is the frontend's job. The backend exists to support it, not to mirror it.