POS Integrations

Connect your point-of-sale system to Tabsy in minutes. Once connected, every completed sale automatically generates a digital receipt - no code, no servers, no manual work.

New to Tabsy? Start in the Retailer Portal under Integrations. Everything is set up from there.

How it works

Most supported POS systems connect through a simple one-time OAuth flow; a few (WooCommerce, Odoo, Epos Now) use a quick webhook setup instead. After that, Tabsy handles everything automatically:

Connect your POS in the Retailer Portal

Go to Retailer PortalIntegrations, click Connect next to your POS, and sign in with your POS account. Takes about 60 seconds.

Shopper shows their Tabsy QR at checkout

The cashier scans it with any barcode scanner - it auto-types TABSY:CODE into the POS note field. No typing needed. Alternatively, the shopper can show their Apple or Google Wallet card. If no code is scanned, the customer's email or phone on file is used as a fallback.

Receipt appears instantly

The moment the sale completes, Tabsy receives the transaction, matches it to the shopper, and the receipt appears in their Tabsy account - no action required from you or the customer.

Where the POS provides one (e.g. Square, Shopify), Tabsy also stores a link to the original POS receipt - open it any time from the Retailer Portal → Receipts drawer via "View original receipt".

Customer identification

Tabsy matches each transaction to a shopper using the following priority:

MethodHow it worksReliability
Member codeCashier scans the shopper's Tabsy QR - scanner auto-types TABSY:CODE into the note field. Also works from Apple/Google Wallet card.Most reliable - always matches the right account
EmailCustomer's email on file with the POS matches their Tabsy account (automatic on most POS systems)Good - fails if email differs between accounts
PhoneCustomer's phone number matches their Tabsy profile (automatic where POS provides it)Fallback - used when email is unavailable
GuestNo match found - receipt stored and claim email sent to customerAlways works - shopper can claim later
Cashier tip: When a shopper shows their Tabsy QR (or Apple/Google Wallet card), the cashier scans it with any barcode scanner into the POS note field - it auto-types TABSY:CODE. Zero typing. No scanner? Type the tag into the note by hand - and it accepts an email or phone too, e.g. TABSY:jo@example.com or TABSY:+971581234567 - so you can link a walk-in who has no member code and isn't saved as a customer. Type phone numbers without spaces.
Member code vs phone: a number typed in the note is never confused between the two - Tabsy checks it as a member code first (member codes are short, 4-12 characters) and only treats it as a phone if it doesn't match a member. So a phone number is never mistaken for a member code, or vice versa.

What's captured on each receipt

Tabsy pulls as much detail as the POS provides, so the shopper's receipt is as complete as possible:

  • Store & branch, date and time, and a link to the original POS receipt where the POS exposes one.
  • Totals - subtotal, tax, discount, grand total, currency, and payment method.
  • Cashier / salesperson and invoice number where available.
  • Each line item - name, quantity, unit price, and, when the POS provides them, SKU, category, and per-item tax and discount. Categories also become filterable tags in the shopper's app.

Square

Tabsy connects to Square via OAuth. Every completed payment is automatically captured - including Square Terminal, Square Register, and in-person payments.

Step 1 - Connect in the Retailer Portal

Open Integrations

Go to Retailer PortalIntegrations.

Click Connect next to Square

You'll be redirected to Square to authorise the connection.

Approve and return

Once approved, you're redirected back to Tabsy. The connection is live immediately.

Step 2 - How the shopper is identified

Every sale is linked to a shopper automatically, in this priority:

  1. Member code - the shopper's Tabsy code, taken from the order note or their Square customer profile.
  2. Email - entered at checkout or on the linked customer.
  3. Phone - on the linked customer.

No manual step is required - Tabsy uses whichever is present.

To capture the code at the till, scan the shopper's Tabsy QR into the note field; it auto-types TABSY:CODE.

Testing? Use the Square POS app in sandbox mode to trigger real end-to-end tests. The Square Dashboard "Send test event" button sends a synthetic payload with no order_id and will not work with Tabsy.

Shopify POS

Tabsy connects to Shopify via OAuth and listens to orders/paid - this fires for both in-store Shopify POS and online checkouts.

Step 1 - Connect in the Retailer Portal

Open Integrations

Go to Retailer PortalIntegrations.

Enter your store domain and click Connect

Type your Shopify store domain (e.g. yourstore.myshopify.com) and click Connect.

Authorise in Shopify

Once approved, you're redirected back to Tabsy. The connection is live immediately.

Step 2 - How the shopper is identified

Every order is linked to a shopper automatically, in this priority:

  1. Member code - the shopper's Tabsy code, taken from the order notes or their customer profile.
  2. Email - on the order or customer.
  3. Phone - on the order or customer.

No manual step is required - Tabsy uses whichever is present.

To capture the code at the till, scan the shopper's Tabsy QR into the note field; it auto-types TABSY:CODE.

Lightspeed Retail

Tabsy connects to Lightspeed X-Series (formerly Vend) via OAuth and listens to sale completion events.

Step 1 - Connect in the Retailer Portal

Open Integrations

Go to Retailer PortalIntegrations.

Click Connect next to Lightspeed

You'll be redirected to Lightspeed to authorise the connection.

Approve and return

Once approved, you're redirected back to Tabsy. The connection is live immediately.

Step 2 - How the shopper is identified

Every sale is linked to a shopper automatically, in this priority:

  1. Member code - the shopper's Tabsy code, taken from the sale note or their customer profile (a customer custom field, or the customer note).
  2. Email - on the linked customer.
  3. Phone - the customer's mobile number.

No manual step is required - Tabsy uses whichever is present.

To capture the code at the till, scan the shopper's Tabsy QR into the note field; it auto-types TABSY:CODE.

WooCommerce

Tabsy connects to WooCommerce via a webhook. No OAuth - receipts flow automatically on every paid order.

Easiest setup - the Tabsy plugin.

Install the Tabsy for WooCommerce plugin (download), then open WooCommerce → Tabsy in your WordPress admin and paste the Webhook URL and Secret from your portal. It registers the webhook for you and adds a member-code field to your checkout and order screen. Prefer to set it up by hand? Use the manual steps below instead.

Step 1 - Connect in the Retailer Portal

Open Integrations

Go to Retailer PortalIntegrations.

Enter your store URL and click Connect

Type your WooCommerce store URL (e.g. yourstore.com). Tabsy will generate a webhook URL and secret for you.

Copy the webhook URL and secret

Save both - the secret is shown only once.

Step 2 - Add the webhook in WordPress

Go to WooCommerce → Settings → Advanced → Webhooks

Click Add webhook.

Set the topic to Order updated

Paste the Tabsy webhook URL in the Delivery URL field and paste the secret in the Secret field.

Set API version to v3 and Save

Use the WP REST API v3. From now on, whenever an order is paid, a receipt is sent to Tabsy. To also catch orders that are paid the moment they are placed, add a second webhook with the topic Order created.

Step 3 - How the shopper is identified

Every paid order is linked to a shopper automatically, in this priority:

  1. Member code - the shopper's Tabsy code. With the Tabsy plugin it comes from the member-code field or a staff order note; otherwise from the customer's order notes at checkout.
  2. Email - the billing email.
  3. Phone - the billing phone, then shipping phone.

No manual step is required - Tabsy uses whichever is present.

Without the Tabsy plugin, WooCommerce does not send internal staff order-note comments. Put the code in the customer's checkout order notes instead, or add a checkout field named tabsy_member_code. If nothing matches, the receipt is stored and the shopper can claim it later by email.

Odoo POS

Tabsy connects to Odoo with a one-time Automation Rule on your POS orders. No OAuth and no API key - you never give Tabsy access to your Odoo. Odoo simply posts each completed sale to your Tabsy webhook. Works on Odoo Online (SaaS) and self-hosted.

Step 1 - Connect in the Retailer Portal

Open Integrations

Go to Retailer PortalIntegrations.

Enter your Odoo site URL and click Connect

Tabsy generates a webhook URL with your secret already built into it.

Copy the webhook URL

You'll paste it into the automation in Step 3. It's shown only once.

Step 2 - Turn on Automation Rules in Odoo

Open Apps from the main menu

Open the Odoo main menu (top-left) and go to Apps.

Remove the default "Apps" filter

In the search bar, click the on the Apps filter chip - technical modules stay hidden until you do. Then search automation.

Install "Automation Rules"

Install the free, official module base_automation. Skip this step if it's already installed.

Step 3 - Add the Tabsy automation

Open Settings from the main menu, not from inside another app. Within a section like Point of Sale you'll see General Settings but no Technical tab - only the main-menu Settings shows Technical.
Open Settings → Technical → Automation Rules

From the main menu go to Settings, open the Technical tab, then Automation Rules, and click New.

Name it "tabsy"

Set the rule Name to tabsy.

Set the Model

In the Model field use Search More… and search the technical name pos.order, then select Point of Sale Orders.

Set the Trigger

Set Trigger to Status is set to, then choose Paid.

Add the action

Under Actions To Do add an action, name it webhook, set its type to Execute Code, and paste the code below.

Set your webhook URL

Replace YOUR_WEBHOOK_URL in the code with the single Webhook URL shown in the Retailer Portal when you click Connect (the key is already built in). Save.

o = record

lines = []
for l in o.lines:
    item = {
        "name": l.full_product_name or "Item",
        "qty": l.qty,
        "price_unit": l.price_unit,
        "price_subtotal": l.price_subtotal,
        "price_subtotal_incl": l.price_subtotal_incl,
        "discount": l.discount,
        "sku": "",
        "note": "",
        "category": "",
        "barcode": "",
    }
    try:
        item["sku"] = l.product_id.default_code or ""
    except:
        pass
    try:
        item["barcode"] = l.product_id.barcode or ""
    except:
        pass
    try:
        item["note"] = l.customer_note or l.note or ""
    except:
        pass
    try:
        item["category"] = l.product_id.categ_id.name or ""
    except:
        pass
    try:
        if l.product_id.pos_categ_ids:
            item["category"] = l.product_id.pos_categ_ids[0].name
    except:
        pass
    lines.append(item)

pays = []
for pm in o.payment_ids:
    if pm.payment_method_id and pm.payment_method_id.name:
        pays.append(pm.payment_method_id.name)

note = ""
try:
    note = o.note or ""
except:
    pass

gnote = ""
try:
    gnote = o.general_note or ""
except:
    pass

cashier = ""
try:
    cashier = o.user_id.name or ""
except:
    pass

branch = ""
try:
    branch = o.session_id.config_id.name or ""
except:
    pass

invoice = ""
try:
    invoice = o.account_move.name or ""
except:
    pass

meta = {}
try:
    meta["amount_paid"] = o.amount_paid
    meta["amount_return"] = o.amount_return
except:
    pass
try:
    meta["session_id"] = o.session_id.id
    meta["config_id"] = o.session_id.config_id.id
except:
    pass
try:
    meta["state"] = o.state
except:
    pass

p = o.partner_id
barcode = ""
try:
    barcode = p.barcode or ""
except:
    pass
ptags = []
try:
    ptags = [t.name for t in p.category_id]
except:
    pass
pvat = ""
try:
    pvat = p.vat or ""
except:
    pass

payload = {"order": {
    "id": o.id,
    "name": o.name or "",
    "pos_reference": o.pos_reference or "",
    "amount_total": o.amount_total,
    "amount_tax": o.amount_tax,
    "date_order": str(o.date_order or ""),
    "currency": o.currency_id.name or "AED",
    "note": note,
    "general_note": gnote,
    "cashier": cashier,
    "branch": branch,
    "invoice_number": invoice,
    "payment_method": ", ".join(pays),
    "meta": meta,
    "partner": {
        "email": p.email or "",
        "phone": p.phone or "",
        "name": p.name or "",
        "ref": p.ref or "",
        "comment": p.comment or "",
        "barcode": barcode,
        "tags": ptags,
        "vat": pvat,
    },
    "lines": lines,
}}

try:
    requests.post("YOUR_WEBHOOK_URL", json=payload, timeout=10)
except:
    pass

Step 4 - How cashiers identify the shopper

Tabsy links each sale to a shopper by, in order: their Tabsy member code, then email, then phone. There are several ways to attach the member code: scan or type it into the customer's Barcode field (the bare code, no prefix - set once and every future sale to that customer auto-links); add it as a customer Tag such as TABSY:340351; or type TABSY: followed by the code in the order's note or the customer's Reference field. The TABSY: note tag also accepts an email or phone - e.g. TABSY:jo@example.com or TABSY:+971581234567 - so a cashier can link a walk-in who has no member code and isn't saved as a customer. If no identifier is found, the receipt is stored unclaimed and the shopper can still add it later by uploading it in the app.

The snippet defaults the currency to AED when Odoo doesn't supply one - change it in the code if your store uses a different currency.

Clover

Tabsy connects to Clover via OAuth through the Clover App Market. Every completed payment automatically generates a receipt.

Step 1 - Connect in the Retailer Portal

Open Integrations

Go to Retailer PortalIntegrations.

Click Connect next to Clover

You'll be redirected to Clover to authorise the connection.

Approve and return

Once approved, you're redirected back to Tabsy. The connection is live immediately.

Step 2 - How cashiers identify the shopper

At checkout, the cashier adds the shopper's Tabsy tag to the sale note. Scanning the shopper's Tabsy QR adds it automatically, or the cashier can enter it by hand.

The tag is the shopper's member code, email, or phone number, and Tabsy links the receipt by whichever you provide. Examples: TABSY:CODE, TABSY:name@example.com, TABSY:+15551234567.

Zettle (now PayPal Point of Sale) Coming soon

Tabsy will connect to Zettle via OAuth. Once live, every completed purchase automatically generates a receipt. Zettle is widely used by small businesses across Europe and the Middle East.

Naming update: PayPal is rebranding Zettle as PayPal Point of Sale. It's the same platform, readers, and app - if your device or app now shows "PayPal Point of Sale", this is still the right integration to connect.

Step 1 - Connect in the Retailer Portal

Open Integrations

Go to Retailer PortalIntegrations.

Click Connect next to Zettle

You'll be redirected to Zettle to authorise the connection.

Approve and return

Once approved, you're redirected back to Tabsy. The connection is live immediately.

Step 2 - How cashiers identify the shopper

In the Zettle app, the cashier adds a note to the purchase before completing it. Scan the shopper's Tabsy QR - it auto-types TABSY:CODE into the note field. No scanner? The cashier can also type the shopper's member code, email address, or phone number into the note field directly. Tabsy detects whichever is present.

Note: Zettle does not pass customer data automatically in webhook payloads. The note field is the only way to identify a shopper - QR scan is the fastest, but email or phone typed manually also work.

Epos Now Coming soon

Tabsy will connect to Epos Now by registering a webhook URL in your Epos Now Backoffice. No OAuth needed - you paste a unique URL once and receipts flow automatically on every transaction.

Step 1 - Connect in the Retailer Portal

Open Integrations

Go to Retailer PortalIntegrations.

Enter your store name and click Connect

Tabsy generates a unique webhook URL for your account.

Copy the webhook URL

Save it - you'll paste it into Epos Now in the next step.

Step 2 - Add the webhook in Epos Now

Go to Epos Now Backoffice → API Device → Webhooks

Click Add Webhook Trigger.

Set the event to Transaction and paste the webhook URL

Save the webhook. Epos Now will now POST every transaction to Tabsy.

Step 3 - How cashiers identify the shopper

In Epos Now, the cashier scans the shopper's Tabsy QR into the Customer Notes field - the scanner auto-types TABSY:CODE. If no QR is scanned, Tabsy falls back to the customer's email or phone number on file.

Foodics Coming soon

Tabsy is becoming an official Foodics partner. Once live, every closed Foodics order will automatically generate a digital receipt - no extra steps for cashiers or customers.

Interested in early access? Contact us - we'll notify you as soon as the integration is available.

Stripe Terminal Coming soon

Tabsy is becoming an official Stripe partner. Once live, every in-person Stripe Terminal payment will automatically generate a digital receipt.

Interested in early access? Contact us - we'll notify you as soon as the integration is available.

Toast Coming soon

Tabsy is becoming an official Toast partner. Once live, every completed Toast transaction will automatically generate a digital receipt - ideal for restaurants and hospitality.

Interested in early access? Contact us - we'll notify you as soon as the integration is available.

Custom / bespoke POS

If your POS system isn't listed above, you can send receipts directly to the Tabsy API with a single HTTP call after each sale. Full endpoint reference, field schema, and error codes are in the API documentation.

Get your API key from the Retailer Portal under API Keys to get started.