You open a second location, then a third. Suddenly half your day is spent driving between sites to check stock, waiting for sales reports sent as photos of a cash book, and guessing why one branch is busy while another is quiet. Each location reports in its own format, late, and the numbers never quite reconcile.
Multi-branch problems are almost always the same: data out of sync, inconsistent ways of working, and an owner who has lost the overall picture. This guide shows how to fix that in stages: what to centralize, how to standardize operations, how to handle stock across locations, access control, branch KPIs, and a database design for developers building the system in Laravel.
Decide What Head Office Controls
| Decision | Head office | Branch | Why |
|---|---|---|---|
| Product list and prices | Yes | No | Customers expect the same price everywhere |
| Company-wide promotions | Yes | No | Avoids conflicting offers |
| Small local promotions | Approves | Proposes | Branches know their neighborhood |
| Stock ordering | Limits and suppliers | Quantities | Branches know daily demand |
| Staff rosters | Ground rules | Yes | Each site has different peaks |
| SOPs and service standards | Yes | Feedback | Quality must be consistent |
Write this split down and share it with every branch manager. Many head-office-versus-branch conflicts come from authority that was never made explicit.
Step 1: One System, One Source of Truth
Every branch should record directly into the same system rather than sending summaries. A cloud system lets you see sales and stock for all locations from one dashboard without visiting. The POS at each branch should write to the central database or sync within minutes. If you are new to POS systems, start with how a POS system works. Also plan for connectivity: choose a system that keeps working offline and syncs later, or keep a mobile hotspot as backup.
Step 2: Standardize SOPs
Branches that underperform often differ in how they work, not where they are. Use the same SOPs for opening and closing, sales, receiving goods, stock counts, and complaints. Train new managers at your best-performing branch, and run site visits with the same checklist everywhere.
Step 3: Stock and Inter-Branch Transfers
- Track stock per branch, not as one total. Owners can see the sum, but every movement belongs to a location.
- Use transfer documents: the sending branch creates a transfer, stock drops on dispatch, and the receiving branch confirms on arrival. Discrepancies show up immediately.
- Set minimum stock per branch so the system warns before items run out.
- Schedule stock counts, for example monthly for everything and weekly for high-value items.
Step 4: Role- and Branch-Based Access
A cashier at branch A does not need branch B's sales, and branch managers should not change head-office prices. Keep roles simple: cashier, branch manager, warehouse admin, owner or area manager. Each user is tied to one or more branches.
Step 5: Track the Same KPIs Everywhere
- Sales per day and per trading hour.
- Average transaction value.
- Gross margin per branch.
- Stock shrinkage as a percentage of stock value.
- Labor cost relative to sales.
- Customer complaints.
Compare each branch with its own history, not only with other branches. A quieter location may always trail, but a declining trend still needs attention.
Example: A Weekly Oversight Rhythm
Suppose you run three bakery-supply stores. A simple rhythm that avoids daily driving:
- Every morning (10 minutes): open the dashboard and check yesterday's sales per branch, cash differences, and items below minimum stock.
- Monday: a 30-minute video call with all branch managers to review last week's numbers, problems, and this week's plan.
- Wednesday: approve inter-branch transfers and supplier orders.
- Rotating visits: one branch per week using the same checklist, so each site is visited at least monthly.
With this rhythm, travel time drops sharply and visits become focused, because you already know what to look at before you arrive. Branch managers also know exactly when they will be asked about their numbers, which tends to keep records up to date.
For Developers: A Multi-Branch Database Design
The most common pattern is a single database with a branch_id column on every transactional table, plus a userโbranch pivot. It is closely related to multi-tenancy, covered in building a multi-tenant SaaS with Laravel.
Schema::create('branches', function (Blueprint $table) {
$table->id();
$table->string('code', 10)->unique();
$table->string('name');
$table->timestamps();
});
Schema::create('branch_stocks', function (Blueprint $table) {
$table->foreignId('branch_id')->constrained();
$table->foreignId('product_id')->constrained();
$table->integer('qty')->default(0);
$table->integer('min_qty')->default(0);
$table->primary(['branch_id', 'product_id']);
});
To make sure branch users never see other branches' data, use a global scope so filtering does not depend on every developer remembering it:
namespace App\Models\Concerns;
use Illuminate\Database\Eloquent\Builder;
trait BelongsToBranch
{
protected static function bootBelongsToBranch(): void
{
static::addGlobalScope('branch', function (Builder $q) {
$user = auth()->user();
if ($user && ! $user->isOwner()) {
$q->whereIn($q->getModel()->getTable() . '.branch_id',
$user->branches()->pluck('branches.id'));
}
});
static::creating(function ($model) {
$model->branch_id ??= session('active_branch_id');
});
}
}
Apply the trait to models such as Sale and StockTransfer. Add composite indexes that start with branch_id, such as (branch_id, created_at), since almost every report filters by branch and date; see optimizing Eloquent query performance. For transfers, decrement source stock and write the transfer record inside one DB::transaction with lockForUpdate() so concurrent sales cannot corrupt the numbers.
Common Mistakes and Fixes
- Each branch on a different app. Consolidation becomes impossible. Standardize before opening the next site.
- Stock transfers agreed by chat. Goods move without a trace. Require transfer documents with receipt confirmation.
- Branch managers with full access. Restrict by role, especially prices and deleting transactions.
- Reports read only when something breaks. Schedule a weekly review per branch.
- Expanding before the first branch is systemized. Problems multiply with every new site.
Multi-Branch Readiness Checklist
- Head office and branch authority is written down.
- All branches use the same system and database.
- An offline or backup-connectivity plan exists.
- Core SOPs are identical and trained at every site.
- Stock is tracked per branch with transfer documents.
- Access is limited by role and branch.
- KPIs with shared definitions are on the dashboard.
- Site visits and reviews are scheduled.
The number of branches is not the measure of success; how well each one can be controlled is. Get the system right at two locations, and the tenth becomes far easier.