Import and export products with Excel
Export products on any plan. Lite and Premium also let you import new products or update existing products from an .xlsx workbook. Start with Download template on the Products page, or export your current products and edit the file.
Keep the template layout
Use exactly Products and Links, with one table per sheet: ProductsTable and LinksTable, starting at A1. Keep every downloaded header in its original order, including optional columns. Do not add sheets, totals, formulas or notes outside the tables. Add rows inside each table. Empty rows are ignored. Colours, widths and tab order may be changed.
Use an unprotected .xlsx file, up to 10 MiB uploaded, 100 MiB expanded and 2,000 products. The existing limits of 16 topics, 32 links and four links per topic still apply. Account product limits also apply to new products.
Products / ProductsTable
| Column | What to enter |
|---|---|
| ProductKey | Required file-local key, for example coffee250. Use the same key in Links. |
| GTIN | Required text. A valid GTIN-8, GTIN-12, GTIN-13 or GTIN-14. Keep leading zeroes. |
| Name | Required product display name, up to 200 characters. |
| Resolver | Optional HTTPS resolver origin without a path, query or fragment. Blank uses the configured CodePersist resolver; export leaves it blank for that resolver. A custom domain must belong to your workspace and be active. Keep an existing product's custom resolver; leaving it blank does not migrate the product. |
| ShowLinkChoices | true shows a page where visitors choose among the product's links after scanning. false or blank redirects to the selected default link. |
| QrErrorCorrection | L, M, Q or H. Leave blank to use M. Export leaves this cell blank when the saved value is M. |
| XDimensionMm | QR module size in millimetres, 0.396–0.990 in 0.001 steps. Leave blank to use 0.495. Export leaves this cell blank when the saved value is 0.495. |
Links / LinksTable
| Column | What to enter |
|---|---|
| ProductKey | Required. Exact ProductKey from Products. |
| TopicKey | Choose a topic offered by the editor: allergens, ingredients, nutrition, instructions, certification, safety, quick-start, tutorials, handling-storage, recall-status, registration, service, support or verification-service. Topics are inferred from links. Leave this cell blank on exactly one row per product to identify its required product page. |
| Title | Required customer-facing link title, up to 200 characters. |
| Url | Required absolute public HTTP or HTTPS destination, up to 2,048 characters, without embedded credentials. |
| Languages | Optional language codes separated by semicolons, for example en;fr-CA;es. Use two-letter languages, optionally followed by a two-letter region. Leave blank for product-page; its saved language metadata is preserved. |
| IsDefault | true selects this link as the product's default. Use true on at most one row per product; multiple defaults are rejected. false or blank leaves the row unselected. If no link is selected, the product page is used. |
| LinkId | Optional saved link identifier supplied by export. Keep it when editing an existing link; leave it blank for every new link, including links on a new product. Each supplied ID must belong to this product and occur only once. The product-page ID stays on the product-page row. Blank or whitespace-only cells always create new links. |
Worked example — use the same product key on every sheet
These example rows describe one coffee product, its required product page, and English and French ingredients links. Keep GTIN as Text: 09506000134352. A blank Resolver uses the configured CodePersist resolver. Enter your active custom domain only when you want to use it. Replace the destination URLs with your public URLs. The template contains no example products to delete.
Products
| ProductKey | GTIN | Name | Resolver | ShowLinkChoices | QrErrorCorrection | XDimensionMm |
|---|---|---|---|---|---|---|
| coffee250 | 09506000134352 | Ground coffee 250g | false |
Links
| ProductKey | TopicKey | Title | Url | Languages | IsDefault | LinkId |
|---|---|---|---|---|---|---|
| coffee250 | Product page | https://brand.example/coffee | true | |||
| coffee250 | ingredients | Ingredients | https://brand.example/coffee/ingredients/en-es | en;es | ||
| coffee250 | ingredients | Ingrédients | https://brand.example/coffee/ingredients/fr | fr |
Multiple languages and cell values
Separate language codes with semicolons in Languages, for example en;fr-CA;es. Spaces around codes are ignored. Leave Languages blank for product-page. Use true or false for ShowLinkChoices and a decimal point for decimal text, for example 0.495. Excel numeric cells are accepted. Topics are inferred from links; empty topics cannot be imported.
Review, import and publish
Choose Import Excel, upload the file, and correct any validation errors. Nothing is saved during validation. The preview identifies new products and updates, counts topics and links, and shows removals. Publication is selected by default for eligible products; uncheck individual products to import them as drafts only, or use the bulk toggle. Confirm once to start. Keep the window open while products are saved one at a time. All save attempts finish before any publication begins. If all saves succeed, the selected saved versions are published.
Updating existing products
Products match by normalized resolver origin plus GTIN within your workspace. A blank resolver selects CodePersist's default, never an existing custom domain. An existing GTIN on another resolver is rejected. Each confirmed import creates a revision. Omitted editable links and their empty topics are removed; hidden topics and standalone resources stay on the server. Keep an exported LinkId to update that link while retaining its saved metadata, even when its URL or languages change. Leave LinkId blank to create a new link with default metadata. Moving an existing link between optional topics retains its metadata and adds the new topic’s required relation. Mark at most one IsDefault per product; none selects the product page. Disabled products remain disabled. Published versions stay live until replacements are published.
If a save or publication fails
If any save fails, the remaining saves are attempted and automatic publishing is held. Retry failed products individually, publish only the selected products that saved, or leave without publishing. Retrying a save does not start publishing automatically. Successful saves are not repeated. Publication retries use the saved revision and do not create another one. Save retries keep the version originally reviewed and cannot resolve a version conflict. If another edit changed a product after preview, or a network failure left the earlier write uncertain, review the current products and export a fresh workbook. Leave and reopen import to upload and preview your changes again. Closing the window does not undo completed saves and does not schedule continuation.
Common errors and corrections
Products · row 1: invalid layout — restore a renamed/moved header from a fresh template. Products · row 2 · GTIN: text required — format the cell as Text and type the GTIN again; changing the format alone cannot restore lost zeroes. Links · row 3 · ProductKey: unknown reference — copy the exact ProductKey from Products. Formula not supported — paste a value instead. Value outside table — expand the original table to include your new rows. Error messages appear in your app language with the worksheet, row and column.
Export all or selected products
On Products, select rows and choose Export selected. To export the whole catalogue, clear the search, choose All statuses, select this page, then choose Select all matching products. Selections stay checked across pages, searches and status filters. Download the Excel template from More. Export includes editable product fields, topic selections, link titles, URLs, languages and QR settings, including selected disabled products. Hidden topic definitions, link metadata and resources unavailable in the editor stay on the server. The exported workbook can be edited and imported on a paid plan. It does not include revision history, analytics, generated artwork, credentials or provider configuration.