Koru Shipday
Connects VTEX with Shipday: bulk-load shipping rates by postal code, automatically create paid orders in your delivery fleet, and push tracking and delivery confirmation back into VTEX.
Pre-release installation identifier
Koru Shipday currently runs internally as pardosit.koru-shipday for development only.
The final public VTEX App ID will replace {vendor}.koru-shipday in every command before
publish or release. Do not use the development account for a production installation.
Koru Shipday is a VTEX Admin App that connects a VTEX store with Shipday, the last-mile delivery management software for in-house fleets. It covers the full shipping cycle: loading shipping rates by postal code into VTEX, creating every paid order in Shipday so it goes out for delivery, and returning the tracking reference and delivery confirmation to VTEX.
The app is organized into three modules, plus a cross-cutting configuration, diagnostics, and audit layer:
- Rates — replaces the postal-code rate table of one or more shipping policies from a single spreadsheet, in one operation with an automatic backup.
- Orders — detects orders with approved payment whose shipping policy is enabled, calculates packages, and creates them in Shipday without duplicates.
- Events — receives the Shipday webhook and reflects the tracking reference and confirmed delivery in VTEX.
What Koru Shipday does not do
Koru Shipday does not create, edit, or delete shipping policies, docks, warehouses, or carriers: it operates on the ones that already exist in the account. It also does not invoice orders (it assumes the order is already invoiced by the time it reaches Shipday), does not propagate intermediate delivery states to VTEX, does not manage drivers or routes inside Shipday, and does not replace the ERP as the source of truth for the operation.
Before you begin
Recommended owners
| Task | Typical owner |
|---|---|
| Install the app and validate the account/workspace | VTEX agency, developer, or tech lead |
| Activate the app for the site in Koru Suite | Red Clover / Koru Suite administrator |
| Get the Shipday API Key and configure the webhook | Shipday account owner |
| Create the packages attribute in the VTEX catalog | Catalog owner |
| Load rates by postal code | Ecommerce manager or logistics owner |
| Review failed orders and retry them | Logistics or ecommerce operator |
| Audit the events received from Shipday | Designated operations owner |
One person can cover several roles in a small store.
Required access
Before installing, make sure you have:
- A valid VTEX Admin session in the store account.
- A License Manager role with access to the Logistics module. Without it, the Rates module stays blocked: rate writes use the administrator's session, not the app's identity.
- The official VTEX CLI installed and up to date.
- Permission to install apps in the chosen workspace and to modify the app's settings.
- The store's Website ID in Koru Suite, with Koru Shipday active for that site.
- A Shipday account with its API Key (Shipday dashboard → My Account → Integrations → API Credentials).
- At least one shipping policy already configured in VTEX to associate with Shipday.
Koru Shipday does not create a VTEX role of its own. Logistics access is managed with the controls available in VTEX License Manager.
Identifiers you will encounter
| Identifier | Example | Who defines it | Configured? |
|---|---|---|---|
| Store VTEX account | my-store | Merchant | Used to log in with the CLI |
| VTEX workspace | master or shipday-qa | Merchant/agency | Determines where it is installed and validated |
| VTEX App ID | {vendor}.koru-shipday | App publisher | Used in vtex install |
| Koru Website ID | Site UUID | Koru Suite | Yes, once per store |
| Koru App ID | Koru Shipday's internal UUID | App build | No; it lives in code and a store cannot change it |
| Shipday API Key | Secret string | Shipday | Yes, once per store |
| Webhook token | Up to 32 characters, you choose it | Merchant | Yes, in the app and in Shipday |
Do not mix up the two accounts
The store account used in vtex login does not necessarily match {vendor}, which
represents Koru Shipday's publishing account.
Installation with the VTEX CLI
Installation uses the official VTEX CLI. It is a standalone Admin App: it requires no Store Theme changes and no storefront block declarations.
Install in a validation workspace first
If the store has a QA process, install and configure in a development workspace first. Replace the values between braces:
Log in to the store 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. Do not continue if the context is wrong.
Install Koru Shipday
vtex install {vendor}.koru-shipday@0.xThe 0.x range installs the latest available version while the app is in pre-release.
The app registers its automated processes on install
During installation, Koru Shipday registers its triggers with the VTEX Scheduler (order sync, reconciliation, and tracking retry). If that registration did not complete, it repairs itself the first time you run a process manually from the Overview screen.
Open the app in VTEX Admin
You can open Koru Shipday from the store configuration section in VTEX Admin (side menu) or navigate directly:
https://{workspace}--{store-account}.myvtex.com/admin/koru-shipdayFor master, use the account's main Admin domain:
https://{store-account}.myvtex.com/admin/koru-shipdayIf the app does not appear in the navigation, check vtex list, reload VTEX Admin, and
confirm you are looking at the same account and workspace where you installed it.
Install in master
Once the setup is validated in the corresponding workspace, select master, reconfirm the
context, and repeat the installation:
vtex use {store-account}/master
vtex whoami
vtex install {vendor}.koru-shipday@0.x
vtex listSettings are per installation/workspace. Verify the Website ID, the Shipday API Key, the webhook token, and the enabled policies in the final environment even if you already tested them in another workspace.
The webhook URL changes with the workspace
The URL configured in Shipday points to a specific workspace. When moving to master you
must copy the new URL from Settings → Shipday webhook and update it in the Shipday
dashboard, or events will keep arriving at the test workspace.
Updating and uninstalling
Update
Select the correct account/workspace, confirm it, and install the range again:
vtex whoami
vtex install {vendor}.koru-shipday@0.x
vtex listAfter updating, open the app and check the license, the main checks, the enabled policies, and the state of the automations. Do not assume a code update replaces operational validation.
Uninstall
Uninstalling applies to the current workspace:
vtex whoami
vtex uninstall {vendor}.koru-shipday
vtex listWhat happens to what was already synced
Uninstalling does not delete orders already created in Shipday, nor does it revert rates already loaded into VTEX: it only stops the integration. If the goal is a pause, turning off Integration active in Settings stops the operation without losing the configuration. Before uninstalling, also disable the webhook in the Shipday dashboard so it stops pointing at an app that is no longer there.
Activation and first access
Get the Website ID
Before first use, Red Clover must activate Koru Shipday 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 store 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: the Koru App ID lives in the app's code and cannot be changed from the store.
Connect the store
On first access, the app shows Connect this store to Koru Suite:
Paste the Website ID
Enter the complete value, with no extra spaces.
Save and continue
The app persists the value in its VTEX settings. It can also be managed from Admin → Apps →
Koru Shipday, using the koruWebsiteId property.
Confirm the license
The main screen must show the license as active. If a license-inactive screen appears, do not continue with the operational setup: first check 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 Shipday combination has an active license.
Recommended initial setup
Follow this order: each step enables the next, and the two operational modules only unlock once their checks are green.
Confirm the Website ID and the active license
Make sure the app is enabled before moving on to any operational configuration.
Load the Shipday API Key and test the connection
In Settings → Shipday connection, paste the API Key and use Test connection. If the result is negative, stop there: no order will be able to reach Shipday.
Verify the VTEX permissions
In Settings → VTEX permissions, use Verify permissions. These are two independent checks: your user's Logistics role (enables Rates) and the app's policies (enable Orders). One does not replace the other.
Configure the webhook in Shipday
Choose a token (up to 32 characters), save it in Settings → Shipday webhook, and load the URL the app displays — along with that same token — in the Shipday dashboard.
Fill in the pickup location
Name and address of the warehouse or store the shipment leaves from. This is the origin reported to Shipday on every order.
Prepare the packages attribute in the catalog
Create the SKU specification in VTEX that states how many packages each unit takes, enter its name and group in the app, and verify it against a sample SKU. If there are many SKUs, use the bulk packages upload.
Select the enabled shipping policies
Only orders whose shipping policy is checked here are sent to Shipday. Without at least one, the Orders module stays blocked.
Load rates by postal code
From the Rates module, starting with a small upload to validate the spreadsheet format before replacing a full table.
Turn on the integration, and only then the automations
Turn on Integration active, run a manual sync from Overview → Automations, review the result in Orders, and only then enable automatic detection, daily reconciliation, and tracking retry.
The app has a guided tour
Every screen includes a View tour button that walks through its sections and explains what each one is for. It is the fastest way for someone new to understand a screen without reading this whole page.
What enables each module
Rates and Orders do not unlock on their own: they depend on different checks, because they operate with different identities.
| Module | What it needs | Why |
|---|---|---|
| Rates | The logged-in user's Logistics role | Rate writes use the session of the administrator looking at the screen. |
| Orders | Valid Shipday connection + the app's VTEX permission + integration active + at least one enabled policy | Orders are created by automated processes, with the app's identity, not a person's. |
| Events | Nothing blocks the screen | It shows what arrived from Shipday, even if everything else is not configured yet. |
When a check fails, the app shows a diagnostic code:
| Code | What it means | How to fix it |
|---|---|---|
CFG-001 | The user does not have the Logistics role in License Manager. | A VTEX administrator must add the role. |
CFG-002 | Shipday rejected the API Key. | Check that it belongs to this account and has not been revoked. |
CFG-003 | The app does not have Logistics permission in this account. | Reinstall the app so its policies are accepted. |
CFG-004 | The service did not respond (timeout, 429, 5xx). | Temporary: retry in a few minutes. |
CFG-005 | The Shipday API Key is missing. | Load it in Settings. |
CFG-006 | The integration is turned off. | Turn on Integration active. |
CFG-007 | No shipping policy is selected. | Check at least one in Settings. |
Check results are cached for a few minutes so the app does not repeat calls on every screen load. After fixing something, use Verify permissions or Refresh status to force a fresh check instead of waiting for the cache to expire.
Complete configuration reference
All configuration lives in the VTEX app settings and is managed from the app's Settings screen (or from Admin → Apps → Koru Shipday). Changes are not applied until you press Save changes.
General and license
| Field | Key | Default | Behavior |
|---|---|---|---|
| Koru Website ID | koruWebsiteId | — | Connects the store to the Koru license. Without it, the app stays on the setup screen. |
| Integration active | integrationEnabled | false | Master switch. When off, no orders are sent and no events are processed, but the configuration is kept. |
| Time zone | timezone | America/Argentina/Buenos_Aires | Time zone of the logistics operation; used for dates and delivery windows. |
Shipday connection
| Field | Key | Default | Behavior |
|---|---|---|---|
| Shipday API Key | shipdayApiKey | — | The app's only secret. Found in Shipday → My Account → Integrations → API Credentials. |
| Webhook token | shipdayWebhookToken | — | Up to 32 characters. Validates that each incoming event comes from your Shipday account. |
Operation
| Field | Key | Default | Behavior |
|---|---|---|---|
| Pickup location name | pickupName | — | Shipment origin reported to Shipday. |
| Pickup location address | pickupAddress | — | Full, readable dispatch address: street, number, city, state, and postal code. |
| Enabled shipping policies | enabledShippingPolicies | empty | Only orders whose policy is in this list are sent to Shipday. |
The pickup location is single for the whole account: every order is reported to Shipday with the same origin. A pickup location per shipping policy is not implemented.
Packages attribute
| Field | Key | Default | Behavior |
|---|---|---|---|
| Packages attribute name | packagesSpecificationName | Cantidad de bultos | The VTEX SKU specification holding the number of packages per unit. |
| Attribute group in VTEX | packagesSpecificationGroup | Logística | The specification group the attribute belongs to in the catalog. |
| If an SKU lacks the attribute | packagesMissingBehavior | fallback-one | fallback-one assumes 1 package and leaves an audited warning; block flags the order with a data error. |
Automation
| Field | Key | Default | Behavior |
|---|---|---|---|
| Look for new orders automatically | ordersSyncEnabled | false | Enables automatic order detection. When off, manual sync is still available. |
| How often to look for new orders | ordersSyncIntervalMinutes | 10 | Functional interval in minutes between automatic runs. |
| Daily reconciliation | reconcileEnabled | false | Reviews pending or retrying orders against Shipday once a day. |
| Automatic tracking retry | trackingRetryEnabled | false | Retries every 10 minutes to register tracking or confirm delivery for orders left waiting. |
Rates module
Replaces the postal-code rate table of one or more shipping policies from a single spreadsheet. It does not create or modify policies, docks, or warehouses: it operates on the freight value table of policies that already exist.
How to use it
Select the policies
You can check several: the same spreadsheet is applied to all of them in a single operation.
Download the template
The template carries the exact headers and an embedded version. Always download it from the module; do not reuse an old file.
Fill it in and upload it
On upload, the app reads it, validates it against VTEX, and shows a summary: how many rows are valid, how many have errors, and what the first errors are.
Review and apply
The Apply upload button is enabled only if the upload passes review. Before writing, the app backs up each policy's previous table.
Template columns
| Column | Required | Detail |
|---|---|---|
Codigo postal inicial | Yes | Normalized to 8 digits with leading zeros, exactly as VTEX stores it. |
Codigo postal final | No | Empty = same as the start value (single-postal-code row). Never lower than the start. |
Peso inicial (kg) | Yes | Accepts comma or dot as the decimal separator. |
Peso final (kg) | Yes | Cannot be lower than the start weight. |
Costo de envio | Yes | Number greater than or equal to 0. |
Plazo de entrega (dias) | Yes | Whole days. VTEX accepts a single lead time per row, not a range. |
Pais | No | Defaults to ARG. |
Costo porcentual (%) | No | Defaults to 0. |
Costo por peso extra | No | Defaults to 0. |
Volumen maximo | No | Defaults to 0. |
Seguro minimo | No | Defaults to 0. |
Poligono | No | Empty by default. |
The template headers are in Spanish even in the English documentation: they are the exact strings the app generates and validates, so translating them would break the upload.
Validations
| Code | When it appears |
|---|---|
RATE-001 | The template is not a valid version, or the headers do not match. The whole file is rejected without looking at a single row. |
RATE-002 | Error in a specific row: a required field is missing, a postal-code or weight range is invalid, a cost or lead time is negative, or the row overlaps an earlier one on the same postal-code and weight range. |
RATE-003 | A selected policy is no longer available between listing it and applying the upload. |
Do not reopen the template in another tool
The template version travels in a hidden sheet. Opening and re-saving the file with some
spreadsheet tools can alter it, and the upload is rejected with RATE-001 even though the
data is fine. If that happens, download the template again and fill it in from scratch.
What an upload replaces exactly
An upload replaces only the postal codes included in the file. Postal codes not present in the spreadsheet keep their previous rate unchanged: this is not a wipe-and-reload of the whole table.
Backup and rollback
- Before writing to a policy, the app backs up the current rates for the postal codes the upload will touch.
- If the write fails partway through with several policies selected, the app reverts those already applied using that backup.
- The automatic backup is capped at 300 distinct postal codes per upload. A spreadsheet above that cap can still be applied, but the app asks for an explicit acknowledgment: that upload has no backup and cannot be rolled back automatically.
- A postal code with no rate loaded today leaves nothing to back up: the rollback can restore the previous value of a postal code that already existed, not "undo" the creation of a new one.
Upload states
| State | Meaning |
|---|---|
| Applying | The upload is being written to VTEX. |
| Reverting | Something failed and the backup of already-applied policies is being restored. |
| Successful | Every policy was applied. |
| Failed | No policy was applied. |
| Reverted | It failed partway through and the previous state was restored. |
| Requires manual review | It failed and the rollback could not complete either. Rates must be reviewed by hand. |
VTEX can take a while to reflect new rates
A successful upload is not visible immediately in the shipping simulator: VTEX can take from minutes to more than a day to propagate new rates. This is known platform behavior, not a problem with the upload. That is why the app reports the upload as applied and pending confirmation from VTEX, instead of verifying it instantly.
Bulk packages upload
This lives inside Settings, not in its own tab. It loads the packages specification into many SKUs at once, instead of filling it in product by product in the catalog.
| Column | Required | Detail |
|---|---|---|
SKU ID | Yes | The SKU ID in VTEX. It cannot repeat within the same spreadsheet. |
Cantidad de bultos | Yes | Whole number between 1 and 99. |
| Code | When it appears |
|---|---|
PKGBULK-001 | The template is not a valid version or the headers do not match. |
PKGBULK-002 | The SKU ID is missing, or the package count is not a whole number between 1 and 99. |
PKGBULK-003 | The SKU already appears in an earlier row of the same spreadsheet. |
Each row is applied on its own: a failing row does not affect the rest, and the result shows how many were applied and how many failed. Maximum 300 rows per upload — a larger spreadsheet is rejected with a request to split it.
This upload has no backup or rollback
Unlike Rates, the bulk packages upload keeps no backup: a wrong value is fixed with another upload that overwrites it, not with a revert.
How the attribute must be created in VTEX
VTEX only supports SKU-level specifications of type Combo or Radio: it does not
accept a free numeric field. The packages attribute must be created as a list of options
(for example 1, 2, 3, 4), and its name and group must match exactly what is
configured in the app.
Orders module
How orders are detected
The app polls the VTEX OMS for new orders and keeps a marker of how far it has processed, so it does not re-read the same range forever.
- The first run in a workspace looks back 24 hours.
- Each run processes up to 20 pages of 100 orders. If there are more, the marker does not move beyond what was processed and the next run continues from there: no order is lost, the work is just spread across more runs.
- If an order fails while being read, the run stops right there without advancing the marker, so it is not left behind.
Why polling and not the order feed
The OMS Feed v3 and Hooks allow a single consumer per VTEX account: using them could steal events from the client's ERP. That is why detection is done by querying the OMS, which is a read and competes with nobody.
When an order is eligible
An order is sent to Shipday when it meets all of these conditions:
| Code | Condition that was not met |
|---|---|
ORD-001 | Payment is not approved yet. |
ORD-002 | The order's shipping policy is not enabled for Shipday. |
ORD-003 | Recipient data is missing: name, phone, or address. |
ORD-004 | The order is cancelled. |
PKG-001 | The package count could not be calculated and the setting is block. |
ORD-001 is the normal case for a freshly created order: it is re-evaluated on its own in
the next run and needs no action.
Order states
| State | Meaning | Self-resolving? |
|---|---|---|
| Not eligible | It fails an eligibility condition. | Yes, re-evaluated on every run. |
| Pending sync | It is eligible and about to be created in Shipday. | Yes. |
| Retrying | The creation failed for a transient reason (timeout, 429, 5xx). | Yes, with a growing wait between attempts (from 1 minute up to 1 hour). |
| Synced | It already exists in Shipday. Final state. | — |
| Data error | Shipday rejected the order because of its data (400 and other 4xx). | No: it must be fixed and retried by hand. |
| Permanent error | Shipday rejected the credential (401/403). | No: the API Key must be reviewed and the order retried by hand. |
Manual retry
Rows in Data error and Permanent error show the Retry button. These are the only two states the app never leaves on its own, by design: looping retries on an order Shipday will keep rejecting fixes nothing.
The retry does not duplicate the order: if a previous attempt ended with an uncertain response, the app first asks Shipday whether the order already exists and, if it finds it, only records the relationship.
What is sent to Shipday
For each order the app sends the VTEX order number (which is what later matches incoming events), the recipient data, the configured pickup location, the total, the items with price and quantity, the normalized payment method, and the calculated package count. Payment data and credentials are not sent.
Events module (tracking and delivery)
Shipday notifies every delivery status change by webhook. The app records every event and reflects only two things in VTEX: the tracking reference and the delivery confirmation.
Configure the webhook
- Choose a token of up to 32 characters and save it in Settings → Shipday webhook.
- Copy the URL that same section displays — it looks like this:
https://{store-account}.myvtex.com/_v/public/koru-shipday/webhook/shipday- Load the URL and the token in the Shipday dashboard.
No token configured means no event gets in
The app rejects every event that does not present the expected token. If the token is empty in the configuration, all events are rejected: this is deliberate — the URL is public and the token is the only thing separating a real event from a made-up one.
What the app does with each event
| Shipday event | Action in VTEX |
|---|---|
ORDER_INSERTED | Recorded, not propagated. |
ORDER_ASSIGNED | Registers the tracking reference. |
ORDER_ACCEPTED_AND_STARTED | Registers the tracking reference. |
ORDER_PIKEDUP | Recorded, not propagated. |
ORDER_ONTHEWAY | Recorded, not propagated. |
ORDER_COMPLETED | Confirms delivery in VTEX. |
ORDER_FAILED | Recorded as an incident. Does not mark as delivered. |
ORDER_INCOMPLETE | Recorded as an incident. Does not mark as delivered. |
The status carried by the event takes precedence over the event name: Shipday sometimes sends undocumented event names for the same transition. That is why the app decides what to do based on the order status, which is the reliable signal.
Results you will see on the screen
| Result | Meaning |
|---|---|
| Processed | The event was applied in VTEX. |
| Duplicate | Shipday resent an already-processed event. Nothing is done twice. |
| Ignored | An intermediate delivery state: recorded, not propagated to VTEX. |
| Retrying | It could not be applied yet (for example, the order is not invoiced) and will be retried automatically. |
| Error | It could not be applied. Requires review. |
Shipday is an in-house fleet, not a carrier
Shipday does not issue a carrier tracking number or URL. The tracking reference registered in VTEX is the Shipday order ID, which is what locates the shipment in its dashboard.
Invoicing and retries
To register tracking or confirm delivery, VTEX requires the order to be invoiced already. The app never invoices: it assumes the order already is by the time it reaches Shipday (operational rule: nothing is dispatched without an invoice) and only reads the invoice number.
If it is not invoiced yet, the event is not lost: it stays in Retrying and the tracking retry job tries again every 10 minutes, with a growing wait. If the problem is not transient, the order is flagged for manual review.
Automations
Three automated processes, visible in Overview → Automations:
| Process | How often it fires | Functional interval | Setting that enables it |
|---|---|---|---|
| Order sync to Shipday | Every 10 minutes | Configurable (10 minutes by default) | Look for new orders automatically |
| Reconciliation with Shipday | Once a day (03:00) | Daily | Daily reconciliation |
| Tracking retry | Every 10 minutes | Every 10 minutes | Automatic tracking retry |
The technical trigger always runs; what decides whether to act is the configured switch and interval. Reconciliation exists because normal polling never looks at an old order again: it sweeps orders left pending or retrying and reprocesses them, never duplicating an order already created in Shipday.
Run states
| State | Meaning |
|---|---|
| Completed | It ran and finished successfully. |
| Not applicable | The process is off or the interval has not elapsed. |
| Already running | Another run was in progress; this one did not overlap. |
| Blocked | It did not pass the pre-checks (session or license). |
| Error | It ran and failed. |
The Run now button triggers the same logic manually, without waiting for the schedule, and works even if the automated process is off. It is the recommended way to test a configuration change right away.
Screens
General integration status: VTEX account, workspace, and license; the three main checks (Shipday, user permission, app permission); the state of the integration, the API Key, and the webhook URL; and the Automations panel with each process's status, last run, and manual trigger button.
License and security
License validation
Every operational route requires:
- A valid VTEX Admin session.
- An active Koru license for the Website ID and Koru Shipday's App ID.
To tolerate transient network or license-service failures, a positive authorization is kept briefly; an explicit revoked-license response blocks the app immediately. The webhook is the exception: with a revoked license or the integration turned off, it responds successfully and discards the event while leaving a record, instead of making Shipday retry forever.
Data and credentials
- The app never asks for or stores the merchant's AppKey/AppToken. To operate on VTEX it uses the logged-in administrator's session (manual actions) or its own app identity (automated processes).
- The app's only secret is the Shipday API Key, stored in the VTEX app settings and never exposed to the browser in plain text.
- The browser never calls VTEX APIs or Shipday directly: everything goes through the app's own routes.
- The Website ID and App ID identify resources, but they are not passwords.
- Order state, events, and upload history are persisted in the app's internal storage, not in Master Data or in VTEX orders.
- Every action carries a correlation identifier that makes it traceable in the logs when support needs it.
Troubleshooting
The app does not appear after installation
- Run
vtex whoami. - Confirm the account and workspace.
- Run
vtex listand look for{vendor}.koru-shipday. - Reload VTEX Admin.
- Try the direct URL
/admin/koru-shipdayon the same domain/workspace.
The license shows as inactive
- Compare the Website ID with the correct site in Koru Suite.
- Confirm that Koru Shipday is active for that website.
- Make sure you did not copy any spaces.
- Retry the validation.
- If it persists, report the Website ID, account, and workspace to support, without sending credentials.
Rates is blocked
It is always CFG-001: your user does not have the Logistics role in License Manager. Ask a
VTEX administrator to add it and verify the permissions again.
Orders is blocked
Check the four conditions in Settings: a valid Shipday API Key, the app permission in order, Integration active turned on, and at least one shipping policy checked. The notice tells you which one is missing.
The Shipday connection fails
- Confirm the API Key belongs to this Shipday account and has not been revoked.
- If the error is temporary (
CFG-004), retry in a few minutes: it is not a configuration problem. - Remember that Test connection may be testing a value you have not saved yet; the app says so.
No orders are being sent
Check, in this order:
- That Integration active is on.
- That Look for new orders automatically is on, or trigger it by hand from Overview.
- That those orders' shipping policy is checked in Settings.
- That the orders have approved payment.
- The Orders screen: the Detail column states the exact reason per order.
An order is stuck in "Data error"
That is a Shipday rejection based on the order's data. Check that the recipient has a complete name, phone, and address, and that the configured pickup location is a readable address. Once fixed, use Retry on that row.
No events arrive from Shipday
- Confirm the URL loaded in Shipday is the one the app shows for this workspace.
- Confirm the Shipday token is identical to the one saved in the app (up to 32 characters, no spaces).
- Check that Integration active is on: with the integration off, events are discarded.
- Review the Events screen: if there are events with the Ignored result, the webhook is arriving fine and what you see are intermediate states that are not propagated.
The delivery is not reflected in VTEX
Look at the event on the Events screen:
- Retrying with an invoicing reason: the order is not invoiced in VTEX yet. It resolves on its own once invoiced, if automatic tracking retry is enabled.
- Error: the update in VTEX failed. Check that the order exists, is invoiced, and is not cancelled.
- No event at all: the problem is the webhook, not tracking. See the previous point.
The template is rejected even though it looks right
Download the template again from the app and fill it in without reopening the file in
another tool. Reopening and re-saving an .xlsx can alter the hidden sheet carrying the
version.
Rates do not show up in the simulator
If the upload shows as successful, wait: VTEX can take from minutes to more than a day to propagate new rates. Check the upload state in the Rates module before uploading the file again.
Functional limits
The current version:
- Assumes one order = one shipment: it does not handle multi-seller marketplace orders dispatched in more than one shipment or invoice.
- Uses a single pickup location for the whole account, not one per shipping policy.
- Automatically backs up up to 300 postal codes per rate upload; above that, the upload runs without a backup and requires explicit acknowledgment.
- Applies up to 300 rows per bulk packages upload, with no backup or rollback.
- Processes up to 20 pages of 100 orders per detection run.
- Does not invoice orders in VTEX: it assumes they arrive already invoiced.
- Does not propagate intermediate delivery states or failed deliveries to VTEX: only the tracking reference and the delivery confirmation.
- Does not create or modify shipping policies, docks, warehouses, or carriers.
- Always operates on the VTEX account where it is installed.
Checklist before going live
- Koru Shipday installed in the correct account and workspace.
- Website ID verified and active license confirmed.
- Shipday API Key loaded and Test connection green.
- VTEX permissions verified: the user's Logistics role and the app's policies.
- Webhook URL and token loaded in the Shipday dashboard, for this workspace.
- Pickup location complete and readable.
- Packages attribute created in the catalog, configured in the app, and verified against a sample SKU.
- Enabled shipping policies selected.
- A test rate upload applied and reviewed before a large one.
- Integration active turned on.
- A manual order sync run and reviewed on the Orders screen.
- Automations enabled only after manual validation.
- An owner assigned to review failed orders and events periodically.
Useful details when asking for support
Report the VTEX account, workspace, approximate time, the VTEX order ID involved, and, if applicable, the specific row from the Orders or Events screen. Avoid sending the Shipday API Key, the webhook token, credentials, or cookies.