• Robert Hebert

How to Sync your Inventory from Square POS to Wix


Who is our client and what problem did they want to solve?


Our client owns a store that sells disc golf products from their physical store and on-demand at different events.


They needed a way to sync inventory levels between products sold in their brick-and-mortar store through their Square Point of Sales system to their product inventory in Wix.



What solution did we provide?


To do this, we imported their products from Wix into Square, then took the resulting catalog and imported it into a content manager database containing the Square Product ID, the Wix Inventory Item ID, and the Wix Product ID. Then we created a webhook within Square to send data to the Wix site whenever inventory was updated within Square.



What is a webhook?


Webhooks are a service many software providers offer to allow for custom integrations. Essentially, when a specific event happens in their system, they send the data from that event to a URL you provide where you can have code set to receive data from that URL.


For this specific client, whenever the webhook fires, it tells us which Square product has an inventory update and we can look it up in the content manager database to find out which Wix Product it correlates to and then use the 'incrementInventory' or 'decrementInventory' API from the 'wix-stores-backend' module to make the inventory adjustment.



Check out the code we used below:



import { ok, badRequest } from 'wix-http-functions';

import wixData from 'wix-data';
import wixStoresBackend from 'wix-stores-backend';

export async function post_inventoryUpdate(request) {
    const body = await request.body.json();

    const objectData = body.data.object.inventory_counts[0];

    const squareId = objectData.catalog_object_id;
    const quantity = objectData.quantity;


    const squareProduct = await wixData.query("SquareProducts").eq("squareId", squareId).find({ suppressAuth: true }).then(results => results.items[0]).catch(err => err);

    const wixProduct = await wixData.query("Stores/Products").eq("_id", squareProduct.productId).find({ suppressAuth: true }).then(results => results.items[0]).catch(err => err);
    

    const amountToChange = Math.abs(quantity - wixProduct.quantityInStock);
    if (quantity > wixProduct.quantityInStock) {
        // increment inventory
        console.log("Incrementing inventory");
        const incrementInfo = { productId: squareProduct.productId, variantId: squareProduct.variantId, incrementBy: amountToChange, inventoryId: squareProduct.inventoryId }
        wixStoresBackend.incrementInventory([incrementInfo]).then(() => {
          console.log("Inventory incremented by " + amountToChange)
          return ok();
        }).catch(err => console.log(err));;
    } else {
        // decrement inventory
        console.log("Decrementing inventory");
        const decrementInfo = { productId: squareProduct.productId, variantId: squareProduct.variantId, decrementBy: amountToChange, inventoryId: squareProduct.inventoryId }
        wixStoresBackend.decrementInventory([decrementInfo]).then(() => {
          console.log("Inventory decremented by " + amountToChange)
          return ok();
        }).catch(err => console.log(err));
    }

    return badRequest({body: 'Invalid request'});
}
    


Need help syncing your inventory or something else? Contact us at 225-250-1888 or email robert@roberthebertmedia.com.



About our company


RHM specializes in helping businesses of all sizes and across all industries achieve their digital and web marketing needs. Whether you are designing a new website, building an app, performing custom development, or running Google Ads, our goal is to showcase how you are the best at what you do and help people connect with you. Contact us at 225-250-1888 to get started!



9 views0 comments