If you sell digital goods across multiple marketplaces, Carousell, Shopify, and Shopee, you already know the real cost isn't writing one good listing. It's writing the same listing four different ways, in four different formats, without making a mistake that gets a listing rejected or, worse, misleads a buyer.
Here's the workflow I landed on using Claude, including a fix for a genuinely broken file that Excel itself couldn't open.
The starting point: one product, four destinations
I was listing a batch of digital game codes (Xbox keys, Steam keys, a Rockstar Games Launcher code) sourced from Eneba and resold on Carousell, cross-posted to Shopify, and also uploaded in bulk to Shopee. Each platform wants the content shaped differently:
- Carousell: a punchy title, an emoji-friendly description, a redemption walkthrough buyers can screenshot
- Shopify: HTML description, product category taxonomy, vendor/type metadata, inventory and shipping flags
- Shopee: a rigid mass-upload Excel template with dozens of columns, mandatory/conditional fields, and per-channel delivery toggles
Claude handled all three from one source of truth, and the tricky part wasn't the copywriting. It was getting the Shopee template to open at all.
The Excel file that Excel couldn't open
Shopee's mass upload template downloads as a normal-looking .xlsx, but mine had a corrupted worksheet view setting. Every tool I tried, openpyxl, pandas, markitdown, failed on the same error:
ValueError: Value must be one of {'bottomRight', 'topLeft', 'topRight', 'bottomLeft'}The cause: Shopee's own export had written activePane="bottom_left" (with an underscore) into three of the worksheet XML files, instead of the valid bottomLeft. That's an invalid enum value per the OOXML spec, and it's strict enough to block every standard parser, even though Excel itself sometimes tolerates it silently.
The fix was to treat the .xlsx as what it actually is: a zip archive of XML files.
unzip -o template.xlsx -d extracted/ grep -rl "activePane" extracted/xl/worksheets/ sed -i 's/activePane="bottom_left"/activePane="bottomLeft"/' extracted/xl/worksheets/sheet*.xml cd extracted && zip -r -X ../fixed.xlsx . -x ".*"
Once patched, the file loaded cleanly in openpyxl, and every downstream step became scriptable.
Reading the template's actual structure
Shopee's basic mass upload template isn't a simple header-and-rows sheet. It has:
-
Row 1: internal field keys (
ps_product_name,ps_price, etc.), not meant for humans - Row 3: the human-readable column headers
- Row 4: whether each field is Mandatory, Optional, or Conditional Mandatory
- Rows 5 to 6: inline guidance and validation rules for each column
- Row 7 onward: actual data
Getting this wrong (for example, writing data into row 1 instead of row 7) is an easy mistake if you're filling the template by hand under deadline pressure. Having Claude parse the header rows first, then write only into the data rows, removed that whole category of error.
Matching the product's category to the delivery model
Digital codes have to be flagged correctly in Shopee's channel columns, since Shopee separates shipping channels (Doorstep Delivery, Pick Lockers, Collection Points, SPX Express Lockers) from a dedicated Virtual Goods, delivery through app/emails channel. For a digital code:
- All physical shipping channels: Off
- Virtual Goods channel: On
- Weight and dimensions: still technically mandatory fields even though nothing ships, so a nominal placeholder (0.01kg, 1x1x1cm) satisfies the schema without implying real shipping
Miss this and Shopee may either reject the listing or (worse) calculate shipping fees for a product that will never touch a courier.
Where Claude helped most
The genuinely time-consuming parts of this workflow weren't the copywriting, they were:
- Diagnosing a file format bug that three separate Python libraries failed on identically, then fixing it at the raw XML level instead of giving up and asking for a re-export
- Reverse-engineering an undocumented template structure (which rows are metadata vs. data) before writing anything, to avoid corrupting the file
- Keeping platform-specific compliance rules straight (Shopee's channel toggles, Shopify's taxonomy categories, character limits for titles and descriptions) across three very different target formats, from a single product description
If you're doing something similar, the pattern worth stealing isn't "ask an AI to write a product description." It's giving the AI the actual broken file, the actual template, and the actual platform's rules, and having it work at the file-format level when the friendly tools fail.
A caveat worth stating plainly
None of this replaces checking your own store's category IDs, choosing your own price points, or verifying a redemption flow actually works before a buyer complains. Automating the mechanical, repetitive part of cross-posting frees up the time to get those judgment calls right, it doesn't replace making them.
Selling digital codes across Carousell, Shopify, and Shopee? The same workflow (Carousell export parsing, Shopify GraphQL product creation, and Shopee template automation) generalizes to any digital or physical product catalog you're maintaining across multiple marketplaces.