Case Study All Work

Salesforce AppExchange

Sixteen years as a trusted development partner for Salesforce’s AppExchange team — building hundreds of web pages, apps, and internal tools, and eventually creating the page-builder systems that let their marketing team ship without me.

  • Role: Independent development contractor — frontend, backend, tooling, deployment, technical strategy
  • Timeline: 2008–2024
  • Team: Embedded with Salesforce designers, project managers, and developers across multiple teams
  • Stack: HTML, CSS, JavaScript, Vue, TypeScript, Laravel, GSAP, PHP, Heroku, Salesforce internal CMS
  • Recognition: Work featured at multiple Dreamforce conferences

The relationship

Salesforce’s AppExchange team needed a reliable development partner who could move fast, work across disciplines, and stay embedded long enough to understand their standards. The relationship started small — my production company, JMX2, was brought in to create animated web banners and landing pages for a single project. The work landed well internally, and our name got passed around to other teams. The AppExchange team became one of our longest and most active clients.

Over time, I became part of their day-to-day workflow. I was in their Slack channels, copied on planning emails, and brought into projects at the earliest stages — before designs were finalized, sometimes before scope was fully defined. For practical purposes, I operated like a full-time team member, but as an independent contractor working across their projects.

The work came with enterprise-level constraints. Every page and app had to match the nuanced visual guidelines established by Salesforce’s design team — there was no room for interpretation that drifted from the brand. Many projects shared similar components — hero layouts, promotional banners, partner profiles — but each had enough variation to resist a simple copy-paste workflow. Pages were built using a custom workflow I created to integrate with Salesforce’s internal content management system, which had its own constraints and publishing process. And hundreds of pages across multiple domains needed to stay current with global privacy laws, requiring quarterly audits and coordinated code updates.

From pages to page-builder tools

After building dozens of pages that reused similar components, I proposed a different approach: instead of building each page by hand, I’d build a set of apps that let the marketing team create and customize pages themselves.

This was a deliberate choice that reduced my own hands-on involvement. But it was the right solution for the client — it let their team ship new page variations on demand while preserving the design standards their designers had established.

The tools included:

  • A collections page builder for curating and displaying AppExchange applications, featuring a custom web component that queried the Salesforce API for live application data
  • Promotional banner and header builders for creating reusable elements used across the site
  • Customer profile page builders for generating partner-facing content

These apps were built with Vue and TypeScript. Page configurations were stored locally using IndexedDB, and could be downloaded, backed up, and shared among Salesforce employees. When the apps were upgraded, the system automatically migrated user data to the new version.

The “What is AppExchange?” scroll animation

One project I particularly enjoyed was a scroll-driven animation explaining the AppExchange program to new users. Built with GSAP and ScrollTrigger, it walked visitors through the value proposition using animation triggered by scroll position. It was featured at Dreamforce on multiple occasions.

Dreamforce kiosk app

Dreamforce projects operated on hard deadlines — conference dates don’t move. For Dreamforce 2019, I built an interactive kiosk app installed on a bank of iPads at the event booth. Attendees answered questions to customize a package of trail mix — choosing their ingredients, generating a personalized label. The app saved each label to cloud storage and sent it to an on-site printer queue, so attendees walked away with their custom trail mix bag in hand. I designed and built both the frontend and backend. The stack was HTML, JavaScript, and Laravel, hosted on Heroku.

Dynamic anniversary pages

For major AppExchange milestone celebrations, I built a Laravel backend that accepted photos of clients taken at Salesforce events. Using that database of photos, we created landing pages with dynamic homepage graphics personalized for every visitor — turning their event archives into a celebration that felt individual rather than generic.

Privacy compliance at scale

Working alongside another Salesforce developer, I maintained the OneTrust cookie compliance integration across hundreds of pages spanning multiple domains. This included a quarterly audit and update cycle: scanning all pages for newly introduced tracking cookies, researching and classifying unfamiliar cookies, and deploying updated compliance code across every site with zero downtime.

Outcome

Over sixteen years, I built hundreds of web pages, apps, and tools for the AppExchange team. The page-builder tools I proposed and built shifted their workflow from requesting custom development for each page to creating new variations independently — which was the point.

The relationship wound down in mid–2024 when Salesforce made a company-wide shift toward relying on in-house teams. By then, the tools and systems I’d built were part of how their team operated.

Reflection

The most important decision I made in this engagement wasn’t technical — it was proposing the page-builder tools knowing they would reduce my own billable work. But keeping the client’s perspective as the primary driver is how a sixteen-year relationship happens in the first place. Building yourself out of a job, when it’s the right thing for the client, is a better outcome than protecting your own hours.

The other lesson is about what long-term embedded work actually teaches you. Sixteen years with one organization means you see how decisions age — which shortcuts create debt, which abstractions hold up, which communication patterns keep projects on track across team turnover. That kind of judgment doesn’t come from any single project. It accumulates.