E-commerce is the easiest white-label service to sell and the easiest to get wrong. Every client wants a store. Few want to understand payment gateways, tax rules or shipping tables.
If you resell Shopify and WooCommerce builds, you are selling trust. A broken checkout on launch day costs your client money and costs you the account.
This blueprint covers how to scope, deliver and support white-label stores, including the integration code that tends to break first.
Shopify or WooCommerce: Choose Per Client
Don't pick a platform for your agency. Pick it for each client's business.
| Factor | Shopify | WooCommerce |
|---|---|---|
| Time to launch | Fast | Moderate |
| Hosting | Included | You or the client manage it |
| Custom logic | Via apps and Functions | Full control via code |
| Transaction cost | Platform fee plus gateway | Gateway only |
| Maintenance load | Low | Higher, needs updates and security |
| Best for | D2C brands, fast launches | Content-heavy stores, complex rules |
| Subscription and B2B | Available through apps | Available through plugins |
A simple rule: if the client wants speed and low maintenance, start with Shopify. If they need unusual pricing logic or own their content workflow, look at WooCommerce.
For stores that outgrow both, a headless build with a Next.js front end is the next step.
The Delivery Package
Sell a clear checklist. Clients should see what they get.
- Store setup: theme, collections, products, navigation.
- Payments: gateways configured and tested in sandbox, then live.
- Shipping and tax: rates, zones, taxes, invoices.
- Integrations: email, analytics, ads pixels, accounting, inventory.
- Migration: product, customer and order import from the old platform.
- Training: a recorded walkthrough for the client's team.
- Handover: credentials, documentation, support plan.
What to exclude in writing
- Product photography and copywriting
- Ongoing ad management
- Third-party app subscriptions
- Custom features not in the scope document
Payments for International Stores
Payment setup is where white-label stores fail quietly. Test it as if real money is at stake, because soon it will be.
| Scenario | Common setup |
|---|---|
| US and EU shoppers | Stripe, PayPal, Apple Pay, Google Pay |
| UK shoppers | Stripe, PayPal, Klarna or similar |
| Middle East shoppers | Local gateway plus card, cash on delivery option |
| India shoppers | Razorpay or Cashfree with UPI, plus cards |
| Multi-currency catalogue | Presentment currency per market, settlement in one account |
Checklist before go-live:
- Run a real low-value transaction in each currency
- Test a refund and a partial refund
- Confirm taxes and shipping show correctly at checkout
- Confirm order emails fire and reach the inbox
- Confirm the payout account matches the legal entity
For a deeper look at Indian gateways, see our Razorpay versus Cashfree versus CCAvenue comparison.
The Webhook That Breaks First
Stores talk to your custom systems through webhooks: new order, refund, stock change. If you don't verify them, anyone can send fake orders into your ERP.
Both Shopify and WooCommerce sign webhook payloads with HMAC-SHA256. Here's a single Next.js route that verifies either one, rejects replays of the same delivery and passes clean events to your queue.
// app/api/webhooks/[platform]/route.ts
import { NextResponse } from "next/server";
import { createHmac, timingSafeEqual } from "node:crypto";
type Platform = "shopify" | "woocommerce";
const config: Record<Platform, { header: string; secret: () => string | undefined; id: string }> = {
shopify: {
header: "x-shopify-hmac-sha256",
secret: () => process.env.SHOPIFY_WEBHOOK_SECRET,
id: "x-shopify-webhook-id",
},
woocommerce: {
header: "x-wc-webhook-signature",
secret: () => process.env.WOOCOMMERCE_WEBHOOK_SECRET,
id: "x-wc-webhook-delivery-id",
},
};
function verify(raw: string, signature: string | null, secret: string): boolean {
if (!signature) return false;
const expected = createHmac("sha256", secret).update(raw, "utf8").digest("base64");
const a = Buffer.from(expected);
const b = Buffer.from(signature);
return a.length === b.length && timingSafeEqual(a, b);
}
// Replace with Redis or a database table in production.
const seen = new Set<string>();
export async function POST(
req: Request,
{ params }: { params: Promise<{ platform: string }> },
) {
const { platform } = await params;
const cfg = config[platform as Platform];
if (!cfg) return NextResponse.json({ error: "Unknown platform" }, { status: 404 });
const secret = cfg.secret();
if (!secret) return NextResponse.json({ error: "Not configured" }, { status: 500 });
// Read the raw body. Parsing first changes the bytes and breaks the signature.
const raw = await req.text();
if (!verify(raw, req.headers.get(cfg.header), secret)) {
return NextResponse.json({ error: "Invalid signature" }, { status: 401 });
}
const deliveryId = req.headers.get(cfg.id);
if (deliveryId) {
if (seen.has(deliveryId)) return NextResponse.json({ ok: true, duplicate: true });
seen.add(deliveryId);
}
const event = JSON.parse(raw);
// Hand off fast. Do slow work (ERP sync, emails) in a queue, then return 200.
await enqueue({ platform, topic: req.headers.get("x-shopify-topic") ?? req.headers.get("x-wc-webhook-topic"), event });
return NextResponse.json({ ok: true });
}
async function enqueue(job: { platform: string; topic: string | null; event: unknown }) {
// Push to your queue (SQS, Upstash, Inngest, database table).
console.log("queued", job.platform, job.topic);
}
Things to note:
- Raw body first. Calling
req.json()before verifying breaks the signature check. - Return 200 quickly. Both platforms retry slow endpoints, which creates duplicates.
- Idempotency matters. The in-memory set above is a placeholder, so use a persistent store.
- Separate secrets per client. One leaked key shouldn't expose every store you run.
Running Many Client Stores Safely
Reselling to multiple clients multiplies risk. Standardise how you work.
- One Shopify Partner account or one hosting account, with a separate store or site for each client
- Staff accounts with the lowest access they need
- A shared password manager with per-client vaults
- Two-factor authentication on every admin login
- A launch checklist applied to every store
Hosting WooCommerce responsibly
- Managed hosting with daily backups
- Automatic security updates for core, with a staging check for plugins
- Limited plugin list, each one justified
- Object caching and a CDN for speed
- Uptime and checkout monitoring
Protecting IP and Client Data
Store data includes customer names, addresses and order history. Treat it as sensitive.
- NDA and data processing terms with the partner before access is granted.
- Access through staff accounts, not shared logins, so you can revoke quickly.
- No customer data in test environments. Use dummy orders.
- Custom code in your Git organisation, with the licence and IP assignment documented.
- Offboarding checklist to remove partner access when the project ends.
Timezone Rhythm for Store Launches
Launches rarely tolerate slow replies. Plan the final week.
- Freeze content and features 5 working days before launch
- Run a full order test the day before
- Schedule the go-live for the client's quiet hours
- Keep a named engineer on call for the first 48 hours
- Post a written status in Slack every few hours on launch day
With a US or UK client and an India-based team, you can run the production switch overnight and have it verified by their morning.
Pricing and Margins
| Service | Pricing model |
|---|---|
| Store setup | Fixed price by package tier |
| Migration | Fixed price per platform and record count |
| Custom features | Fixed scope or time and materials |
| Maintenance | Monthly retainer |
| Conversion work | Retainer or performance-linked fee |
Retainers are where the margin sits. A store needs updates, security patches, new campaigns and fixes every month.
Offer three tiers: care (updates and monitoring), grow (plus small improvements) and scale (plus priority engineering time).
Mistakes That Cost You the Client
- Going live without testing refunds
- Forgetting tax settings for new markets
- Leaving default demo content on the live store
- Skipping redirects when migrating, which wipes out search rankings
- Handing over credentials without a documented process
- Letting plugins pile up until the store slows to a crawl
See also our notes on Shopify setup mistakes that hurt D2C brands and Shopify versus Next.js for commerce.
Scaling the Reselling Model With INDOTREX
You can win e-commerce clients without hiring Shopify developers, plugin specialists or DevOps. That's what a white-label partner is for.
INDOTREX delivers Shopify and WooCommerce and custom e-commerce projects under your brand. We configure payments, shipping and integrations, document the setup and pass the store over in a state your client's team can run. Because we sign NDAs up front and work in your accounts, your client relationship stays yours.
The aim is fewer launch-day fires and less rework. Clean theme code, tested checkouts and written handovers keep your support load low and your retainers profitable.
Planning a store build for a client? Book a free 15-minute engineering strategy call. We'll look at the platform choice, the integrations and a realistic timeline with you.




