POS User Guide Docs

Shopify & WooCommerce

Connect one or more online stores to Hyper POS. Products, customers and available stock can move from POS to each channel, while paid online orders return to POS for reservation, store allocation and fulfilment.

Who uses itOwners and commerce managers connecting and monitoring online stores.
Before you startPublic HTTPS on both sites, a working scheduler, provider credentials and unique product SKUs.
Where to find itOpen Sales channels, or go to /admin/commerce/connections.

How the integration works

You can keep Shopify and WooCommerce connections active at the same time, and add more than one store from either provider. Each connection has its own credentials, switches, store mappings, health, pending work and orders.

InformationDirectionWhat happens
Products, variants, categories, brands and primary imagePOS → channelPOS creates and updates the remote catalog. Deleting in POS archives the Shopify product or moves the WooCommerce product to Trash.
Available stockPOS → channelCurrent available quantity is sent after sales, purchases, adjustments, transfers, reservations and returns.
CustomersBoth directionsEligible POS customers are exported; signed customer webhooks can create or update POS customers.
Paid online ordersChannel → POSThe order is imported, matched by saved mapping or SKU, and reserved across eligible POS stores.
FulfilmentPOS → channelAfter staff fulfil a POS allocation, Shopify is fulfilled by line/location or WooCommerce is completed after all allocations finish.
Cancellation and refundChannel → POSOpen reservations are released; fulfilled refunds can create the matching POS return and restock.
POS owns the catalog and stock

Remote product and stock edits are not imported into POS. A later POS sync can overwrite channel-managed fields. Ordinary counter sales are not copied to Shopify or WooCommerce as orders; only their stock effect is synchronized.

Sales channels page listing connected Shopify and WooCommerce stores with health and synchronization status
Every online store is a separate connection with its own health, settings and work counts.

Before connecting a store

  • Give products and variants unique SKUs. Saved mappings are the permanent identity, but SKU is needed for safe onboarding and order matching.
  • Confirm Hyper POS has a correct public APP_URL, HTTPS certificate and public /storage link so providers can reach webhooks and product images.
  • Run the Laravel scheduler at least every minute. Commerce work is durable in the database, so Redis and a long-running queue worker are not required.
  • Create an active POS payment method for online orders. It records money already collected by the provider; it does not charge the shopper again.
  • Decide which POS stores will contribute stock and fulfil online orders, and how much safety stock each should keep offline.

Connect Shopify

The current Hyper POS connection uses Shopify's client-credentials flow. Create a merchant-owned app in the Shopify Dev Dashboard for the organization that owns the destination store, release its configuration and install it on that store.

  1. Create and configure the app

    In the Shopify Dev Dashboard, create an app, add a version and select the required Admin API scopes:

    write_products
    write_inventory
    read_locations
    write_locations
    read_publications
    write_publications
    write_customers
    read_orders
    write_merchant_managed_fulfillment_orders

    If you will import customers or orders, configure the required protected customer data for customers, orders, name, address, email and phone.

  2. Release and install the app

    Release the app version and install it on the exact Shopify store. If you change scopes later, release the change and approve the new access before retesting.

  3. Copy the credentials

    Open the app's settings and copy its Client ID and Client secret. Keep the secret out of screenshots and support messages.

  4. Add the connection in POS

    Open Sales channels → Add channel, choose Shopify, enter a helpful name, the permanent store-name.myshopify.com domain, Client ID and Client secret. Use the configured Admin API version in YYYY-MM format.

  5. Choose what to synchronize

    Enable products, customers and/or online orders. If importing orders, choose the POS payment method. Enable Publish to Shopify Online Store when active POS products and POS-managed collections should be published automatically.

  6. Save, test and map locations

    Save first, then click Test connection. A successful test obtains a fresh token, reads Shopify locations and registers signed order/customer webhooks. Map every eligible POS store to the correct Shopify location and save.

  7. Run the first reconciliation

    Click Sync now. Keep the page open long enough to confirm work is queued, then let the scheduler drain the catalog, customer and inventory work.

Current Shopify dashboard guidance is available in Shopify's official Dev Dashboard app guide.

Hyper POS Shopify connection form showing store domain, client credentials and synchronization options
Use the permanent myshopify.com domain and credentials from the app installed on that store.

What Shopify receives

  • Product title, description, active/draft state, options, variants, SKU, barcode, selling price, MRP as compare-at price and stock-tracking state.
  • POS brand as Shopify Vendor.
  • POS category breadcrumb as Product Type, plus POS-managed collections for the category path. Merchant-created collections are left alone.
  • The current primary POS product image. Gallery and variant images are not synchronized in this release.
  • Location stock in location mode, or combined stock at a shared Shopify location in aggregate mode.

Connect WooCommerce

  1. Prepare WooCommerce

    Use a current WooCommerce store with a public HTTPS URL. Under WordPress Settings → Permalinks, choose anything except Plain. Under WooCommerce → Settings → Products → Inventory, enable stock management.

  2. Generate an API key

    Go to WooCommerce → Settings → Advanced → REST API, add a key named Hyper POS, select a user allowed to manage products, customers, orders, webhooks and settings, and choose Read/Write. Generate the key and copy the Consumer key and Consumer secret before leaving the page.

  3. Add the connection in POS

    Open Sales channels → Add channel, choose WooCommerce, enter the site root such as https://shop.example.com—not the /wp-json/wc/v3 path—and add the Consumer key and secret.

  4. Set webhook and sync options

    Leave the webhook signing secret blank to let POS create one, or enter a strong existing secret. Choose product, customer and order switches and the POS payment method for imported orders.

  5. Save, test and map stores

    Save, then click Test connection. Configure each POS store mapping, inventory switch, order switch, priority and safety stock. WooCommerce has one core stock pool, so enabled POS store quantities are combined.

  6. Run the first reconciliation

    Click Sync now and monitor Pending work, Failed work and Last sync while the scheduler processes it.

See WooCommerce's official REST API key guide and webhook settings guide if the provider's labels move.

Hyper POS WooCommerce connection form showing site URL, API keys, webhook secret and synchronization options
Enter the WooCommerce site root and a Read/Write REST API key belonging to a suitable WordPress user.

If WooCommerce webhooks are not registered automatically

Open the saved connection in POS and copy its Webhook URL and signing secret. In WooCommerce, go to Settings → Advanced → Webhooks and create one active webhook for each topic below, using the exact same delivery URL and secret:

  • order.created
  • order.updated
  • order.deleted
  • customer.created
  • customer.updated

Map POS stores and stock

After testing a connection, its store-mapping table appears. For each POS store, choose the remote location or online pool and set:

FieldMeaning
ModeLocation sends one POS store to one Shopify location; Aggregate combines mappings that share a location; Disabled sends no inventory.
PriorityThe lowest number is considered first when a paid online order is allocated.
Safety stockQuantity withheld from online availability.
InventoryAllows this POS store to contribute availability.
OrdersAllows this POS store to reserve and fulfil channel orders.
ActiveMaster switch for this mapping.

Online availability is calculated as on hand − reserved − safety stock, never below zero. The quantity sent is absolute—not an incremental adjustment.

Sales-channel store mapping table with remote locations, inventory modes, priorities and safety stock
Map each POS store deliberately; priority controls allocation order and safety stock protects shop-floor availability.

Sync now, health and retries

  • Test connection checks credentials, refreshes remote locations and attempts webhook registration.
  • Sync now queues a full current reconciliation. It does not pull remote products or remote stock into POS.
  • Pending work is safe database-backed work waiting for its due time or the scheduler.
  • Failed work needs its displayed cause fixed—credentials, permissions, mapping, public image URL or provider availability—before retrying.
  • A provider outage never rolls back a completed local sale or stock movement. The work remains queued and retries with increasing delay.

After correcting a remotely deleted product or stale mapping, click Sync now. The manual run force-checks current POS products so missing remote records can be recreated and remapped.

Troubleshooting checklist

ProblemCheck
Shopify authentication or missing-scope errorConfirm the app belongs to and is installed on the exact store, the released version includes all required scopes, new scopes were approved, and saved credentials were retested.
Protected customer data errorConfigure customers/orders plus the required name, address, email and phone fields in the Shopify app, then release and retest.
WooCommerce cannot connectCheck HTTPS, site-root URL, non-Plain permalinks, /wp-json/wc/v3 access, Read/Write key, associated user permissions and security/firewall plugins.
Products appear but stock is zeroCheck active store mappings, Inventory switch, correct remote location, safety stock, POS on-hand/reserved quantities and pending/failed inventory work.
Product image is missingOpen the POS image URL in a signed-out browser. Confirm APP_URL, HTTPS and the storage link are public.
Orders do not arriveConfirm Import online orders is enabled, the order is paid, webhook is active, URL/secret are exact, provider delivery succeeded and the scheduler is running.
Pending count does not fallCheck cron heartbeat and whether the work is due. Do not delete pending rows merely to clear the number.

Credential and recovery safety

  • Never place Client secrets, Consumer secrets, tokens or webhook secrets in screenshots, URLs, logs or support tickets.
  • Back up the installation's APP_KEY securely with the database. Connection credentials and sensitive payloads are encrypted with it.
  • Disconnecting a POS connection removes local access to that integration; it does not delete the remote store. Verify its effect before confirming.
  • Use one normal Laravel scheduler entry. Do not add overlapping commerce workers unless your hosting arrangement has been reviewed.

Related: Channel orders · Cron job setup · Products · Inventory · Customers