2.65x
Recurring payment revenue
+54%
Successful donation revenue
+91%
Film viewing
About the WWJD? Documentary
WWJD? (formerly Christspiracy) is a documentary from the creators of Seaspiracy, Cowspiracy, and What the Health. Seaspiracy reached No. 1 on Netflix in multiple countries.
Engagement
From July 2025 to January 2026, I embedded with WWJD? as the product and technical lead for wwjdfilm.com. In a forward-deployed capacity, I led the initiative end to end across strategy, stakeholder communication, product design, engineering, release, and measurement, while client stakeholders set organizational priorities and approved scope.
The context: Viewing and donations depended on the same platform
WWJD? distributed the documentary independently through wwjdfilm.com. The platform had to do two jobs at once: deliver the film and extended interviews, and connect each viewer's 48-hour viewing window to a model supporting guest donations, custom amounts, and one-time or recurring Pay It Forward contributions.
The engagement began with an unsolicited growth proposal I brought to WWJD? after examining the live viewing and donation journey. Client stakeholders agreed to pursue it alongside their other priorities and requested work.
Across the combined release, successful donation revenue per 1,000 visitors rose 54% while film viewing rose 91%. This case study examines how formalizing Browse, Watch, and Donate as journey domains, and mapping the context they exchanged, preserved viewer intent while allowing the live platform to keep changing.
The problem: Visitors could not see what they could watch at the start
Before the formal engagement, I reconciled analytics and payment records, reviewed support inquiries, gathered context from the team, and mapped the path from arrival to viewing and donation.
Visitors who reached the film donated at nearly 10× the rate of those who did not. Three parts of the journey made reaching it harder:
The viewing offer was hard to understand
The film, extended interviews, 48-hour free-viewing window, and what a donation unlocked only came together after visitors had entered a fixed, multi-step flow.
The flow ignored why someone arrived
Direct visits, campaign links, shared content, and return visits all entered the same sequence, even when someone had already chosen a film, interview, or support action.
Free viewing and donation unlocks were easy to miss
Visitors had to read closely to understand what was free, what support unlocked, and when viewing expired. That information was not surfaced clearly where those choices were made.
The hypothesis: Show the viewing offer before asking for a donation
The growth bet was to make the viewing offer easier to reach, not push harder on payment. I expected three changes to increase viewing and support:
Make the viewing offer visible first
If visitors could see the film, extended interviews, 48-hour free-viewing window, and what a contribution would unlock before sign-in or Pay It Forward, more of them could reach the content they came for.
Preserve intent through required steps
If the film or extended interview someone chose remained intact through identity, access, and payment, more viewers could complete those required steps without losing the intent that brought them there.
Reveal access and support at the point of choice
If current access, remaining free-viewing time, and what a donation would unlock appeared at the point of choice, more viewers could complete the viewing or support action that matched their intent.
The constraint: Change the platform without stopping it
The work began with a live legacy platform and no prior technical team available for handoff. Changes to the platform had to be made while it continued serving viewers and processing donations, without disrupting existing subscriptions, viewing entitlements, payment history, CRM identities, or campaign links.
Feature requests, campaign launches, the Christspiracy-to-WWJD? rebrand, and objectives from film directors, investors, and the internal team continued in parallel. A long invisible rewrite would have blocked work the organization had already planned, while changing the wrong dependency too early could disrupt active viewers or donations.
The approach: Keep decisions visible and delivery moving
I kept the growth roadmap moving while accommodating the client's other priorities. The backlog, timing, and tradeoffs stayed visible, so we could adjust scope or sequence together when priorities changed. Between agreed checkpoints, I carried delivery forward.
Align stakeholders around the opportunity early
The diagnosis showed where the journey created friction, but stakeholders still needed to decide whether addressing it warranted investment. Using a reconciled revenue-per-visitor baseline, research, and industry benchmarks, I built a model that projected roughly 55% more monthly donation revenue at existing traffic. It gave stakeholders a shared basis for weighing the opportunity against the investment required, while remaining a forecast rather than a measured result.
Working prototypes made the product changes behind the projection tangible. Across the viewing and donation funnels, stakeholders could compare the existing journey with proposed sign-in, payment, and access flows. The Pay It Forward example below is one of several prototypes, focused on donation frequency, amount selection, and payment states.
Make review accessible without slowing delivery
The working product became the main way stakeholders reviewed delivery. A fully functional preview environment, sandboxed from production, let film directors, investors, and the internal team use the journey end to end. They could sign in, receive viewing access, watch the film, and complete test donations without affecting live viewers, real donations, or production records.
Recorded walkthroughs and short summaries complemented the sandbox, giving the different groups involved an accessible way to review the work. Together, these formats created consistent checkpoints while reducing separate status reporting and keeping implementation moving.
Protect growth capacity with clear boundaries
We agreed a planned capacity split that protected most of the engagement for strategic growth while reserving room for client priorities, support, and urgent issues. It established a shared boundary between growth work and other requests while giving me room to manage day-to-day priorities independently.
At regular check-ins, we returned to the split to decide where new requests belonged and weigh them against the plan. If one changed the balance, I showed which milestone, scope item, or delivery date would move, and we decided whether to bring the request forward or keep existing commitments in place.
Let stakeholders plan around the growth roadmap
As part of due diligence, I mapped the rebrand, campaigns, attribution, data, and platform priorities against work already planned across the organization. I grouped related changes into phases so stakeholders could plan around the sequence and see how each priority connected to the growth roadmap.
For each priority, I recommended the most practical point in the roadmap and explained what moving it earlier would change, including displaced commitments or technical debt from temporary work that would require later consolidation. Stakeholders could bring additional context or urgency, and we adjusted scope and sequence together.
The work: Build around clear journey domains
A context map aligned Browse, Watch, and Donate
I formalized Browse, Watch, and Donate as three journey domains. Each owned a distinct viewer decision and passed only the context the others needed. Mapping those responsibilities and relationships gave the team a shared context map for deciding where behavior belonged, protecting handoffs, and evaluating changes across the whole journey.
Browse
Visitors could browse the viewing offer and select a title before identity or support was required.
Watch
Once viewers decided to watch, their selected title stayed intact through identity, access, and playback.
Donate
Once viewers decided to donate, their intent carried through amount selection, checkout, and billing, and the resulting access returned to Browse and Watch.
The film lived in Watch. Browse passed the title a viewer selected, while Donate passed the access their donation unlocked. The domains remained distinct, and the context they exchanged kept the viewer's choices intact across each required step.
Preserve intent across the viewer journey
Across Browse, Watch, and Donate, the context map showed which choices and access state needed to persist as viewers moved through the journey. The next three changes applied that model to choosing what to watch, deciding whether to unlock more, and authenticating when the chosen action required it.
Browse made the offer visible before asking for commitment
Browse had previously been treated largely as the home page. Under the new operating model, its responsibility expanded into a public product surface: help people understand the viewing offer and choose what they wanted before asking them to identify themselves, watch, or support.
Visitors could see the film, extended interviews, their free-viewing window, and what further support would unlock before sign-in. Instead of reading through a fixed sequence to infer the offer, they could choose the part of the product that matched their intent.
Direct entries to Browse rose 367%, and 88% more visitors reached Browse or a film route. More people were encountering the product as a visible offer, including the film, extended interviews, and available access, instead of inferring it from a fixed funnel. That wider product reach was matched deeper in the journey: full-film viewing per 1,000 visitors rose 91% across the same release. Browse made viewing intent explicit, giving Watch a selected title to preserve through identity, access, and playback.
Watch made access and support clear at the point of choice
Once viewers could see the offer, Watch had to determine what each viewer could access now and what a contribution would unlock. I surfaced that context in Browse beside the selected title: remaining free-viewing time, current access, and the additional viewing options support would open.
A viewer with 720p access could continue into Watch. Someone who wanted 4K or an extended interview could see the relevant donation unlock and enter Donate with that outcome already in mind. Bringing Watch's access state into Browse kept the viewer's intent anchored to the selected title. Viewers entered Watch or Donate only to complete a decision they had already made, allowing Watch to remain focused on access and playback and Donate on completing support.

By showing Watch's access state and what a donation would unlock around the selected title, viewers reached Donate with a clearer reason to contribute. Guest checkout starts fell 84%, suggesting fewer visitors entered payment without clear intent, while completed donations rose 48%, showing that more viewers ultimately followed through. Donate could focus on completing a choice already made, and identity could follow the same principle: ask for it only when Watch or Donate required it.
Authentication followed intent without interrupting it
With a title and outcome already chosen, authentication could become a purposeful transition rather than a disconnected requirement. I moved identity closer to the action that required it, so viewers understood why it was necessary and what completing it would enable.
For viewers ready to identify in Browse, Google One Tap completed the step in place. When Watch or Donate required authentication, route-aware return behavior preserved the selected title and page state through sign-in.
Preserving the selected outcome through sign-in made authentication a purposeful transition rather than a detour. Signed-in or identified visitors rose 63%, and continuation into Browse or Watch improved 45% relative, showing that more viewers carried their intent beyond the step. Among visitors who donated within one session, the median path through identification and payment was 9s faster. The same intent-preserving model could then adapt when a campaign had already established the viewer's purpose.
Clear boundaries absorbed change without fragmenting the product
Once the journey domains could preserve intent for viewers, their boundaries also gave the organization a safer way to change the live product. Two brands could run in parallel, campaigns could carry known intent directly to the film, and marketing could measure viewing, support, and reported purchase outcomes without reopening the responsibilities of Browse, Watch, or Donate.
Run two brands without duplicating the product
WWJD? and Christspiracy ran in parallel through one multi-brand runtime. Each could change its routes, naming, and presentation while Browse, Watch, Donate, identity, access, billing, and attribution remained shared. The team could evolve either brand without duplicating the journey domains or maintaining parallel implementations.


WWJD? and Christspiracy used distinct routes, naming, and presentation while sharing the same product underneath. Carry campaign intent directly to the film
PETA's holiday campaign had already introduced the film and its free-access period. Its preset carried that context into Watch, allowing viewers to reach the film without repeating the same introduction in a separate funnel.
In the small same-session cohort that reached a film, PETA-attributed viewers reached the film in less than half the time, a 56% reduction. The audience arrived pre-qualified, so the result is directional, but it demonstrates the fit of the model: known campaign intent could change the route while Watch retained responsibility for access and playback.
The campaign banner guided viewers to the free-access window and its Watch action. Connect campaign spend to viewing and support
The journey domains gave the marketing team a direct line from campaign spend through viewing, support, and reported purchases. Browse, Watch, and Donate recorded the viewer decisions they owned, and PostHog consolidated those signals into one operating view. Direct connections to canonical identity and payment data supported a BI layer for deeper campaign and revenue analysis, while server-side Meta CAPI returned registration, checkout, and purchase outcomes to campaign reporting.
Purchase value and ROAS became visible in Meta, allowing marketing to manage spend against reported purchases rather than traffic alone. For the Christspiracy campaign group, cost per reported purchase was 78% lower after the CAPI transition. Canonical payment records remained the source of truth, while the same measurement model served both brands and could be inherited by future campaigns without creating another attribution path.
Together, the rebrand, campaign, and measurement work made change a capability of the live platform: brand presentation, campaign entry, and reporting could evolve without splitting the product or interrupting viewing and donations. The same discipline could then strengthen the foundation beneath the journey.
Domain discipline turned each change into platform capacity
Growth work can improve a funnel while leaving the product harder to maintain. I treated that as a failure condition. Every visitor-facing change also had to make the next one easier to deliver, safer to verify, or simpler to operate.
I used shared standards and stable boundaries so improvements to the experience, infrastructure, and operating visibility could accumulate instead of remaining isolated fixes.
Let quality improvements propagate
The film was the experience viewers came for, so I strengthened Watch with adaptive streaming, protected playback, clearer loading and recovery states, and saved viewing progress.
Player improvements added scrub-preview thumbnails alongside clearer playback controls. I carried the same discipline through shared components, which brought responsive behavior, keyboard navigation, focus management, and ARIA relationships into the rebuilt routes. Later surfaces could inherit a stronger baseline instead of repairing the same interactions independently.
Shared components carried consistent navigation, controls, and interaction patterns across the rebuilt interface. Replace implementations without reopening the product
Stable contracts kept the journey model intact while the systems underneath it changed. I could introduce static rendering and caching, retire legacy dependencies that added unnecessary operating costs, change CRM systems, and move billing lifecycle management toward provider-owned flows without redefining the responsibilities of Browse, Watch, or Donate.
The platform could evolve one boundary at a time instead of reorganizing the product around every new provider or implementation.
Keep the platform trustworthy and observable
Change also had to preserve the integrity of identity and access. I used staged migrations to align donor, payment, subscription, and CRM records around a canonical identity model without forcing ambiguous matches. Anonymous activity remained separate until a defensible connection existed, and each supporter retained their highest earned access. This gave later changes a more stable basis for access and reporting.
Documented event definitions and PostHog dashboards made the journey queryable through one operating view. Direct connections to canonical identity and payment data supported a deeper BI layer, reducing the need to reconstruct routine product and revenue questions from separate exports.
Across the combined release, Browse LCP improved 34%, film-route LCP improved 50%, and dead clicks on film routes fell 80%. These release-level measurements do not isolate any one implementation, but they show the product becoming faster and more reliable as its foundation became easier to change, verify, and operate. Future work could inherit the same components, contracts, and operating knowledge instead of rebuilding them.
The conclusion: Preserve intent and let the platform carry the complexity
Successful donation revenue per 1,000 visitors rose 54% across the combined release. Film viewing per 1,000 visitors rose 91% alongside it, and among donors, the share who watched after supporting was 25% higher relative. Together, those measurements describe a healthier relationship between viewing and support: support grew with viewing rather than at its expense.
The strategic lesson was not to push harder at checkout. It was to make the viewing offer clear, preserve intent through each required step, and let the platform carry the complexity between viewing and support. Stable journey domains allowed brand presentation, campaign entry, measurement, and underlying implementations to change without fragmenting the product. The work turned the original constraint into a lasting capability: the team could keep changing the live platform without interrupting viewing or donations.
Shaleen Shah
President, Ahimsa Foundation
You've brought the project along quite far, and have done so in a very professional and very detailed and thorough manner. So really appreciate all of your work.
Credits
Key collaborators
Selected product and operating systems
The platform combined the systems serving viewers with the tools used to design, measure, release, and support it.
Experience and playback
Next.js, React, TypeScript, Tailwind CSS, Radix, shadcn/ui, and Bunny.net supported a reusable multi-brand interface, shared interaction standards, and protected film delivery.
Identity, access, and support
Clerk, Neon, PostgreSQL, Drizzle, Stripe, and PayPal connected identity and earned access with donations, billing, and subscription state.
Measurement and attribution
PostHog, dbt, SQL, Python, and Meta CAPI connected product behavior and payment outcomes to reusable analysis, operating visibility, and campaign reporting.
Design and alignment
Figma and FigJam supported interface design, workshops, stakeholder review, and communication across the engagement.
Delivery and operations
GitHub, Vercel, and Linear connected source control, CI/CD, releases, support intake, triage, and prioritization.
Keep exploring

