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.
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:
Go to Retailer Portal → Integrations, click Connect next to your POS, and sign in with your POS account. Takes about 60 seconds.
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.
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:
| Method | How it works | Reliability |
|---|---|---|
| Member code | Cashier 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 |
| Customer's email on file with the POS matches their Tabsy account (automatic on most POS systems) | Good - fails if email differs between accounts | |
| Phone | Customer's phone number matches their Tabsy profile (automatic where POS provides it) | Fallback - used when email is unavailable |
| Guest | No match found - receipt stored and claim email sent to customer | Always works - shopper can claim later |
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.
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
Go to Retailer Portal → Integrations.
You'll be redirected to Square to authorise the connection.
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:
- Member code - the shopper's Tabsy code, taken from the order note or their Square customer profile.
- Email - entered at checkout or on the linked customer.
- 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.
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
Go to Retailer Portal → Integrations.
Type your Shopify store domain (e.g. yourstore.myshopify.com) and click Connect.
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:
- Member code - the shopper's Tabsy code, taken from the order notes or their customer profile.
- Email - on the order or customer.
- 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
Go to Retailer Portal → Integrations.
You'll be redirected to Lightspeed to authorise the connection.
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:
- Member code - the shopper's Tabsy code, taken from the sale note or their customer profile (a customer custom field, or the customer note).
- Email - on the linked customer.
- 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.
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
Go to Retailer Portal → Integrations.
Type your WooCommerce store URL (e.g. yourstore.com). Tabsy will generate a webhook URL and secret for you.
Save both - the secret is shown only once.
Step 2 - Add the webhook in WordPress
Click Add webhook.
Paste the Tabsy webhook URL in the Delivery URL field and paste the secret in the Secret field.
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:
- 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.
- Email - the billing email.
- Phone - the billing phone, then shipping phone.
No manual step is required - Tabsy uses whichever is present.
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
Go to Retailer Portal → Integrations.
Tabsy generates a webhook URL with your secret already built into it.
You'll paste it into the automation in Step 3. It's shown only once.
Step 2 - Turn on Automation Rules in Odoo
Open the Odoo main menu (top-left) and go to Apps.
In the search bar, click the ✕ on the Apps filter chip - technical modules stay hidden until you do. Then search automation.
Install the free, official module base_automation. Skip this step if it's already installed.
Step 3 - Add the Tabsy automation
From the main menu go to Settings, open the Technical tab, then Automation Rules, and click New.
Set the rule Name to tabsy.
In the Model field use Search More… and search the technical name pos.order, then select Point of Sale Orders.
Set Trigger to Status is set to, then choose Paid.
Under Actions To Do add an action, name it webhook, set its type to Execute Code, and paste the code below.
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.
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
Go to Retailer Portal → Integrations.
You'll be redirected to Clover to authorise the connection.
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.
Step 1 - Connect in the Retailer Portal
Go to Retailer Portal → Integrations.
You'll be redirected to Zettle to authorise the connection.
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.
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
Go to Retailer Portal → Integrations.
Tabsy generates a unique webhook URL for your account.
Save it - you'll paste it into Epos Now in the next step.
Step 2 - Add the webhook in Epos Now
Click Add Webhook Trigger.
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.
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.
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.
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.