Note: Client names and some details have been changed to protect confidentiality. The technical challenges and solutions are real.
In 2020, a client was running their custom jewelry business on spreadsheets and memory. Orders came through Shopify. Production was tracked on paper. Nobody knew exactly what was in inventory without walking to the workshop and counting.
Five years later, they handle 3x the order volume with the same team. Here's what we built and why it works.
The Problem That Standard Software Couldn't Solve
Their workflow isn't typical e-commerce:
- Customer orders custom jewelry (ring with specific stone, engraving, etc.)
- Designer creates or modifies design based on customization
- Customer approves design
- Workshop produces piece
- Quality check
- Ready for pickup/shipping
No off-the-shelf inventory system handles this. WMS software assumes you ship existing products. ERP systems cost $100K+ and require 6 months of implementation.
The Data Model
The foundation is understanding what they actually track.
class Order extends Model
{
protected $casts = [
'status' => OrderStatus::class,
'customizations' => 'array',
'customer_approved_at' => 'datetime',
'production_started_at' => 'datetime',
];
public function transitionTo(OrderStatus $newStatus): void
{
if (!$this->canTransitionTo($newStatus)) {
throw new InvalidStatusTransition($this->status, $newStatus);
}
DB::transaction(function () use ($newStatus) {
$this->status = $newStatus;
$this->save();
ProductionStage::create([
'order_id' => $this->id,
'status' => $newStatus,
'user_id' => auth()->id(),
]);
event(new OrderStatusChanged($this));
});
}
}
This isn't complex code, but it encodes their actual workflow. The canTransitionTo method prevents impossible state changes—you can't mark something "ready" if it never went through production.
Customer Notifications
This was the feature that changed their business. Customers now know exactly where their piece is:
class NotifyCustomerOfStatusChange implements ShouldQueue
{
public function handle(): void
{
$message = match($this->order->status) {
OrderStatus::DESIGN_CONSULTATION =>
"Our designer is working on your piece. We'll share designs soon.",
OrderStatus::AWAITING_APPROVAL =>
"Your design is ready for review!",
OrderStatus::IN_PRODUCTION =>
"Your piece is now in production.",
OrderStatus::READY =>
"Your piece is ready for pickup!",
default => null,
};
// Send via customer's preferred channel (WhatsApp, email, SMS)
}
}
Customers used to call asking "where's my order?" constantly. Now they get proactive updates. This alone saves 10+ hours per week.
What We Learned
1. Start With Workflow, Not Features
We spent the first two weeks shadowing staff, understanding exactly how orders moved through their process. The software mirrors reality rather than forcing them to adapt.
2. Audit Everything
Every change is logged. This has saved us countless times debugging production issues.
3. Customer Communication Is Underrated
The status notifications are the most-praised feature. Customers feel informed. Staff spend less time answering calls.
4. Build for Your Actual Volume
Early on, I over-engineered for scale we didn't need. Five years in, the simple patterns work fine.
The Results
Since launching in 2020:
- 70% reduction in order processing time — Staff aren't hunting for information
- 3x more custom orders handled — Same team, bigger capacity
- 15+ hours/week saved — No more status update calls
- 99.5% inventory accuracy — Everything is tracked
The system cost less than a year of typical SaaS subscription costs and has run for five years with minimal maintenance.
When Custom Makes Sense
Build custom when:
- Your workflow doesn't fit standard software
- Integration requirements are complex
- The ROI of efficiency gains is clear
- You have a long-term relationship with a developer
Use off-the-shelf when:
- Standard workflows work for you
- Budget is very constrained
- Time to implement is critical
Want to Discuss a Custom Inventory System?
We'd love to hear about your workflow and honestly say if custom development makes sense — or if an existing solution is enough.
Eyal Gantz
Founder & Lead Developer
Expert in e-commerce development and business automation with 10+ years of experience building custom technology solutions.
Free Strategy Call
Want to implement something similar for your business? Let's talk about how we can help you achieve results.
Start a Conversation