Back to Projects

B.Nye Design Approval System

Two-Phase Creative Workflow with SLA Tracking

ReactTypeScriptTailwindReact FlowEthical UX / SLA-Driven Workflow

Amazon's largest line of business told us our creative approval process was too slow and too hard to manage. Instead of pushing back, I took action — I built a two-phase approval system from scratch to streamline the process, sequencing static and animated reviews with business-hours-aware SLA tracking. This wasn't in my job description. I built it because every day a creative sat in approval limbo was a day of lost revenue from the flight. The system was rolled out company-wide and became a core part of the white-glove service that retains enterprise clients.

2

Workflow Phases

4

Platform Adapters

48/24h

SLA Engine

3

Environments

Problem

Amazon's largest line of business flagged creative approvals as a bottleneck — too slow, too hard to manage. Static and animated reviews ran in parallel with no dependency chain. Designers were building animated demos for creatives that hadn't even passed static review. SLA deadlines ignored business hours. Every day a creative sat in approval limbo was a day of lost revenue from the campaign flight. This wasn't a technology problem — it was a process problem that no one in my role was expected to solve.

Solution

I took action anyway. I built a two-phase approval system from scratch: static review first (48h SLA), animated review only after static approval (24h SLA per revision). SLA calculations respect business hours (M-F, 9am-6pm EST). Priority grouping by business impact ensures the team works on revenue-critical creatives first. The system turned a client complaint into a competitive advantage — it was rolled out company-wide and became a core part of the white-glove service model that retains enterprise accounts.

Architecture

┌─────────────┐     ┌──────────────┐     ┌─────────────┐
│   Content    │────▶│   Approval    │────▶│  Integration │
│   Director   │     │   Workflow    │     │   Manager    │
│  (Sonnet)    │     │  (8 states)   │     │  (Sonnet)    │
└─────────────┘     └──────┬───────┘     └──────┬──────┘
                           │                     │
                    ┌──────▼───────┐     ┌──────▼──────┐
                    │  Compliance   │     │  Platform    │
                    │    Agent      │     │  Adapters    │
                    │  (Haiku)      │     │  A │ B │ C   │
                    └──────────────┘     └─────────────┘
                           │                     │
                    ┌──────▼───────┐     ┌──────▼──────┐
                    │   Protocol    │     │  Pipeline    │
                    │   Engine      │     │  Analyst     │
                    │  (XML gen)    │     │  (Haiku)     │
                    └──────────────┘     └─────────────┘

System Components

Service

Approval Workflow

8-state machine: Draft → Review → Approved → Integrated → Active

AI Agent

Content Director

Claude Sonnet — generates optimized content from briefs

AI Agent

Compliance Agent

Claude Haiku — validates against platform specs and brand safety

AI Agent

Integration Manager

Claude Sonnet — orchestrates multi-platform uploads and audit lifecycle

AI Agent

Pipeline Analyst

Claude Haiku — fee stack analysis and path optimization

Integration

Platform Adapters

A/B/C/D — abstract base class with per-platform spec validation

Service

XML Protocol Engine

Generates spec-compliant XML with compliance wrapping and measurement tags

Data Store

PostgreSQL + RLS

6 tables with row-level security, audit trail on every state transition

Key Engineering

8-State Approval Workflow

Every transition creates an audit event with reviewer, timestamp, and notes. Invalid transitions are rejected at the state machine level.

class ApprovalWorkflow:
    TRANSITIONS = {
        "DRAFT": ["PENDING_REVIEW"],
        "PENDING_REVIEW": ["APPROVED", "REVISION_REQUESTED"],
        "REVISION_REQUESTED": ["PENDING_REVIEW"],
        "APPROVED": ["INTEGRATED"],
        "INTEGRATED": ["ACTIVE", "PAUSED"],
        "ACTIVE": ["PAUSED", "ARCHIVED"],
        "PAUSED": ["ACTIVE", "ARCHIVED"],
    }

    async def transition(self, item_id, to_status, reviewer, notes):
        current = await self.get_status(item_id)
        if to_status not in self.TRANSITIONS.get(current, []):
            raise InvalidTransition(f"{current} → {to_status}")
        await self.db.insert_event(item_id, current, to_status, reviewer, notes)
        return await self.db.update_status(item_id, to_status)

Platform Adapter Pattern

Abstract base class with per-platform implementations. Each adapter validates specs, formats payloads, and handles audit status polling independently.

class PlatformAdapter:
    name: str

    async def upload(self, asset_url, protocol_url, metadata) -> UploadResult:
        """Validate specs, format payload, submit to platform."""
        ...

    async def check_audit(self, item_id: str) -> AuditStatus:
        """Poll platform for review status."""
        ...

# Platform A — strict specs, certified supply chain
class PlatformA(PlatformAdapter):
    name = "Platform A"
    MAX_DURATION = 30
    MIN_RESOLUTION = (1920, 1080)

22 MCP Tools

Each agent accesses the system through a structured MCP tool server — approval actions, content database queries, protocol generation, and pipeline analysis all exposed as typed tools.

Compliance Automation

The Compliance Agent validates every submission against platform-specific requirements, measurement vendor configuration, and brand safety rules before allowing state transitions.