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 Data | Odoo Model | Purpose |
|---|---|---|
| Transactions | account.move (invoices) | Revenue tracking |
| Payments | account.payment | Bank reconciliation |
| Items catalog | product.product | Unified product management |
| Inventory counts | stock.quant | Multi-location stock |
| Customers | res.partner | Unified customer database |
| Refunds | account.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
- Go to developer.squareup.com
- Create a new application
- Note your Application ID and Access Token
- For production, use OAuth to get merchant-specific tokens
- 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
| Product | Cost | Processing Fee |
|---|---|---|
| Square POS (basic) | Free | 2.6% + $0.10 |
| Square for Retail | $60/mo/location | 2.5% + $0.10 |
| Square for Restaurants | $60/mo/location | 2.6% + $0.10 |
| Square Online | Free-$79/mo | 2.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.