Case study 07 · Automation · E-commerce
SMM Panel
Paid Shopify orders go straight to the supplier; statuses, refills and margins are tracked.
- Role
- End-to-end design and development
- Category
- Automation · E-commerce
- Stack
- Laravel 13 · Vue 3 · Webhooks
- Quality
- 33 tests


01 — Context
A Shopify store sells social media visibility services (followers, views, likes), fulfilled by an external supplier through its API. Every paid order had to be matched with the right service, sent by hand with the right link and quantity, then followed until delivery, with no overview of margins or stuck orders.
02 — Problem
Every order had to be matched with the right service, sent by hand, then followed until delivery.
03 — Solution
Shopify reports each paid order through a signed webhook. The app checks the signature, records the order exactly once, finds the supplier service linked to each product and submits the order in the background. Statuses are synced every five minutes; cancellations and refills are handled from the interface, and customers' refill requests are read straight from the mailbox. Anything outside the expected path is flagged "needs attention" and raises an alert.
04 — Features
Signed webhooks
HMAC signature compared in constant time, duplicate webhooks ignored.
Product mappings
Each product or variant linked to a service, with a quantity multiplier and the target link field.
Background submission
Three spaced attempts (30 s, 2 min, 5 min); a supplier refusal is not retried.
Status tracking
Batched sync per supplier every five minutes, with no overlapping runs.
Cancellations and refills
From the order page, or from customer requests received by email.
Dashboard
Revenue, supplier cost, margin, success rate and low-balance alert.
05 — Screenshots

Order detail with sync and refill actions
06 — Architecture
- Shopifyorder paid webhook · HMAC
- Laravel · Inertiamappings · Vue interface
- Job queuessubmit · sync · refill
- Supplier APIorder · status · cancel · refill
- Relational databaseorders · costs · history
The webhook only checks the signature and hands the order to a queue: Shopify gets its response at once, and processing can be replayed without creating duplicates.
Supplier calls go through a shared interface and typed objects; API keys are encrypted in the database and never sent back to the interface.
07 — Technical challenges
Challenge
Never send the same order twice.
Solution
Idempotent webhooks, a single supplier order per item and a supplier ID check before any submission.
Challenge
Tell a temporary outage from a supplier refusal.
Solution
Spaced retries for technical errors; a refusal (balance, invalid link) goes straight to "needs attention" with an email alert.
Challenge
Handle refill requests sent through a form.
Solution
Mailbox reading, field extraction and tolerance of typos in the social network name (Levenshtein distance).
08 — My contribution
- Architecture and data model
- Shopify integration (webhooks, OAuth) and supplier API
- Job queues, scheduler and alerts
- Vue 3 / Inertia admin interface
- Security (signatures, encrypted keys, rate limiting) and tests
09 — Stack
- Backend
- PHP 8.3, Laravel 13, Laravel Queues, Scheduler
- Frontend
- Vue 3, Inertia.js, Tailwind CSS 4
- Integrations
- Shopify (webhooks, OAuth), API fournisseur SMM, IMAP
- Data
- MySQL
- Quality
- PHPUnit
10 — Results
33
passing tests and 101 assertions
5 min
between two supplier status syncs