Sally Beauty's marketing and ecommerce brain, which I actively design, build, and maintain from inside the team. It knows the brand, reads the market, the customers, and the results, and it has started proposing campaigns on its own.


Marketing OS
Dashboard grid overview
Every app, one screen
Scroll. It fills the mat, then travels the frame
Every piece of it lived somewhere different.
Competitive intel lived in someone's browser tabs, brand guidelines in a PDF nobody opened, campaign briefs in email threads, and assets on shared drives with names that drifted every quarter. None of those tools talked to each other, and the volume made every gap worse.
The scale is thousands of SKUs across hair color, hair care, styling, and professional tools, 2,000+ stores with regional variation, and dozens of campaigns running at once across digital, email, social, and in-store.
Competitive Intel
It was all manual. Someone tracked Ulta's promotions in a spreadsheet, someone else watched Sephora's social on their phone, and Target Beauty's pricing changes came up in meetings as anecdotes. The information was all there, spread across people and formats, and nobody had pulled it together.
So every planning cycle started from scratch. The same questions came up again, competitors kept surprising the team, and by the time an opportunity was clear it was too late to act on it.
Campaign Briefs
Campaign briefs were Word files. They went out to a distribution list, got edited in parallel, and within days nobody was sure which version was current. The brief that reached design rarely matched the one that left strategy.
Assets got made against old direction, revisions piled up, and a lot of the production timeline went to getting everyone back on the same page.
The Shared Drive
Asset management meant shared drives. Thousands of images, organized by whoever uploaded them, named however that person remembered to name them, tagged inconsistently or not at all. Finding the right file for a channel meant knowing where someone had put it, and that knowledge left when they did.
The cost was hours: searching, recreating, reformatting, and double-checking files that should have been a click away.

Competitor social channels, pricing shifts and category trends too. Every trend that comes in gets a "Sally's Take": an AI-written read that checks the signal against the brand positioning, the active briefs, and the internal knowledge base, and says whether it's worth acting on.
Each Take comes with a one-click path to a new brief. That click is where the rest of the pipeline starts.
Claude Opus: The Strategist
Claude runs the chat and gets the reasoning jobs: turning competitive signals into recommendations, drafting the campaign brief from raw intel, writing copy in the brand voice.
Prompt caching keeps it fast. The brand guidelines, tone rules, and competitive positioning are the same on every call, so they load from cache instead of being processed again each time.
Gemini 2.5 Pro: The Librarian
Gemini reads Sally's internal knowledge base on the first message, so every conversation opens with the brand guidelines, campaign history, product catalogs, regional variations, and performance data already loaded, before anyone has typed a word.
That takes a million-token context window, which Gemini has. The whole institutional memory of the marketing team fits in a session, and nobody has to hunt through a shared drive or ask a colleague for the file.
Perplexity Sonar Pro: The Researcher
Live web search for competitive intelligence, trends, and current market data. It triggers on its own when a competitor comes up: mention Ulta, Sephora, or Target Beauty and it pulls current pricing, promotions, social activity, and press coverage into the conversation without a separate search.
A question that used to mean a research request and a two-week turnaround gets answered in the same conversation where the strategy is being written.


A competitor launches something, and the feed writes Sally's Take on it.


An AI system trained on Sally's complete brand architecture: voice guidelines, visual standards, competitive positioning, campaign history, performance data, and a rule set that shapes how it thinks before it responds.
Brand Brain ingests and indexes the whole corpus, market research included.
Claude: Long-Form Writing
The long documents come from Claude, the strategy memos and competitive analyses. It takes in the whole context (brand guidelines, performance history, competitive data) and writes the document.
These documents go to leadership, so they have to ship without heavy editing.
Gemini: The Visual Layer
Gemini handles the visual side, the part a text-only model can't see: product imagery analysis, sorting social content into categories, clustering trends across competitor activity. When a competitor changes how it merchandises, Gemini picks up the pattern across store imagery.
Perplexity: Live Data
Perplexity is the live layer: industry news, competitor announcements, shifts in social sentiment, regulatory changes, pulled from the web as they happen.



The AI works out the strategy and writes the brief. The team approves it.


The newest app in the rail is called Campaigns, and nobody types into it. On a schedule, Jim reads four live feeds at once: the market scan, the daily signals, what customers are saying, and what people are searching for. He grounds all of it against the product catalog and the asset library, then proposes three to five plays. Each one names the signal that triggered it, argues the reasoning, and arrives with the campaign already drafted: billboard, email, and SMS, rendered with real photography and real SKUs.
Approve writes real production requests into the same queue the humans use, one per channel, so a play the team likes becomes work in one click. Pass dismisses it with a reason and Jim learns from that too. A second model, given fresh context, critiques every play before a person sees it, and its verdict rides along with the proposal so a human decides. The first live scan proposed a competitive intercept, a seasonal demand play built on real search volume, and a play built around a customer's own words.
Four months ago this was a spreadsheet and a group chat.
The two things the team actually needed from it, tagging and search, didn't work well, so I built this one from the ground up.
AI tags every image on upload, with nobody cataloging anything by hand, and search ranks across those tags, the titles, the brands, and the AI descriptions. The right asset comes up in seconds.
AI Auto-Tagging
Claude looks at every uploaded image and returns a description, tags, product category, dominant colors, campaign suggestions, and a confidence score. It tells lifestyle shots from product shots, and any asset can be re-tagged with one click, on its own or in a batch.
AI tags and manual tags are tracked separately, so there is a record of what it tagged and what a person corrected, and the corrections improve the next round of tagging.
AI Studio Photography
Two passes through OpenAI's GPT-Image-2. The first strips the background to pure white and leaves the product alone. The second lights it like a studio shot, working from a reference photograph: white cyclorama sweep with a warm-to-cool gradient, directional key light with specular highlights, fill, rim, contact shadow.
The team uses it for product pages and social.
Search Architecture
Postgres full-text search with tsvector and websearch_to_tsquery, GIN indexes on the FTS column and the AI-tags JSONB. Relevance is weighted: full text at 2.0x, tag match at 1.5x, title at 1.0x, brand at 0.9x, AI description at 0.8x.
Search runs as you type with a 300ms debounce, infinite scroll at 24 per page, and an ILIKE fallback across every text field.



Vendor Upload Portal
A public upload form with no login. The vendor enters name, email, company, product name, SKU, brand, asset type, and confirms usage rights. An admin review dashboard updates live over Supabase Realtime.
Approve pushes the asset into the library and kicks off AI tagging. Reject sends the vendor a reason.
Workflow & Collections
Campaign templates with configurable stages, and jobs with a destination, priority, due date, and assignee. Review is per asset, so you can approve some and reject others in the same job, each with its own note. Status runs Draft, In Review, Approved, Sent, Completed.
Collections have names, descriptions, and cover images. Batch-select from the library, drag to reorder, and toggle public or private with a shareable link that needs no login.
Embedded Architecture
It runs inside the portal in an iframe with its own sidebar stripped, syncing routes over postMessage, with search and filters passed through as URL params.
On upload it reads dimensions, DPI, and color space, writes a compressed JPEG for fast loading, and makes the ecommerce PNG at 1000x1500 or 1500x1000 on white. PDFs get a branded thumbnail.

Asset Hub
Full interface overview
AI tagging and search
Scroll. It fills the mat, then travels the frame

All of them built inside the marketing team. Click a card and the tool loads inline, with no onboarding, no separate login, no IT ticket. The marketplace grows every month as the team finds the next thing worth automating.
Each tool is its own app, hosted on its own and loaded in an iframe. The tool list is a JavaScript array, so registering a new one takes minutes, and a Streamlit app, a Next.js dashboard, and a static PDF generator all register the same way. It's designed so anyone on the team can build a tool, deploy it, and share it without engineering support.
Shelf Talker Generator
Upload the creative brief spreadsheet and download print-ready 9-up PDFs. It handles every Sally promotion format, Spanish and bilingual included, sets Founders Grotesk at the right weights, wraps text on real font metrics, and is pixel-accurate to the 3.667" card. That used to be hours of InDesign layout every promo cycle.
Campaign Performance Analyzer
Upload the campaign data export and get dashboards back: ROAS, conversion funnels, channel attribution. Strategists pull their own numbers mid-cycle instead of waiting on the analytics team for a deck.
Exec Deck Builder
Builds the executive deck from the campaign brief: pulls the brand template, fills in the key metrics, exports a PPTX. Half a day of a designer's time, down to one click and three minutes.
Image Compliance Scanner
Scans creative against the brand guidelines before it ships: logo placement, color accuracy, fonts, legal disclaimers. The problems it catches used to turn up in legal review, weeks after production wrapped.
Social Copy Generator
Writes the social copy from the campaign brief in the brand voice, character-counted and formatted for Instagram, TikTok, Facebook, and X, hashtags included. It takes about a minute to turn one brief into four channels.
SKU Lookup & Enrichment
Paste a list of SKUs and get the product data back: images, descriptions, pricing, brand, category, ready to drop into a brief, a deck, or an email template. It pulls from Sally's product database, so the numbers are current and nobody is working off an old spreadsheet.
Email Template Previewer
Upload HTML or pick from the template library and see how it renders in Gmail, Outlook, Apple Mail, and on mobile. It replaces the send-test-check-fix loop that used to add days to every email campaign.
Promo Calendar Sync
Import the promo calendars from Excel or Google Sheets and get one consolidated view back, with the conflicts flagged: overlapping promotions, channel collisions, regional scheduling gaps. It's the one place to check what's running where and when.
Competitor Ad Tracker
Captures competitor advertising across digital channels (display ads, promoted social posts, email campaigns) and files it into a searchable library. The team can look up what Ulta, Sephora, and Target ran last quarter without anyone taking screenshots.
Six applications built by one person in four months, in daily use, and Sally's IT team is now moving them onto the company's own cloud.
I designed, engineered, and deployed every one of them, working alongside AI tools throughout, and I still maintain them from inside the team that uses them.
Everything shares data, context, and a design language. A signal the scanner catches in the morning can be a proposed campaign by the afternoon and a production request by the end of the day, with the same brand voice and the same product data at every step, out to 2,000+ stores.
The marketing team ships thousands of assets a month through it, and the people at Sally have a name for it: the marketing and ecommerce brain.
Product Design
Engineering (AI-assisted)
AI Strategy
Design System
Gemini
Perplexity
OpenAI
Python
Next.js
Supabase + pgvector
Railway
Vercel
Claude Code