Koru Catalog Boost
Bulk VTEX catalog management from an Excel/CSV spreadsheet — categories, brands, brand logos and product images, with an auditable history.
Pre-release installation identifier
Koru Catalog Boost currently runs internally as catycanarnl1.catalogo-boost,
solely for development. The definitive public VTEX App ID is deliberately pending
and will replace {account}.catalogo-boost in every command before publishing or
releasing. Don't use the development account for a production installation.
Koru Catalog Boost is a VTEX Admin App for bulk creating, deactivating and updating your catalog from an Excel or CSV spreadsheet: categories (with a hierarchy preview), brands, brand logos and product images — including date-scheduled visibility.
The app is designed for two different moments:
- The technical team or VTEX agency installs the app, connects the license, and defines the defaults for new categories.
- The catalog or ecommerce team prepares the spreadsheets, uploads files, reviews the preview before applying, and follows up in the operation history.
What Koru Catalog Boost does not do
Koru Catalog Boost does not delete categories (VTEX does not expose a category DELETE; deactivation is the only way to retire one), does not reparent categories directly (VTEX blocks that; see the "relocate" workaround below), does not manage full products or SKUs (only their category/department during a relocation, and their images), does not send notifications, and does not replace the complete native catalog ABM in VTEX Admin.
Before you start
Recommended owners
| Task | Usual owner |
|---|---|
| Install the app and validate the account/workspace | VTEX agency, developer, or technical lead |
| Activate the app for the site in Koru Suite | Red Clover / Koru Suite administrator |
Define the defaults for new categories (categoryDefaults) | Technical lead or catalog owner |
| Prepare and validate category, brand and image spreadsheets | Catalog or ecommerce team |
| Run bulk uploads and review the result | Catalog or ecommerce operator |
| Upload brand logos | Marketing/design team or ecommerce |
| Schedule image visibility (date-based promotions) | Ecommerce manager |
| Audit the operation history | Ecommerce manager or operations owner |
A single person can cover several roles in a small store.
Required access
Before installing, confirm you have:
- A valid VTEX Admin session on the store's account.
- A License Manager role with Catalog - Full access. Without this access,
the Catalog API responds
401/403when creating, updating, moving, or deactivating any catalog entity. - The official VTEX CLI, installed and up to date.
- Permission to install apps on the chosen workspace and to modify the app's settings.
- The ecommerce's Website ID in Koru Suite and Koru Catalog Boost active for that site.
- Category, brand and image spreadsheets ready (you can download each module's template from within the app itself).
Koru Catalog Boost does not create its own VTEX role. Access to the Catalog API is managed with the access controls already available in VTEX License Manager.
Identifiers you'll come across
| Identifier | Example | Who defines it | Is it configurable? |
|---|---|---|---|
| Store's VTEX account | my-store | Merchant | Used to log in with the CLI |
| VTEX workspace | master or boost-qa | Merchant/agency | Determines where it's installed and validated |
| VTEX App ID | {account}.catalogo-boost | App publisher | Used in vtex install |
| Koru Website ID | Site's UUID | Koru Suite | Yes, once per store |
| Koru App ID | Koru Catalog Boost's internal UUID | App build | No; already baked in (optional advanced override) |
Don't confuse the two accounts
The store's account, used in vtex login, does not necessarily match {account},
which represents Koru Catalog Boost's publishing account.
Installation with the VTEX CLI
Installation uses the official VTEX CLI. It's a native Admin App: it does not require modifying the Store Theme or declaring storefront blocks.
Install first in a validation workspace
If the store has a QA process, install and configure it first in a development workspace. Replace the values in curly braces:
Log in to the store's account
vtex login {store-account}Select the validation workspace
vtex use {store-account}/{workspace}Confirm the context before installing
vtex whoamiThe output must show the account and workspace you expect. Don't continue if the context is wrong.
Install Koru Catalog Boost
vtex install {account}.catalogo-boost@1.xThe 1.x range installs the latest stable version available within major 1.
Opening the app in VTEX Admin
You can open Catalog Boost from the store's configuration section in VTEX Admin (side menu) or navigate directly:
https://{workspace}--{store-account}.myvtex.com/admin/catalogo-boostFor master, use the account's main Admin domain:
https://{store-account}.myvtex.com/admin/catalogo-boostIf the app doesn't show up in navigation, confirm vtex list, reload VTEX Admin,
and verify you're looking at the same account and workspace where you installed
it.
Installing on master
Once the setup is validated in the corresponding workspace, select master,
re-confirm the context, and repeat the installation:
vtex use {store-account}/master
vtex whoami
vtex install {account}.catalogo-boost@1.x
vtex listSettings are per installation/workspace. Verify the Website ID and category defaults in the final environment even if you already tested them in another workspace.
Update and uninstall
Updating within the current major
Select the correct account/workspace, confirm it, and reinstall the range:
vtex whoami
vtex install {account}.catalogo-boost@1.x
vtex listAfter updating, open the app and verify the license, the category defaults, and that the category tree loads correctly. Don't assume a code update replaces operational validation.
Uninstalling
Uninstalling applies to the current workspace:
vtex whoami
vtex uninstall {account}.catalogo-boost
vtex listThe app does not remove anything from the catalog on uninstall
Uninstalling Koru Catalog Boost does not revert or delete categories, brands, or images already applied in VTEX: those changes remain in the catalog. All you lose is access to the operation history and the scheduled-visibility queue (persisted in VBase). Before removing the app, export or review whatever history you need to keep, and deactivate the Koru license through the corresponding process.
Activation and first access
Getting the Website ID
Before first use, Red Clover must activate Koru Catalog Boost for the corresponding website in Koru Suite. The Website ID is obtained from Koru Suite or provided during activation.
The Website ID:
- Identifies the ecommerce within Koru Suite.
- Is not a password or a secret.
- Must belong to the same VTEX store where you installed the app.
- Is the only Koru identifier the merchant enters manually. There's also an optional Koru App ID field intended as an advanced escape hatch; in the vast majority of cases you won't need to touch it.
Connecting the store
On first access, the app shows Connect this store with Koru Suite:
Paste the Website ID
Enter the full value, with no extra spaces.
Save and continue
The app persists the value in its VTEX settings using the logged-in admin's
session. It can also be managed from Admin → Apps → Catalog Boost, using the
koruWebsiteId property.
Confirm the license
The main screen should show the app enabled (the Categories, Brands, Images and History tabs). If a license-not-active screen appears, don't continue with operational setup: first verify the Website ID and the activation in Koru Suite.
The app does not ask for an additional Koru login. The person is already authenticated in VTEX Admin; Koru Suite only validates that the Website ID + Koru Catalog Boost combination has an active license.
Recommended setup order
Follow this order before operating with real data:
Confirm the Website ID and the active license
Verify that the app is enabled before continuing with any upload.
Review the defaults for new categories
In Admin → Apps → Catalog Boost, review categoryDefaults: these are the values
used to fill in the fields VTEX requires that your category spreadsheet doesn't
provide (active, visible in storefront, brand filter, score, SKU selection mode,
etc.).
Test the Categories module with the sample template
Download the template from within the app, upload a couple of test rows (for example, a new department), and review the resulting hierarchy preview before applying.
Test the Brands module
Upload a small test brands spreadsheet and confirm that the unique name and slug (URL Friendly) validate as you expect.
Test a brand logo
On the Logos tab, upload a test logo and confirm it matches the correct brand (by Brand ID, slug, or name) before uploading logos in bulk.
Test the Images module with a real SKU
Use View a SKU's current images to confirm the app correctly pulls thumbnails, and test a simple association before scheduling date-based visibility.
Review the history after each test
Confirm every test operation is logged in the History module with the expected detail before operating with production data.
Full configuration
All configuration lives in VTEX app settings (Admin → Apps → Catalog Boost). There is no other configuration channel.
| Field | Key | Default | Behavior |
|---|---|---|---|
| Koru Website ID | koruWebsiteId | — (no default) | Connects the store to the Koru license. Without it, the app stays blocked on the setup screen and every catalog route responds 402. |
| Koru App ID (advanced) | koruAppId | Value embedded in the build | Optional override; normally not modified. |
| Defaults for new categories (JSON) | categoryDefaults | {"IsActive":true,"ShowInStoreFront":true,"ActiveStoreFrontLink":true,"ShowBrandFilter":true,"Score":100,"StockKeepingUnitSelectionMode":"LIST"} | Fills the mandatory fields the category spreadsheet doesn't provide. Must be valid JSON; if it's empty or malformed, the app falls back to its own code defaults only. |
categoryDefaults is read back and re-saved as-is every time any other setting is
saved from the app (saving replaces the entire settings blob). You don't need to
rewrite it unless you want to change its values.
How each module works
Categories
The module has three modes, selectable with the buttons at the top:
Load / Update. You upload a spreadsheet (columns: Categoria ID (Category ID)
· Nombre (Name) · ID Padre (Parent ID) · Title · Description · Keywords ·
Activa (Active)) and the app validates each row before showing the preview:
- Name is required.
- If a row has a Parent ID, that id must already exist in the VTEX tree or correspond to another row in the same spreadsheet that will also be created.
- A row cannot declare itself as its own parent (circular hierarchy).
- Two rows cannot share the same name under the same parent (duplicate within the same branch).
Rows with errors show the exact reason and are excluded; you can still apply the valid rows. The preview builds the resulting tree by combining the real tree with the new categories from the spreadsheet, so you see the final hierarchy before touching anything in VTEX.
Fields VTEX requires that the spreadsheet doesn't provide are filled with
categoryDefaults plus a few code defaults (Title/Keywords fall back to the
Name if left empty, Description stays blank). GlobalCategoryId is never sent
as 0: if there's no valid value (greater than 0) configured, the field is
omitted entirely, because VTEX rejects a 0 with a "Global category not found"
error.
Relocate. VTEX does not allow reparenting an existing category: any change
to FatherCategoryId — at the same level or to another department — is rejected
by the Catalog API with 400 "Cannot move category level". That's why
"relocating" doesn't move the original category: you drag a leaf category
(with no subcategories) onto its new parent in the tree, and on confirmation the
app:
- Creates a copy of the category under the new parent.
- (Optional, checked by default) Migrates the products from the source
category to the new one, reassigning each product's
CategoryIdandDepartmentId. - Deactivates the original — but only if every product was migrated successfully. If any product couldn't be migrated, the original stays active (to avoid leaving orphaned products hanging off a deactivated category) and the app tells you how many are still pending.
Subcategories are never migrated along with their products; that's why the tree only allows dragging leaf categories in this mode. Moves stay staged in yellow (pending) until you confirm, and you can undo each one before applying.
Deactivate. VTEX does not expose a category DELETE (it discourages deleting
categories with associated products). Select one or more categories in the tree
via checkbox and confirm: the app deactivates each one (IsActive=false) while
preserving the rest of its fields.
All category mutations are processed in batches of 10 requests with a 600 ms pause between batches.
Brands
Brand data sub-tab: you upload a spreadsheet (columns: Brand ID · Nombre
(Name) · URL Friendly · Activa (Active) · Titulo SEO (SEO Title) ·
Descripcion SEO (SEO Description)). It validates:
- Name is required and must be unique, both against existing brands and within the same spreadsheet.
- If a row has a URL Friendly, it must be a valid slug (lowercase letters, numbers, and hyphens). If left empty, the app auto-generates one from the name (accents removed, lowercase, hyphenated).
New brands are activated by default (Active: true), and the SEO Title
(SiteTitle) falls back to the name if left empty. Processing runs in batches of
10 with a 600 ms pause.
Logos sub-tab: the brand entity in the Catalog API has no image field, and
VTEX offers no REST API to upload the logo. The only native mechanism is the
"Images and files" section of VTEX's legacy Admin (the MarcaForm.aspx form,
file type LogoMarca), which the app replicates server-side: it downloads that
form, resubmits its current fields together with the file, and confirms VTEX
accepted it.
Things to keep in mind:
- The binary file does not go through a spreadsheet: it's uploaded by dragging or selecting images in a dedicated dropzone.
- Automatic matching of file → brand tries, in order: a numeric filename = Brand ID → slug/URL Friendly → normalized brand name (only if unique). Files that don't match are flagged "unassigned" and you can assign them manually with a selector; nothing is uploaded until every file in the batch is assigned.
- VTEX only accepts JPG or GIF for the logo (it validates by file extension/type, not by actual content). The app automatically converts any PNG/WebP you upload to JPG, flattening transparency onto a white background before sending it.
- Each logo requires two calls to the legacy form (one read, one write), so they're processed in smaller batches: 4 per batch, with an 800 ms pause between batches, and the browser sends them in chunks of 6 to avoid exceeding the route's time limit.
The logo upload resubmits the brand's whole file section
The mechanism VTEX uses to upload the logo is a full-page form. The app resends the current values to avoid blanking other brand data, but if you notice anything unexpected on a brand after uploading its logo, review it in VTEX Admin.
Images
You upload a spreadsheet (columns: SKU ID · Nombre Imagen (Image Name) ·
URL Imagen (Image URL) · Orden (Order) · Principal (Main) · Reemplazar
(Replace) · Eliminar (Delete) · Fecha Inicio (Start Date) · Fecha Fin (End
Date)), grouped internally by SKU. Each row represents one operation:
| Operation | When it applies | What it does |
|---|---|---|
| Associate | Replace and Delete both No | Adds a new image by URL. |
| Replace | Replace set to Yes | Finds the current image with the same Name, deletes it, and associates the new one in its place. Not atomic: it deletes first, then creates. |
| Delete | Delete set to Yes | Finds the current image by Name and deletes it. |
| Reorder | Row with an explicit Order | Adjusts the image's position within the SKU via the dedicated reorder endpoint. |
You can also look up a SKU's current images (with thumbnails) before uploading changes — useful to confirm exact names when replacing or deleting.
Scheduled visibility. The image Catalog API has no start/end dates, so Koru
Catalog Boost emulates it: if a row has a Start Date and/or End Date
(format YYYY-MM-DD or DD/MM/YYYY, with optional HH:MM time, interpreted in
the browser timezone of whoever uploads the file), that operation is not applied
instantly: it's queued as one or two scheduled jobs (one to make the image
appear on the Start Date, another to make it disappear on the End Date). Rows
without dates are applied immediately, as usual.
Scheduled jobs live in a persisted queue, and an hourly cron (runs on the hour,
every hour) checks which ones are due and applies them: associate to make the
image appear, or a lookup + delete by Name to make it disappear. Each job sits in
pending, applied, failed, or cancelled state; a job that's already been
processed isn't touched again even if the cron runs again. The Scheduled tab
lists the full queue and lets you cancel any job still pending.
Immediate image mutations are processed in batches of 8 (lighter than categories or brands, since each SKU can involve several calls), with a 600 ms pause between batches.
Screens and daily operation
The app is organized into four tabs within a single panel.
Mode selector (Load/Update, Relocate, Deactivate) over a category tree with hierarchy connector lines, a child count per node, expand/collapse per node or for the whole tree at once, and an Update button to refresh the tree without cache.
- In Load/Update: spreadsheet upload, downloadable template, preview of the resulting hierarchy, and application with a success/error count.
- In Relocate: drag and drop over the tree (leaf categories only), a checkbox to migrate products, a panel of pending relocations with an undo option, and a detailed result per category (new one created, products migrated, whether the original was deactivated).
- In Deactivate: multi-select via checkbox over the tree and confirmation with a destructive-action button.
History and auditing
Every relevant operation (category load/update, relocation, deactivation, brand creation, logo uploads, image operations, and scheduled-visibility runs by the cron) is logged in the History module.
- Keeps the last 500 operations, most recent first.
- Each entry includes the module (Categories/Brands/Images), operation type,
success and error counts, a readable summary of the result, up to 50 affected
identifiers, and up to 50 actual errors (
{id, error}, not just a count). - Manual actions log the VTEX user's email who performed them (obtained from
the admin's own session token, already validated by
authorizeAdmin, with no extra calls). Automatic scheduled-visibility cron runs are logged under thecronuser. - When a relocation leaves products unmigrated, the detail explicitly states that the original category was not deactivated and how many products are still pending.
License and security
License validation
All operational catalog routes require, in this order:
- A valid VTEX Admin session (
authorizeAdmin, checked against License Manager). - An active Koru license for the Website ID and Koru Catalog Boost's App ID
(
authorizeKoruLicense).
The app-settings route (the Koru gate's bootstrap) is excluded from the second check so the initial setup screen can load, but it still requires a valid admin session.
Failure-tolerance policy:
- A license explicitly revoked by Koru Suite blocks usage immediately
(
402). - Without a configured
koruWebsiteId, the block is also immediate, with a message indicating where to enter it. - On a network failure or an error from Koru's licensing service, the app does not block usage (a Koru outage shouldn't take down the merchant's operation); that result is not cached, so the next request retries the real check.
- A positive authorization is periodically revalidated in the background; a revocation is retried more frequently, so a reactivation in Koru Suite takes effect quickly.
Data and credentials
- The browser never calls the VTEX Catalog API directly: every request goes
through the app's own routes (
/_v/private/catalogo-boost/*). - The identity used to operate the Catalog API is the logged-in admin's own session (the "Catalog - Full access" role in License Manager); the app does not request or store the merchant's AppKey/AppToken.
- The scheduled-visibility cron uses the app's own token, not a human user's.
- Website ID and App ID identify resources, but are not passwords.
- The operation history and the scheduled-visibility queue are persisted in the app's internal storage (VBase), not in Master Data or Orders.
- Uploading a brand logo means the app calls a section of VTEX's legacy Admin on behalf of the logged-in admin; no additional credentials are sent for that.
Troubleshooting
The app doesn't show up after installing
- Run
vtex whoami. - Confirm the account and workspace.
- Run
vtex listand look for{account}.catalogo-boost. - Reload VTEX Admin.
- Try the direct URL
/admin/catalogo-booston the same domain/workspace.
The session was rejected or expired
Log back into VTEX Admin and reload the app. Private routes respond 401 when a
valid admin session is missing.
I can't create, update, move, or deactivate categories/brands/images
Confirm your user has Catalog - Full access in their License Manager role. Without that permission, the Catalog API rejects the operation even with a valid VTEX Admin session.
"Couldn't move" / "Cannot move category level"
This is a VTEX restriction, not an app error: the Catalog API rejects any change of parent on an existing category. Use the Relocate mode instead of trying to reparent directly: it creates a copy at the destination, migrates products if applicable, and deactivates the original.
"Global category not found" when creating or updating a category
The category involved has an invalid Global Category. Assign it a valid one from
VTEX Admin (Catalog → Categories → edit) and retry; the app never intentionally
sends a 0 to avoid exactly this error, but an already-invalid value stored in
VTEX can still trigger it.
The relocation didn't deactivate the original category
Check the detailed result: if products were left unmigrated, the app deliberately leaves the original active to avoid hiding orphaned products. Retry migrating those specific products, or migrate them manually in VTEX Admin before deactivating the original by hand.
The brand logo won't upload / is rejected
- Confirm the file matched the correct brand before applying (check the "auto"/"manual" indicator in the preview).
- Remember VTEX only accepts JPG or GIF; the app automatically converts other formats, but if the error persists, try a manually exported JPG.
- If the error mentions a backend connection problem with VTEX, retry: it may be a transient issue with the legacy form VTEX uses for this mechanism.
No images show up in a SKU's preview
Verify the SKU ID is numeric and exists in the catalog. A SKU with no associated images shows explicitly "no images", not an error.
A scheduled image didn't appear/disappear on the expected date
- Check the Scheduled tab: confirm the job's status (
pending,applied,failed,cancelled). - Remember the cron runs once per hour, on the hour — it is not instant when the configured date arrives.
- If the status is
failed, check the history for the error detail. - Verify the Koru license was active at the expected moment: the cron skips the run (without marking the job as failed) if the license isn't authorized at that time.
The license shows as inactive
- Compare the Website ID with the correct site in Koru Suite.
- Confirm Koru Catalog Boost is active for that website.
- Verify you didn't copy extra spaces.
- Retry the validation.
- If it persists, report the Website ID, account, and workspace to support, without sending credentials.
For production technical support:
vtex logs {account}.catalogo-boostDon't share tokens, cookies, or data that isn't necessary for diagnosis.
Functional limits
The current version:
- Never deletes categories: retiring one is always deactivation
(
IsActive=false). - Does not reparent categories directly (a VTEX Catalog API restriction); the "Relocate" workaround creates a copy and deactivates the original, not an in-place move.
- Brand logos are uploaded only via dropzone, not by spreadsheet, and VTEX only accepts JPG/GIF (other formats are automatically converted to JPG).
- Image "replace" is not atomic: it deletes the existing image first, then creates the new one.
- Scheduled image visibility depends on a cron that runs once per hour, not in real time.
- A relocation with very many products to migrate could exceed the route's time limit; in that case, the migration stays incomplete and must be retried.
- History keeps the last 500 operations, and the scheduled-visibility queue holds up to 1,000 jobs.
- Its interface is in Spanish, regardless of the language configured on the VTEX account (the VTEX Admin menu labels are translated to Spanish/English/ Portuguese).
- Does not integrate with VTEX OMS or Master Data: it operates exclusively on the Catalog API (categories, brands, products, and SKU images).
- Always operates on the VTEX account where it's installed; it does not manage another account's catalog from a single installation.
Checklist before operating
- Koru Catalog Boost installed on the correct account and workspace.
- Store's Website ID verified.
- Active license confirmed.
- User has Catalog - Full access in their License Manager role.
- Defaults for new categories (
categoryDefaults) reviewed. - Templates downloaded and test spreadsheets validated in each module.
- A test category upload validated in the preview before applying in bulk.
- A test relocation executed and checked against the detailed result.
- Automatic logo matching reviewed before uploading in bulk.
- Scheduled visibility for at least one image tested end to end.
- History reviewed after each test operation.
- An owner assigned to periodically review the operation history.
Useful information when requesting support
Provide the VTEX account, workspace, approximate time, affected module (Categories, Brands, or Images), involved identifiers (Category ID, Brand ID, SKU ID), and the detail of the corresponding operation history entry. Avoid sending credentials or cookies.