FutureShirts Internal ERP / IMS
Entertainment Merchandise Operations Platform
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
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
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
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
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.