AW

FutureShirts Internal ERP / IMS

Full-Time

Entertainment Merchandise Operations Platform

Full Stack Developer · FutureShirts, Nashville, TN|September 2022 – September 2025

Contributed extensively to an internal ERP / IMS for a full-service entertainment merchandise company. Reported to the SVP of IT.

  • Carrier API integration (USPS, FedEx, DHL) via EZPost with webhook event handling + Google Maps Geocoding for address validation
  • Shopify GraphQL integrations across 55+ artist storefronts (live product / order data)
  • Codebase-wide Vue 2 → 3 Composition API migration
  • Reporting dashboards for finance + operations teams
  • Supporting role on inVia Robotics warehouse automation (daily monitoring)
  • Domain-Driven Design Laravel (action classes / events / repository pattern); sprint-planning input + Cypress mentoring of a junior dev
  • Laravel
  • PHP
  • Vue.js
  • Inertia.js
  • React
  • Next.js
  • GraphQL
  • Shopify
  • Google Maps API
  • MySQL
  • Cypress
  • Pest/PHPUnit
  • CI/CD
200K+
Annual Shipments
55+
Storefronts
1.4M+
Monthly Fans
500%
Productivity Gain
Architecture

Domain-Driven Design + a codebase Vue migration

The work that wasn't visible to anyone outside the dev team but shaped every feature shipped on top of it.

Domain-Driven Design

Business operations modeled as discrete action classes — one class, one verb, one return shape. Cross-feature side effects went through domain events so the carrier-API path didn't have to know what the reporting path cared about.

  • Action classes for business operations — single-responsibility, testable in isolation
  • Domain events for cross-feature communication — listeners registered per concern, no implicit coupling
  • Repository pattern over raw Eloquent in the hot paths (shipment, order sync, GraphQL fan-out)
  • Controllers thin: validate → dispatch action → return view / JSON

Codebase Vue 2 → 3 Composition API migration

Inherited a Vue 2 Options API codebase. Migrated component-by-component to Vue 3 + Composition API across the project's lifetime, shipping in chunks so each merge stayed reviewable and the app stayed deployable the whole time.

  • Per-component conversion: data/methods/computed → ref / reactive / computed under setup()
  • Standardized on TypeScript-friendly patterns so future hires didn't need to relearn the conventions
  • Behind Inertia.js — the modern monolith pattern, no separate SPA build pipeline
Integrations

Shipping, storefronts, and live-event POS

Three external surfaces feeding one internal ERP.

Carrier APIs + address validation

Multi-carrier shipping (USPS, FedEx, DHL) routed through EZPost as the single integration surface. Inbound webhook events updated order state; outbound calls were rate-limited and retry-safe.

  • EZPost as the carrier-API abstraction layer — one shape, three downstream providers
  • Webhook handlers for tracking-event updates (in transit / delivered / exception)
  • Google Maps Geocoding API for shipping-address validation + zone lookups before label generation

Shopify Admin GraphQL across 55+ artist storefronts

Each artist had their own Shopify store. The internal ERP needed live product, inventory, and order data across the entire fleet — couldn't poll REST without rate-limiting everyone. GraphQL Admin API with batched queries and paginated cursors was the right shape.

  • Live product / order / inventory queries against the Admin GraphQL API
  • Batched queries to stay inside Shopify's leaky-bucket rate limits
  • 55+ storefronts feeding a single internal view

atVenu POS sync for tour merchandise

Tour shows ran live-event POS through atVenu. Sales data fed back into the ERP nightly so finance and tour managers saw the same numbers without manually exporting CSVs.

  • Scheduled sync into the internal data model
  • Reconciled against Shopify online-sale data for unified per-artist reporting
Reporting & internal tooling

Numbers the finance and operations teams trusted

Dashboards built for the people closing the books and the people shipping the boxes.

  • Finance dashboards — revenue, refunds, fees, per-artist splits
  • Operations dashboards — pick rate, ship rate, inventory aging, returns
  • On-demand pulls for tour managers and artist managers
  • Exportable to CSV / PDF for the finance close cycle
Process & growth

Sprint input, mentoring, and staying current

Three years on the same team is enough to do more than execute tickets.

  • Jira sprint-planning input — proposed scope, surfaced dependencies, sized stories before sprint kickoff (not just executing the planned work)
  • Cypress test-suite mentoring of a junior dev — pairing on selectors, fixtures, and CI integration until they could own the test gate
  • Code reviews + daily standups on a hybrid team (in-office + remote)
  • Laracon attendee — kept current on the Laravel ecosystem outside the day job

Want to talk through any of this on a call?

Happy to walk through the DDD architecture, the Vue migration approach, or any of the integration surfaces in more detail.

Get In Touch