← all articles

How to keep product listings consistent across several brand stores

If you run more than one brand store, you will have seen the drift. A spec gets fixed in one store and stays wrong in two others. One store says “500ml” and another says “500 ml”. A price change goes live on Shopee on Monday and reaches Lazada on Thursday. None of these is a disaster alone, but together they cause returns, bad reviews and a lot of wasted time hunting for which store has the old version.

This tutorial is for operators who run legitimately separate brand stores. I mean different brands, each with its own registered business details and its own seller account in its own name. It is not for anyone trying to run clones of the same shop to multiply reach. The outcome is one master product sheet that is the single source of truth, a naming convention, an image library, and a repeatable bulk upload routine for each platform. I also cover a small script that catches mismatches before you upload.

One caveat before we start. I am not affiliated with Shopee, Lazada or TikTok Shop, and their rules change. Where I describe a rule, I say which market it applies to and when I checked. Where I could not verify something, I say so and point you to the official seller centre.

What you need

  • a seller account per brand, each registered legitimately under the correct business or individual details for that brand. Do not share or borrow identities between stores
  • a spreadsheet tool: Google Sheets (free) or Excel. I use Google Sheets so two people can edit without file conflicts
  • a folder structure for images, in Google Drive or on a local disk with a backup
  • Python 3.10 or newer (free) if you want to run the validation script in step 6
  • the bulk upload templates downloaded from each platform’s seller centre, one per category you sell in
  • GTINs or barcodes for products that need them. In Singapore these come from GS1 Singapore, and the GS1 GTIN standard page explains the format
  • about half a day for setup, then roughly 30 minutes a week for maintenance, based on my own catalogue sizes. Yours will vary

Costs: Google Sheets and Python are free. GS1 membership is paid and the fee depends on how many barcodes you need, so check the current price on the GS1 Singapore site. Everything else is time.

Step by step

1. Read each platform’s rules on duplicate listings and multiple shops

Action: before building anything, open each platform’s seller centre and read the policies on duplicate listings, multiple shops per seller, and prohibited practices. The entry points are Shopee Singapore Seller Centre, Lazada Seller Center and TikTok Shop Seller Center. Policy pages sit behind the seller login and move around, so I will not quote exact wording or page paths.

Expected output: a short note per platform, dated, saying what it allows. As of October 2026 my reading is that all three platforms restrict spammy duplicate listings inside a single shop, and all three tie a shop to a verified seller identity. Several platforms limit or forbid one person running multiple shops without a legitimate separate-brand basis. I could not verify the exact current limits per market, so check yours. Singapore, Malaysia and the Philippines can differ.

If it breaks: if you cannot tell whether your setup is allowed, ask seller support in writing and keep the reply. Do not guess. If a platform says no to a second store for you, that is the answer, and the fix is not a workaround.

2. Build the master product sheet

Action: create one Google Sheet with one row per variant (one row per size or colour, not per product). Columns I use:

  • internal_sku: your own code, never changes
  • brand: which store this row belongs to
  • product_family: groups variants together
  • title_core: the factual name without keywords or brand
  • brand_name, model, size, colour, material
  • gtin: if you have one
  • weight_g, length_cm, width_cm, height_cm
  • cost_sgd, base_price_sgd
  • image_folder: path to this SKU’s images
  • description_facts: bullet facts that must not differ between stores
  • status: draft, live, paused

Expected output: every sellable variant appears exactly once, with no blank weight or dimension cells. Weight and dimensions matter because shipping fee calculations depend on them. My fulfilment write-up, fulfilment options for Shopee, Lazada and TikTok Shop explained, covers why.

If it breaks: if you have thousands of existing listings and cannot fill the sheet by hand, export each store’s current catalogue from the seller centre and paste it into a staging tab. Then map columns across. Expect a day of cleanup.

3. Write a naming convention and keep it in one place

Action: add a “rules” tab to the sheet. Mine says:

  • title pattern: Brand + product type + key spec + variant, in that order
  • units: always “500ml”, never “500 ml” or “0.5L”
  • capitalisation: Title Case for brand and model, sentence case for the rest
  • no promotional words in titles (no “hot sale”, “best price”), since platforms generally discourage them. Check the current title rules in each seller centre
  • SKU format: BRAND3-FAMILY-VARIANT, for example ABC-MUG-BLU

Then generate titles with a formula so nobody types them by hand:

=TRIM(B2 & " " & C2 & " " & F2 & " " & G2)

Expected output: a computed title column that follows the pattern for every row. Different brands can have a different tone in descriptions, but the facts and the title structure stay identical.

If it breaks: if a platform has a tighter title character limit than your pattern produces, add a second computed column per platform with a shortened version. Do not edit the master title.

4. Set up the image library

Action: one folder per internal_sku, with fixed file names:

images/
  ABC-MUG-BLU/
    01_main_white.jpg
    02_angle.jpg
    03_scale.jpg
    04_detail.jpg

Keep the originals at the highest resolution you have and export to each platform’s requirements. Those requirements (minimum size, aspect ratio, background rules for the main image) are in each seller centre and change, so look them up when you export rather than trusting my memory or an old blog post.

Expected output: every SKU has a main image plus at least three supporting images, in the same order everywhere.

If it breaks: if a platform rejects a main image, the usual causes are text overlays, watermarks or the wrong background. Re-export from the original instead of re-editing the rejected file.

Use only photos you own or have licence to use. Brand stores selling the same physical product should share the same honest photos, not photos lifted from another seller.

5. Download and map each platform’s bulk upload template

Action: from each seller centre, download the mass upload template for your category. Open it and note the column headers. Each platform’s template differs, and each category within a platform differs too. Create one “export” tab per store in your master sheet whose headers match the template exactly, with formulas pulling from the master tab.

Expected output: an export tab per store where each cell is a formula, not typed text. Changing a spec in the master updates every export tab.

If it breaks: if an upload fails with a category attribute error, the category’s required attributes changed. Re-download a fresh template. Old templates are a common cause of rejected uploads.

6. Validate before you upload

Action: export each tab as CSV and run a script that catches the usual errors. Here is the one I use:

import csv, sys, re

REQUIRED = ["internal_sku", "title", "price", "weight_g", "image_main"]
UNIT_BAD = re.compile(r"\d\s+(ml|g|kg|cm|mm)\b", re.I)

def check(path):
    problems = []
    seen = set()
    with open(path, newline="", encoding="utf-8") as f:
        for n, row in enumerate(csv.DictReader(f), start=2):
            for col in REQUIRED:
                if not (row.get(col) or "").strip():
                    problems.append(f"{path}:{n} missing {col}")
            sku = row.get("internal_sku", "")
            if sku in seen:
                problems.append(f"{path}:{n} duplicate sku {sku}")
            seen.add(sku)
            if UNIT_BAD.search(row.get("title", "")):
                problems.append(f"{path}:{n} unit spacing in title")
    return problems

if __name__ == "__main__":
    out = [p for path in sys.argv[1:] for p in check(path)]
    print("\n".join(out) or "clean")
    sys.exit(1 if out else 0)

Run it with:

python validate.py store_a.csv store_b.csv store_c.csv

Expected output: clean, or a list of file and line numbers to fix.

If it breaks: if the script reports missing columns on every row, your export headers do not match the names in REQUIRED. Rename them in the script or the sheet, whichever is easier.

7. Upload per store and log the result

Action: upload each store’s file through its own seller centre, logged in as that brand’s own account. Then record the date, store, file name and any rejections in a “log” tab.

Expected output: listings go live or into review. Rejections come with a reason from the platform.

If it breaks: read the rejection message and fix the master sheet, not just the single listing. If you only patch the live listing, the next export will bring the error back.

8. Handle price and stock changes from the master

Action: price changes also start in the master sheet. If you charge GST, keep the price logic clear in the sheet. My GST basics for Singapore marketplace sellers post covers the practical side, and IRAS is the primary source. This is not legal or tax advice, so check your own registration position with IRAS or an accountant.

Expected output: one place to change a price, then one export and one update per store.

If it breaks: if a store has a platform-run promotion locked in, you cannot change that price until the campaign ends. Note it in the log so the stores do not look inconsistent for no reason.

Common pitfalls

  • editing live listings directly: it feels faster, but it breaks the master sheet as source of truth within a week. I have done this and then spent an evening reconciling three stores
  • using stale templates: platforms update category attributes. A template from six months ago can fail or silently drop fields
  • treating the stores as one shop: separate brands should look separate in their copy, images and branding. Identical text across brand stores can look like duplicate listings, so check each platform’s duplicate policy and write distinct descriptions around the same facts
  • inconsistent units and sizes: “500ml” in one store and “0.5L” in another makes shoppers distrust the product. It also confuses filters
  • skipping the log: without a record of what was uploaded when, you cannot tell whether a mismatch is a data error or a stale upload

Scaling this

At 10x (around 10 to 50 SKUs per store, two or three stores), the sheet and the validation script are enough. One person can run the weekly routine in under an hour.

At 100x (hundreds of SKUs, four or more stores), the sheet starts to slow down and edit collisions appear. Move the master into a proper database or a tool built for product information, and keep the same column logic. Generate the export files with a script rather than formulas. Add checks for image presence and GTIN format. Platform APIs for listings exist, but access and terms differ by platform and market, and I have not verified current availability for each, so check the developer pages in each seller centre.

At 1000x (thousands of SKUs), you need ownership. Someone is responsible for the data, someone for the images, and there is a change process with review. Mistakes at this size are expensive, since one bad export can touch thousands of listings. Test every export on a small batch first.

Whatever the size, the principle is the same: the master is the truth and the stores are copies.

Where to go next

Written by Xavier Fok

disclosure: this article may contain affiliate links. if you buy through them we may earn a commission at no extra cost to you. verdicts are independent of payouts. last reviewed by Xavier Fok on 2026-10-21.

free download
Multi-store setup checklist for Shopee, Lazada and TikTok Shop

What each platform allows for running more than one shop, and what to set up per store, as of September 2026. Leave your email and we will also tell you when we publish a new guide, a few times a month at most.

from the team behind this site
A dedicated real phone for each store you run

cloudf.one hosts real Android phones in Singapore, each on its own persistent Singapore mobile IP, and you open them from the browser. Useful if you run Singapore stores and want one phone per store or brand instead of a drawer of handsets.

see how cloudf.one works →
read on
More from the desk

Store operations, platform rules, fees and pricing for Shopee, Lazada and TikTok Shop sellers, with dates on anything that can change.

browse all articles →