All articles

Integrations

Custom Website

Push inventory to a client-operated website (e.g. WordPress / WooCommerce) via a JewelTrak-built module. The module owns the format, transport, fields, and lookups; you manage credentials, lists, and per-item content. JewelTrak owns the data; the website's plugin owns the storefront.

Custom Website

A Custom Website integration pushes your inventory to a website that your own web developer operates — typically a WordPress / WooCommerce storefront. Unlike Shopify or eBay (named platforms with a fixed API), a custom website is bespoke, so JewelTrak builds a website module for it: a self-contained unit that knows the exact CSV format, transport (FTP + webhook), per-item fields, and lookup lists that your site expects.

A client selling through Shopify uses the Shopify integration, not this one. Custom Website is specifically for a site your developer maintains where JewelTrak delivers a data file and the site’s plugin imports it. A tenant can have both — they’re separate integration cards.

How a Custom Website gets set up

Setup is a JewelTrak task, done once per client during onboarding:

  1. JewelTrak builds your website module to match your developer’s CSV spec and import endpoints.
  2. An admin binds the module to your organization (Admin → org → Online Channels → Custom Website → pick the module → Bind & install). Binding also installs the module’s own tables and lookup lists into your tenant.
  3. The admin enables the Website channel. Until a module is bound, the toggle stays Locked — there’s nothing to render a card from, so the channel can’t be turned on.

Once the channel is enabled, the Custom Website card appears under Settings → Integrations, the Website sub-tab appears on inventory detail pages, and the bulk listings page is available under Online → Listings.

The integration card — credentials & config

Settings → Integrations → Custom Website is where you enter the credentials the module needs and manage its configuration. What appears here is declared by your module. For a two-site setup (a public retail site plus a dealer/members site) you’ll see two credential groups side by side — for example:

  • Jewelry World (the public retail site) — FTP host, user, password, and the webhook URLs the plugin listens on.
  • Jewelry Reserve (the dealer-gated site) — its own FTP + webhook values.

You get these values from your web developer. JewelTrak doesn’t host the site, so it can’t validate them up front; if a push hits an authentication problem, JewelTrak stops and prompts you to fix the affected credentials rather than silently skipping items.

Turning a site on and off

A group that is optional carries its own on/off switch. Switched off, that site is skipped entirely — no file is uploaded and nothing is triggered — while every other site keeps receiving pushes as normal. The per-item listing flags for the site you switched off are left exactly as they were, so turning it back on doesn’t re-list anything by surprise.

This is what a site changeover runs on. When a site is being rebuilt, both the old and the new one can be switched on together: each push goes to both, so the new site’s catalog stays current while it’s being tested. On the day the domain moves, you switch the old one off and leave the new one on. Nothing is deployed and no item data changes — it’s a settings change you make yourself.

When a site is rebuilt on a different system

A replacement site often doesn’t speak the same protocol as the one it replaces, so it gets its own credential group rather than reusing the old one’s fields. A modern one typically asks for:

  • FTPS host, username and password — the same idea as FTP, with the connection encrypted and the certificate checked.
  • Trigger URL — a single address JewelTrak calls after the file lands, instead of separate import and delete webhooks.
  • API token — sent as authorization on that call, so a link alone can’t start an import.
  • Run status URL (optional) — where JewelTrak asks how the import went. Leave it blank and it’s worked out from the trigger URL.

Sites like this usually cap how large one file can be. JewelTrak splits the feed into as many files as needed and sends them one at a time, waiting for each to finish before starting the next — you don’t configure anything for that, and a large listing run behaves the same as a small one.

Where the site reports back per item, a row it rejected is shown to you as a failure with the reason, rather than the push being reported as successful because the file itself was accepted.

Passwords are stored encrypted and only used at push time. To change a password, type the new one over the dots and save; leaving a password field blank keeps the existing value.

Use the Manage lookup lists button in the upper right to jump to the list editor (below).

Managing audited customers (memo hold)

Some clients need items that are on memo to a specific customer to come off the public site while they’re out — but stay on the dealer site — and automatically return to the public site when the memo comes back.

You control which customers this applies to yourself, with the Audited customers picker on the card config. Search for and add any customers whose memos should be audited; remove them when the arrangement ends. No code change or support ticket is needed — the list is yours to manage.

How it works once a customer is on the list:

  • Memo issued to an audited customer → the item is pulled from the public site, kept on the dealer site, and flagged JR Only.
  • Memo returned → the item is re-pushed to the public site automatically.

If the Audited customers list is empty, the feature is simply off. This behavior is specific to modules that declare it (Jewelry World does); other website modules won’t show the picker unless built with it.

The lookup-list editor

Settings → Integrations → Custom Website → Manage lookup lists manages the dropdown values that appear on the per-item panel.

Which lists you see depends on your module — each one declares its own, because each website expects its own categories. Jewelry World has five (main categories with a Jewelry / Watches filter, subcategories, stone types, other options, and other metals — the non-gold metals like Platinum and Palladium that sit outside the 9K–24K gold purities). Sunset has two (main categories and types). Unique Stones has three, nested two deep (category → subcategory → sub-subcategory), and each of its values also carries the WordPress ID — the term id on their site that the value maps to, which you’ll get from whoever runs the site.

A list whose values hang off another one shows its parent first (Rings › Eternity) and asks you to pick that parent when you add. Deleting a value also deletes everything filed under it, all the way down — deleting a category takes its subcategories with it.

Adding a value makes it pickable on every item. Renaming isn’t exposed — pipe-delimited references in per-item settings would silently break. To rename, add the new value, repoint the affected items, then delete the old value. Lists start empty after a fresh module install; populate them here before configuring items.

The per-item panel

Every supported jewelry item has a Website sub-tab under Sales Channels on its detail page. It’s laid out in three cards — Storefront content, Categorization, and Metal:

  • Item title — the short label under the main photo. Use AI to generate one in proper case (e.g. “18K Ladies’ Designer Diamond Necklace”).
  • Description — the verbose product description. Use AI to draft a marketing-style description from the item’s spec fields.
  • Main category + subcategories — drives storefront navigation.
  • Stones, options, gold purity, gold colors, other metals — multi-selects that get pipe-joined into the CSV. (Platinum is an Other metal, not a gold purity.)

The panel has its own Push to sites and Remove from sites buttons for acting on the single item you’re viewing. Remove from sites only appears once the item is actually listed. Push to sites saves your panel edits automatically before pushing — you don’t need to click Save first (Save is still there for storing a draft without pushing).

A website record is created the first time you Save or Push a panel. If one was created by mistake — for an item you never want online — use Delete website record to remove it entirely; the item then drops out of the bulk selection list and the inventory item itself is untouched. (Delete is only available once the item is not listed on either site — Remove it from the sites first so a live listing can’t be left orphaned.)

An item must be ready before it can be pushed. It’s ready only when it is in stock or on memo and has all of: a main category, an item title, a description, at least one image, and all three prices (Price 1, 2, and 3) set to a non-zero value. A status pill in the header shows Ready to push or Incomplete for push at a glance. If you click Push to sites before it’s ready, the panel highlights the missing title/description/main category inline (validated as you’ve typed them — no need to save first), and lists anything missing from the General tab (prices, an image, stock) in a banner with a one-click link to jump there. (These are the same prerequisites the bulk listings page uses to decide which items can be added.)

The bulk listings page

Online → Listings → Website is where you add/remove items in bulk. Select rows with the checkboxes, then use the buttons in the top right:

  • Add to sites — publishes the selected items to both sites now. Only items that are ready (in stock/on memo, with a title, description, main category, image, and all three prices) are sent; incomplete ones are skipped and flagged so they show under the Has push error filter (“Added 7 · 3 skipped”).
  • Remove from sites — removes the selected items from both sites now. (You can Add them again later — it re-publishes.)

Use Show selected only to review everything you’ve checked across all pages before acting. Add always delivers to both sites; the “keep it off the public site but on the dealer site” case is handled automatically by the audited-customer memo hold above, not a manual button.

Each row shows status badges:

  • JW — listed on the public site (green) or not (—).
  • JR — listed on the dealer site (green) or not (—).
  • JR Only badge — the item is currently held to the dealer site only (on memo to an audited customer).
  • Last push — when the most recent push ran and whether it succeeded.

Filter by listing state (Currently listed / Not listed / Has push error) and availability (In stock or On memo / Sold only / …) — e.g. Sold only + Currently listed surfaces sold items still on the sites so you can Remove them.

Auto-removal when an item sells out

When an item’s quantity on hand reaches zero — sold on an invoice, scrapped, or returned to a vendor — JewelTrak automatically removes it from both sites, the same way it does for Shopify and RapNet. Items currently out on memo are left to the memo hold above and are not auto-removed. JewelTrak never auto-re-lists an in-stock item; re-listing is always a deliberate push.

Image hosting

Images stay on JewelTrak’s CDN. The CSV emits absolute Cloudflare URLs, and the site’s plugin downloads them at import time. There is no image sync — JewelTrak remains the single source of truth for product photos. If a plugin can’t accept absolute image URLs, that’s a plugin-side update for your developer; copying every image to the client’s bucket would double storage cost and create freshness drift, so JewelTrak doesn’t offer it.

Troubleshooting a failed push

Errors surface in two places:

  1. Push response banner at the top of the bulk listings page — the immediate error from FTP or the webhook.
  2. Last push column on each row — the per-item status if a partial failure occurred.

Common causes:

  • Missing credentials — JewelTrak prompts you to enter them on the card before attempting any push (no partial run).
  • FTP password rotated / wrong — the host accepts the connection but rejects the login; JewelTrak aborts and prompts you to update the password. Fix it on the Custom Website card.
  • FTP host wrong or down — the error names the host. Verify with your developer.
  • Webhook 404 — the import URL is wrong or the plugin’s action name changed. Get the current URL from your developer.
  • The site rejected the file — the plugin answers with a message of its own (a column mismatch, an unreadable file, a PHP error). JewelTrak shows you that message word for word and records the push as failed, so nothing is marked as listed. Send your developer the message and the most recent CSV.

A push only counts as successful when the site itself says so. Plugins answer with a success flag rather than an HTTP error, so JewelTrak reads that flag — a push that the site refused is never recorded as listed.

JewelTrak has done its job once the CSV arrives at the FTP target and the site confirms the import. Beyond that, your web developer is the right escalation — they own the plugin that reads the file.