Setting up Oyster for WooCommerce

A WordPress plugin that puts the Oyster skin scan on your site and connects it to your Oyster vendor account. There is no code to write and no key to paste. Budget half an hour. Written for version 0.21.0.

A plugin, not a snippet

You install it, log in once, and configure it from a new Oyster menu in wp-admin. The widget keys and allowed domains are handled for you when you connect.

It works without a catalogue

If you are a clinic or a practice that sells treatments rather than products, you can skip catalogue sync completely. Pick your path below.

Pricing stays on the dashboard

What a shopper pays for a scan, your treatments, your analytics and your billing all live in the Oyster dashboard. wp-admin owns the storefront side only.

What the plugin does

Four pieces, none of which you write
1. The plugin connects your site to your Oyster vendor account and holds the credential.
2. Your site shows the scan: a floating launcher, a block, a shortcode or a page of its own.
3. Oyster runs the analysis and builds the recommendations from your catalogue, your treatments, or both.
4. Your checkout takes the sale, and the order is credited back to the scan that drove it.

Everything on the Oyster side is reached with a credential that belongs to this site, created when you connect and retired when you disconnect. No API key is ever pasted into wp-admin, and the only key that reaches a shopper's browser is the widget public key, which identifies your account without authorising anything on its own.

This guide covers the plugin. If you want to embed the widget by hand on a site that is not WordPress, see the Web SDK docs; for an iOS or Android app, see the mobile guide.

Which setup are you

Two paths, and what each one skips

Steps 1, 2, 4 and 5 are the same for everyone. Step 3 is where the two setups diverge, so read the one that is yours and skip the other. Sections that apply to only one path are labelled, here and in the sidebar.

You sell products Stores

A shop with a skincare catalogue in WooCommerce. Scans produce a routine built from your own products, and the recommended items add to your cart.

  1. Install the plugin
  2. Connect your store
  3. Choose what syncs, then import
  4. Put the scan on your site
  5. Scan payments, if you collect them

Skip: Turn on treatments.

You offer treatments Clinics

A clinic, spa or practice selling procedures rather than stock. Scans produce treatment recommendations drawn from the procedures you keep in the Oyster dashboard.

  1. Install the plugin
  2. Connect your store
  3. Turn on treatments, turn off products
  4. Put the scan on your site
  5. Scan payments, if you collect them

Skip: Choose what syncs and Better recommendations. Nothing syncs unless you ask it to, so there is nothing to switch off.

Clinics still need WooCommerce installed and active. The plugin will not load without it, even if you never sell a product. It uses WooCommerce for the background job queue that talks to Oyster, and for the checkout if you take scan payments yourself. An empty WooCommerce install is fine.

Doing both is supported and needs no decision here: follow the store path for your catalogue and the treatments section as well. Oyster matches each scan against whichever of the two you have enabled.

Before you start

Five minutes of checks
WhatNeeds
WordPress 6.4 or newer.
WooCommerce 8.0 or newer, installed and active. High-Performance Order Storage is supported.
PHP 8.1 or newer. The plugin refuses to boot below this and says so in wp-admin rather than failing on activation.
HTTPS A real certificate on a public hostname. Oyster sends scan events back to your site, which a local or password-protected staging site usually cannot receive.
An Oyster account A vendor account with its email verified. Create one at dash.oysterskin.com/register if you do not have one. A customer account cannot connect a store.
WP-Cron Working. Catalogue sync and the scan-event handlers run as background jobs on WooCommerce's scheduler, which WP-Cron drives. A site with cron disabled and no replacement will show a sync that starts and never finishes.
Who can set it up An administrator, or anyone with the manage_woocommerce capability, which is Shop Manager and above.

You do not need a widget public key, an API key, or a list of allowed domains. Connecting creates all three for you, and re-connecting refreshes them.

1. Install the plugin

Upload a zip

The plugin is not on the WordPress.org directory yet, so it installs from a zip rather than from the Plugins search. Updates arrive on your Plugins screen afterwards the same way every other plugin's do.

  1. Download the plugin from the latest release. Take the oyster-woocommerce.zip asset, not the "Source code" archive, which carries files your site does not need. That link always resolves to the current version, so it is worth bookmarking. It is also linked from Apps in your Oyster dashboard.
  2. In wp-admin, go to Plugins → Add New Plugin → Upload Plugin, choose the zip and install it.
  3. Activate it. A new Oyster menu appears below WooCommerce.
# Or from the command line, if you have WP-CLI
wp plugin install https://github.com/oysterai/oyster-woocommerce/releases/latest/download/oyster-woocommerce.zip --activate
If activation shows a requirements error, the plugin has stopped itself rather than breaking your site. It will say whether PHP is too old or WooCommerce is missing. Fix that and the menu appears on the next page load.

2. Connect your store

Log in once, then a code

Go to Oyster → Connection and log in with your Oyster vendor email and password. Connecting produces a credential this site keeps using, so Oyster then emails you a six-digit code to confirm it is really you. Nothing is written to your site until you enter it, and a login you abandon leaves no trace.

  1. Enter your Oyster email and password, then Connect.
  2. Enter the code from your inbox, then Finish connecting. The code lasts about ten minutes and works once.
  3. The screen turns into a green "Connected to Oyster vendor" panel with a setup checklist under it.

Connecting does four things on your behalf: it records this site on your vendor account, makes sure the account has widget keys, adds this site's address to your allowed domains, and registers the address Oyster sends scan events to. That is why there is nothing to copy.

When a code is refused

What you seeWhat to do
That code was not accepted Wrong, expired, already used, or too many attempts. Oyster does not distinguish between these. Press Send a new code and try the fresh one.
That took too long The login step is parked for ten minutes only. Log in again.
Too many codes requested Wait a few minutes. Code requests are rate limited per account.
That account is not an Oyster vendor account You are signed in with a customer account. Use the vendor account, or create one.
Your account needs email verification Verify the address from Oyster's signup email, then come back.
A message naming another store That Oyster account is already connected to a different site. The message says which, and what to do. Disconnect it there first, or use a separate vendor account.

The setup checklist, and the scan-event line

The connected screen carries a Get set up with Oyster checklist that tracks the remaining steps from your real settings, so it ticks itself off as you go. Dismiss it when it is complete.

Under the connection status is a line about scan events and the address they are delivered to. Nobody types that address: it is there to be checked. If it ever says this site now answers somewhere else, your domain changed after you connected, and events are going to the old address. Reconnect to update it.

Disconnecting retires the credential at Oyster before clearing it here, so a site you disconnect is disconnected on both sides. Your synced products and your scan history stay in your Oyster account; only this site's access ends.

3. Choose what syncs, then import Stores

Nothing syncs until you choose
This is the step people miss. Out of the box the sync scope is an empty allow-list, which means nothing syncs. That is deliberate: a store that never opens this screen must not dump its whole catalogue into Oyster by accident. Until you choose a scope and run an import, Oyster has no products of yours to recommend.

Open Oyster → Catalog. Pick a scope, save it, then press Sync now for the first import.

ScopeWhat it does
Sync all published products Everything published. Right for a store that is entirely skincare.
Only selected categories or tags An allow-list. Right for a general store where only part of the catalogue is skincare. This is the default, with nothing selected.
All except selected categories or tags A deny-list. Right when it is easier to name the exclusions, such as gift cards and merchandise.

Categories and tags combine with OR inside whichever list is active: a product matches if it carries any of the terms you ticked, from either taxonomy. Variations have no terms of their own in WooCommerce, so each one is judged by its parent product.

What syncs, and when

  • Published simple and variable products only. Drafts, private products, grouped products and external products are never sent.
  • A product needs a name and a price to be accepted. One without either is skipped rather than sent and rejected.
  • Saving a product re-syncs it on its own, scoped to whatever you chose here. You do not need to press Sync now after an ordinary edit.
  • Sync now is for the first import, and for forcing a full re-sync after a bulk change made by a tool that does not fire WooCommerce's usual save hooks, which some CSV importers do not.

A full import runs in the background in batches and reports created, updated, claimed and failed counts as it goes. Refresh the screen to watch it. A large catalogue takes a few minutes.

Products that did not sync

If Oyster rejects anything, a red panel lists the products by name with the reason beside each and a link straight to the editor. Fix the product and save it, which re-syncs it, or use Sync now to retry them all. The panel lists the twenty most recent and links to the full filtered list when there are more.

Better recommendations Stores

Three fields worth filling in

Price, stock, images, brand, primary category and weight all sync on their own. Three things only you know, and they are what moves a recommendation from plausible to right. All three are on the product edit screen and all three sync with everything else.

FieldWhereWhat it is for
Oyster ingredients Product data, one ingredient per line Oyster reads the list to recommend the product to the shoppers it suits, and to steer away the ones it does not.
Skin Type A product attribute, created for you on activation Normal, Dry, Oily, Combination, Sensitive, Acne-prone, Mature. Tick every type the product is for.
Oyster size / volume Product data, a number plus its unit Shown to the shopper and factored into recommendations. Leave blank where it does not apply.

All three are available to the WooCommerce product CSV importer, so a large catalogue can be filled in one pass rather than product by product.

3. Turn on treatments Clinics

Both switches live on the dashboard

Treatments are not a WooCommerce concept and none of this happens in wp-admin. Your procedures live in the Oyster dashboard, Oyster matches each scan against them, and the widget shows the matches to the customer. There is no catalogue to sync and no product to create.

  1. Have treatment recommendations enabled on your account. Contact [email protected] to ask for it. Until it is enabled, the Treatment Recommendations card described below does not appear on your dashboard, which is the quickest way to tell where you stand.
  2. Add your procedures in the Oyster dashboard under Procedures. Each one carries the detail Oyster matches a scan against. You can add them one at a time or import a list.
  3. Turn on "Show treatments to customers" in the dashboard under Settings → Scan Settings, in the Treatment Recommendations card. This defaults to off. Your own team always sees matched treatments on the scan report; this switch is what adds them to the widget results and the scan-result email that reaches the customer.
  4. Turn off "Recommend products after a scan" in the same screen, in the Product Recommendations card. See the warning below for why this matters.
Turn product recommendations off, or your scans will recommend products you do not stock. A new account starts with a small sample catalogue, so that a first scan returns something rather than an empty routine. Those samples drop out as soon as a product of your own arrives, which for a clinic never happens. Switching product recommendations off drops the products section from both the widget and the result email, and leaves the treatments section in its place.

Customers only ever see the procedures you have added. Nobody is told to ask for a treatment you do not offer, so an empty Procedures list means an empty treatments section however the rest is configured.

What you can skip

Oyster → Catalog in wp-admin does not apply to you. You can leave it untouched: the default scope syncs nothing, so there is no switch to turn off and no import to avoid. The same goes for the ingredients, Skin Type and size fields on products, and for the order attribution that credits a product sale back to a scan.

Everything else in this guide does apply. Carry on at Put the scan on your site.

4. Put the scan on your site

Four placements, same widget

All four read the same settings and show the same scan. Use as many as you like. Everything here is under Oyster → Widget.

PlacementHowGood for
Floating launcher Tick Show floating launcher. A button on every page. The usual starting point.
Block Add the Oyster Skin Scan block to any page or post. The scan inside a page you have written around it.
Shortcode [oyster_scan], or [oyster_scan height="480"]. Classic editor, page builders, and theme templates.
Scan page Press Create scan page. A link to send people, without putting the scan on your site at all.

The scan page

This builds a real page at /skin-analysis titled "AI skin analysis", with a headline, a three-step explainer, the scan and an FAQ. It is an ordinary page, editable like any other, so change the copy to suit you. It starts out unlisted: search engines, your site's own search and auto-generated menus all skip it, so only people with the link reach it. Press Make it discoverable when you want it treated like any other page. You can add it to a menu yourself either way.

Launcher settings

SettingWhat it does
Show floating launcher Off by default. A site should not gain a floating button nobody asked for.
Primary color A hex colour. Leave blank to use the colour from your Oyster dashboard.
Intro message The headline on the launcher. Defaults to "Skin issues?".
Message body The line under it.
Show Oyster logo Whether the launcher carries the Oyster mark.
Auto-open on load Opens the scan by itself. Ignored on the cart and the checkout, where a shopper has already decided what they are buying.
Position Which corner the launcher sits in. Use it when a chat bubble, cookie banner or back-to-top button already owns that corner. Blank uses the position from your dashboard.
Distance from the edges How far from each of that corner's edges, in pixels, up to 500. Blank uses the spacing from your dashboard, which is narrower on a phone. Set it per field: a corner on its own still takes the spacing from the dashboard.
Layer (z-index) The stacking order the widget paints at. Give it a number below your own pop-ups to let them open over the widget. Blank uses the value from your dashboard.

Blank and zero are different answers for the offsets, which is why they are not pre-filled. Blank leaves the widget its own margin; 0 pins the launcher flush to the corner.

Layer arrives in a plugin release newer than 0.21.0. The same control is already on your dashboard, under Widget Manager, as Widget layer (z-index), and it applies to your storefront whether or not the field has reached wp-admin yet. Note that zero is not an answer here, unlike the offsets: the launcher sits one layer below the panel it opens, so the lowest the widget accepts is 1.

Where the scan deliberately does not appear

PageBehaviour
Cart and checkout Auto-open is ignored. The launcher stays, so a shopper can still start a scan by choice.
The pay page for a scan payment No launcher at all. That page opens in a popup mid-scan, so a launcher there would invite a shopper to start a scan on top of the one they are paying for.
Ordinary pay-for-order pages Untouched. That is your own sale.

The scan payment page carries a body class you can target, if your own site greets visitors with a popup or banner you would rather hide there:

body.oyster-scan-payment .newsletter-modal { display: none; }
Nothing renders? Clear your caches before anything else. The launcher is written into your pages on the server, so a cached copy from before you turned it on keeps being served. See Caching and the launcher.

5. Scan payments

Only if you collect them

A scan can be free, paid to Oyster, or paid to you. Open Oyster → Scan payments and the screen tells you which of those you are on, because it is set on your Oyster account rather than here.

What the screen saysWhat it means
Oyster collects scan payments for your store Shoppers pay Oyster directly and never reach your checkout. Nothing on this screen applies to you.
A Pricing section and a Payment methods section You collect scan payments on your own gateway, through your own WooCommerce checkout. Read on.
Your connection is not permitted to read your scan setup Reconnect your store from Oyster → Connection. It renews the credential and changes nothing else.

When you collect, a shopper who starts a paid scan is sent to your checkout to pay for it, and the scan is released the moment the order is marked paid. What they pay, and any scan pack you sell, are set on your Oyster dashboard and read from there. There is no price field in wp-admin, so a change you make on the dashboard takes effect without a plugin update.

Choosing which methods a scan may use

Tick the methods a scan may be paid with. Only methods your checkout already has enabled are listed, so an absence here means WooCommerce is not offering it, not that the plugin does not support it. Ticking nothing offers every enabled method, which is the behaviour every store had before this setting existed.

If every method you ticked is later disabled in WooCommerce, shoppers have no way to pay for a scan. The screen raises an error the moment that state exists, so it is worth revisiting after any change to your gateways.

If you ever see "scan payments are not reaching Oyster" on any admin screen, act on it. It means your store is taking money for scans that are never delivered, and the order looks completely normal: paid, complete, nothing to review. The notice says what is failing and since when, and it appears everywhere in wp-admin rather than only on this screen because nobody would otherwise come looking.

Methods that take money up front

The one that costs real money

Applies to stores collecting scan payments through their own checkout. A scan is delivered the moment the order is marked paid, and it cannot be taken back. Allow a scan to be paid for only with methods that actually capture money at that point.

For a physical order an offline method is a promise you can chase: goods are not shipped until the money arrives, so a cheque that never clears costs you postage at worst. A scan gives up its value immediately. The order reaches a paid state, the scan is released, the shopper takes it, Oyster runs the analysis, and Oyster bills you for it. There is no parcel to hold back.

VerdictMethodsWhy
Allow Card gateways with immediate capture, mobile money, wallets such as Apple Pay and Google Pay, hosted payment-service checkouts, instant bank transfer gateways that confirm settlement back to the store Money is taken before the order reaches a paid state, so the scan and the payment happen together.
Keep off Cash on delivery, cheque payments, direct bank transfer (BACS), pay by invoice, any pay-later or manual-reconciliation method These move an order into a paid state with no money having changed hands. The scan is handed over, you are billed, and nothing was collected.
Check first Gateways that authorise now and capture later, gateways with a manual review or pending-verification state, and any gateway set to auto-complete orders What matters is whether funds are captured at the point the order is marked paid. Test one before allowing it.

Offline methods are genuinely useful while you are testing on a staging site, which is why this is a choice rather than a ban. Run one real scan payment yourself on the live store and confirm the money arrived at the gateway, not just that the order says paid.

Caching and the launcher

The commonest "it does not work"

The plugin runs inside WordPress, so it writes your widget configuration into the page as an inline script and prints the launcher's markup into the footer. Both are part of the HTML your server generates. A full-page cache stores that HTML and serves the stored copy to the next visitor, so a copy made before you configured the plugin has no launcher in it and will keep being served until it is purged.

The tell: caches almost always bypass logged-in users, so the signature is that the launcher shows for you as an administrator and not for a logged-out visitor, or shows on a page you just edited and nowhere else. Always confirm in a private window, logged out, before concluding anything.

The layers to clear

There is usually more than one, and clearing a single layer is the common reason a purge appears not to work.

LayerWhere
Caching plugin WP Rocket, W3 Total Cache, WP Super Cache, LiteSpeed Cache, Autoptimize and similar. Use the full "clear all cache" action, not a single page.
Host-level cache Managed WordPress hosts run their own page cache, usually with a button in wp-admin or in the host's control panel. Varnish and NGINX FastCGI caches sit here too.
CDN or proxy Cloudflare and similar cache HTML on some configurations. Purge everything, and check any "cache everything" page rule.
Object cache Redis or Memcached, where the site uses one. Flush it if settings appear not to have saved at all.

When to purge

  • After turning the launcher on, or changing its colour, copy, logo, position, layer or auto-open setting.
  • After connecting or reconnecting, because the widget public key in the page changes.
  • After creating the scan page, or making it discoverable.
  • After adding the block or shortcode to an existing page.
  • After updating the plugin.

Pages that should never be cached

Standard WooCommerce practice, and most caching plugins do it by default, but worth verifying on a store taking scan payments: cart, checkout and account pages; the pay page for an order, which is where a shopper pays for a scan; and the plugin's routes under /wp-json/oyster-woocommerce/. Those are POST requests, which most caches skip on their own, but an aggressive edge rule needs an explicit bypass.

If purging does not fix it

Open a page in a private window, view source, and search the HTML for OysterWooConfig and data-oyster-widget.

What you findWhat it means
Neither is present The HTML is still stale, or the launcher is off, or the store is not connected, or it has no widget public key yet. Check Oyster → Widget then Oyster → Connection, in that order.
Both present, nothing renders The problem is in the browser. Open the console and look for messages prefixed [oyster]. The plugin logs its diagnostics there on purpose and never prints error text on your site.
Console says no public key The store is connected but the vendor account has no widget public key. Finish widget setup on the Oyster dashboard, then reconnect to pull it in.
Console shows a failed script load The bundle was blocked. Usually a JavaScript optimisation plugin, a content security policy that does not allow widget-lib.oysterskin.com, or a browser extension.

Optimisation features that combine, defer or delay JavaScript can separate the inline configuration from the loader script, or postpone the loader past the point where it looks for anchors. If the markup is in the page but the widget never boots, exclude the plugin's loader script and its inline configuration from those features, then purge again.

Attribution and orders Stores

What gets credited, and the cookie to declare

Recommended products add straight to your WooCommerce cart, and a resulting paid order is credited back to the scan that drove it in your Oyster dashboard. Two things make that work, and only the second needs anything from you.

  • A shopper who checks out from inside the scan carries the scan with them.
  • A shopper who finishes a scan, closes the widget and buys later through your ordinary pages is matched by a first-party cookie, so those sales count too. Every paid order containing a product you have synced is reported, which also credits a shopper Oyster already recognises from a different device.

A purchase is only ever credited when the order contains something that scan recommended. Orders made up entirely of products you have not synced are never sent at all, since nothing in them could be attributed. Attribution applies to orders placed from the moment you install onwards: an order already in your store cannot be credited retrospectively, because nothing recorded a scan against it at the time.

If you run a consent banner, list this cookie: oyster_scan_batch, first-party, 90 days. It holds one opaque scan id and nothing else, and is never sent to a third party by the browser. A shopper who blocks or clears it is simply not matched that way.

What an order carries, and what leaves your site

An attributed order stores a batch id, a routine id and a widget attribution id, all opaque identifiers, plus a note when the scan was matched from the browser rather than from a checkout started in the widget. They are included in WordPress's own Tools → Export Personal Data and Tools → Erase Personal Data requests alongside the rest of that order.

Once an order is paid, what Oyster receives is the order id and number, its line items, totals and currency, the billing email, and those scan identifiers. The email is used only to look up a shopper who has already scanned with you. It does not create an account, and an order Oyster cannot attribute is discarded.

For developers

Two actions and a filter

Two actions fire when Oyster reports on a scan at this store. They arrive as signed server-to-server requests, so they fire whether or not the shopper still has your site open. A repeated delivery fires once, though a handler should be safe to run twice anyway.

add_action( 'oyster_woocommerce_scan_completed', function ( $batch_id, $event ) {
    // Fires when a scan has finished analysing.
    // $event['data'] carries batch_id, vendor_id and channel.
}, 10, 2 );

add_action( 'oyster_woocommerce_recommendations_ready', function ( $batch_id, $event ) {
    // Fires when that scan's routine is ready.
}, 10, 2 );

Neither action carries the skin analysis. That is deliberate: a customer's results are not copied into your site's logs or handed to anything you hook up later. To read the detail, ask Oyster for it with this store's own connection, which never exposes the credential:

$result = apply_filters( 'oyster_woocommerce_api_get', null, $path );
// Decoded response body, or a WP_Error carrying the HTTP status.

$path is the Oyster API path you want. Ask support which one answers the question you are asking, and whether your account can read it.

Nothing to configure for any of this: the callback is registered when you connect and removed when you disconnect, and access ends with it. Your site does need to be reachable over HTTPS from the internet. Oyster → Connection shows when the last event arrived.

Staging and overrides

wp-config constants, never filters

Three URLs can be repointed, for building against a sandbox account. Each is read from a wp-config.php constant and nothing else.

ConstantRepoints
OYSTER_WOO_API_BASE_URL Where the plugin talks to Oyster.
OYSTER_WOO_WIDGET_BUNDLE_URL The widget script your pages load.
OYSTER_WOO_DASHBOARD_URL Where the "Open Oyster dashboard" buttons in wp-admin point.

A value is accepted over https only on Oyster's own domains, and over http only on a loopback host for a local tunnel. Anything else is rejected and logged, and the default is used. Ask us for the sandbox values rather than guessing them, since accounts and keys are not shared between environments.

None of the three is filterable, and that is on purpose. A WordPress filter has no permission model, so any active plugin or theme could hook one and silently redirect API traffic, swap in a script that runs on every visit, or repoint an admin's dashboard link at a lookalike page. wp-config loads before any plugin code, which a normally-installed plugin cannot race.

Updates

Normal Plugins screen

The plugin checks its own releases and offers updates on your Plugins screen the way a directory-hosted plugin would, so there is no second zip to upload after the first one. Auto-updates can be enabled for it from the same screen.

Deactivating stops the widget showing and stops sync, and leaves your connection and settings in place for when you activate it again. Deleting removes them. Your products, scans and history stay in your Oyster account either way.

Purge your caches after an update, for the reasons in Caching and the launcher.

Troubleshooting

Symptom to cause
What you seeWhat it is
No Oyster menu after activating PHP below 8.1, or WooCommerce not active. The plugin stops itself and says which, as an admin notice.
Launcher shows for you, not for visitors A page cache. Confirm in a private window and clear every layer. See Caching and the launcher.
Launcher nowhere, even logged out and purged Either it is switched off, the store is not connected, or the vendor account has no widget public key. The Widget screen warns about the last of those.
Nothing syncs, no error The sync scope is the default empty allow-list. Pick a scope on Oyster → Catalog. The screen says so in a yellow notice whenever that is the live state.
"Sync in progress" that never finishes Background jobs are not running. Check WP-Cron, and WooCommerce's own scheduled actions under WooCommerce → Status → Scheduled Actions.
A product never appears in Oyster It is unpublished, it is a grouped or external product, it has no price or no name, or it falls outside your sync scope. Only published simple and variable products sync.
Products listed under "did not sync" Oyster rejected them and the reason is beside each one. Fix the product and save it to re-sync.
Scans recommend products a clinic does not stock Product recommendations are still on, and the account's sample catalogue is being used. Turn them off under Settings → Scan Settings on the dashboard. See Turn on treatments.
No Treatment Recommendations card on the dashboard Treatment recommendations are not enabled on your account yet. Mail [email protected].
Treatments section empty for customers Either "Show treatments to customers" is off, or you have no procedures of your own. Customers are only ever shown yours.
Scan events never arrive Your site is not reachable over HTTPS from the internet, or it moved domain since you connected. The Connection screen says which, and reconnecting fixes the second.
"Scan payments are not reaching Oyster" Shoppers are paying for scans they will not receive. Act on it now, and read the reason on the notice.
Scan paid for, never delivered Usually an offline payment method marking an order paid with no money taken. See Methods that take money up front.
A sale from a scan is not credited The order contained none of your synced products, or the shopper blocked the cookie and Oyster did not already recognise them. Orders placed before you installed are never credited.
Launcher sits on top of your chat bubble Move it with Position and Distance from the edges, or put the widget on a lower Layer than your own pop-ups.

Launch checklist

Before you tell anyone
  • Connected, with a green panel and no widget-key warning.
  • Scan events confirmed arriving, and the address on the Connection screen matching your live domain.
  • Catalogue scoped and imported, with the failures panel empty. Stores
  • Ingredients, Skin Type and size filled in on at least your best sellers. Stores
  • Treatments enabled on your account, your procedures added, and "Show treatments to customers" on. Clinics
  • Product recommendations off, so no sample products are recommended. Clinics
  • Placement chosen, and verified in a private window while logged out.
  • Caches purged at every layer, including your CDN.
  • Launcher position checked on a phone as well as a desktop, against your own chat bubble and cookie banner.
  • Payment methods for scans limited to ones that capture money up front, with one real payment tested end to end.
  • Consent banner listing oyster_scan_batch, if you run one.
  • One full scan run on the live site, start to finish, by you.

Something not covered here, or behaving differently from what this says? Mail [email protected] with your store URL and what you were doing, and we will take a look.