Skip to content

How to Connect Square POS to Odoo: Payment & Sales Integration

DeployMonkey Team · March 23, 2026 10 min read

Why Connect Square to Odoo?

Square powers point-of-sale for millions of businesses — from coffee shops to retail stores to service providers. While Square handles in-person payments beautifully, it lacks the depth of a full ERP for inventory management, accounting, purchasing, and manufacturing. Connecting Square to Odoo gives you the best of both worlds: Square's polished POS experience with Odoo's comprehensive business management.

Without integration, businesses manually export Square sales reports, re-enter them in Odoo, and reconcile payments by hand. This process is error-prone and time-consuming, especially for businesses processing hundreds of transactions daily.

What to Sync

Square DataOdoo ModelPurpose
Transactionsaccount.move (invoices)Revenue tracking
Paymentsaccount.paymentBank reconciliation
Items catalogproduct.productUnified product management
Inventory countsstock.quantMulti-location stock
Customersres.partnerUnified customer database
Refundsaccount.move (credit note)Return tracking

Prerequisites

  • Square seller account with API access
  • Square Developer account (free)
  • Odoo with Sales, Inventory, and Accounting modules
  • Understanding of your chart of accounts for payment mapping

Step 1: Set Up Square Developer App

  1. Go to developer.squareup.com
  2. Create a new application
  3. Note your Application ID and Access Token
  4. For production, use OAuth to get merchant-specific tokens
  5. Set up webhook subscriptions for real-time sync

Step 2: Configure Webhooks

Square webhooks notify your Odoo endpoint when transactions occur:

# Subscribe to Square webhooks
curl -X PUT https://connect.squareup.com/v2/webhooks/subscriptions \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "subscription": {
      "name": "Odoo Sync",
      "event_types": [
        "payment.completed",
        "payment.updated",
        "refund.created",
        "inventory.count.updated",
        "catalog.version.updated"
      ],
      "notification_url": "https://your-odoo.com/square/webhook"
    }
  }'

Step 3: Import Transactions

from square.client import Client

client = Client(access_token='YOUR_TOKEN', environment='production')

# Fetch today's payments
result = client.payments.list_payments(
    begin_time='2026-03-23T00:00:00Z',
    end_time='2026-03-23T23:59:59Z',
)

for payment in result.body.get('payments', []):
    amount = payment['amount_money']['amount'] / 100  # cents to dollars
    
    # Create Odoo invoice
    invoice_vals = {
        'move_type': 'out_invoice',
        'partner_id': find_or_create_partner(payment),
        'invoice_date': payment['created_at'][:10],
        'ref': f"Square #{payment['id']}",
        'invoice_line_ids': build_invoice_lines(payment, client),
    }
    
    # Register payment
    payment_vals = {
        'amount': amount,
        'payment_type': 'inbound',
        'journal_id': square_journal_id,
        'ref': f"Square Payment {payment['id']}",
    }

Step 4: Sync Product Catalog

Keep Square items and Odoo products synchronized. Odoo should be the master for product data (names, prices, categories), pushed to Square:

def sync_product_to_square(product, client):
    result = client.catalog.upsert_catalog_object(
        body={
            'idempotency_key': f'odoo-{product["id"]}',
            'object': {
                'type': 'ITEM',
                'id': f'#odoo-{product["id"]}',
                'item_data': {
                    'name': product['name'],
                    'description': product['description_sale'] or '',
                    'variations': [{
                        'type': 'ITEM_VARIATION',
                        'id': f'#var-{product["id"]}',
                        'item_variation_data': {
                            'name': 'Regular',
                            'pricing_type': 'FIXED_PRICING',
                            'price_money': {
                                'amount': int(product['list_price'] * 100),
                                'currency': 'USD',
                            }
                        }
                    }]
                }
            }
        }
    )

Step 5: Inventory Reconciliation

Sync inventory counts between Square locations and Odoo warehouses:

  • Map each Square location to an Odoo warehouse/stock location
  • When Odoo stock changes (receipts, adjustments), push updated counts to Square
  • When Square records a sale, Odoo inventory decrements automatically via the order import
  • Run daily inventory reconciliation to catch discrepancies

Payment Reconciliation

Square deposits funds to your bank minus fees. Set up Odoo accounting to handle this:

  • Create a dedicated Square payment journal in Odoo
  • Record gross sale amount as revenue
  • Record Square processing fees (2.6% + $0.10) as expenses
  • Match net deposits to bank statements

Square Pricing

ProductCostProcessing Fee
Square POS (basic)Free2.6% + $0.10
Square for Retail$60/mo/location2.5% + $0.10
Square for Restaurants$60/mo/location2.6% + $0.10
Square OnlineFree-$79/mo2.9% + $0.30

DeployMonkey + Square

DeployMonkey instances support webhook endpoints for Square real-time transaction sync. Our AI agent can help configure the chart of accounts mapping, set up the Square journal, and test the payment reconciliation flow.