Role: Full-Stack Developer · DeinConsultant Timeline: 2024 – 2026 Stack: React, TypeScript, PHP/Laravel, Go, REST APIs Links: Website · Seller2Go App
Overview
Seller2Go Web is the admin dashboard for Seller2Go merchants. It's where they buy licenses, connect their stores, track shipments, generate product descriptions and manage settings. It shares its backend with the Seller2Go mobile app, so both need to show the same data.
I worked across the React frontend and the backend, adding new features and keeping the dashboard consistent with the mobile app. I also led the migration of the backend from Go microservices to PHP/Laravel.
What I built
Shipment Tracker
- Lets merchants track containers and individual packages in one place
- Includes shipping cost calculations per shipment and container
Notification Control
- Settings for merchants to choose which events trigger email and mobile push notifications
- Email bundling: instead of one email per event, updates are collected and sent as a single digest every 24 hours via a scheduled Laravel job
Dashboard
- Fixed incorrect percentage-change figures in the sales statistics
- Aligned the web and mobile dashboards so both show identical numbers and behave the same way
Migration of Go microservices to PHP/Laravel
- Rewrote the full DDD/CQRS Go codebase as a Laravel application following Laravel's standard MVC structure (routes, controllers, Eloquent models)
- One REST API shared by the React dashboard and the mobile app
- Kept the existing API contracts, so the dashboard needed no changes during the migration. See Seller2Go App →
Challenges
Keeping two dashboards in sync The web and mobile dashboards showed different percentage changes for the same period. Each client had been computing the comparison window locally, so rounding and timezone boundaries diverged. I moved the calculation to the backend so both clients display one shared result. Merchants now see the same numbers wherever they check.
Email bundling Merchants with busy stores were getting an email for every event. Bundling them into a daily digest meant storing pending notifications, grouping them per merchant, and sending once every 24 hours, while urgent alerts still go out immediately via push.
Moving from CQRS in Go to MVC in Laravel The Go services followed Domain-Driven Design with CQRS, which split every feature into separate command and query paths. CQRS was new to me, so I first had to understand how each flow moved through those paths before I could migrate it. In Laravel I rebuilt the same logic on the framework's standard MVC structure, which keeps the backend simpler and familiar to any Laravel developer.
