Repository
OCA/connector-shopify · module folder · Try on Runboat
Module version
1.0.0
Category
Sales/Sales
Folder size
0.95 MB
License
AGPL-3
Application
Yes
Auto-installable
No
Website
https://github.com/OCA/connector-shopify
Last tracking update
2026-07-31 11:39:59
Authors
Odoo Community Association (OCA), Sawir Studio
Maintainers
Odoo Community Association (OCA), Sawir Studio
Committers
OCA-git-bot, oca-ci, Ricardo Sawir
Odoo dependencies
Python dependencies
requests, openupgradelib, geoip2
System dependencies
None
Required by
None
Description
The core Shopify connector links any number of Shopify stores to Odoo 19
Community through company-scoped binding records. It synchronizes products,
inventory, customers, orders, returns, refunds, and fulfillment through the
GraphQL Admin API.

Signed webhooks provide the fast path, OCA `queue_job` provides durable
execution, and scheduled reconciliation repairs missed or delayed events.
Onboarding, health checks, a sync dashboard, error recovery, and configurable
retention support day-to-day operation.

Code Analysis

Views touched (54)
XML IDNameModelTypeStatus
product_template_form_shopify product.template.form.shopify product.template form Inherits product.product_template_form_view
res_partner_form_shopify_customer res.partner.form.shopify.customer res.partner form Inherits base.view_partner_form
sale_order_view_form_shopify sale.order.form.shopify sale.order form Inherits sale.view_order_form
shopify_binding_state_search_base shopify.binding.state.search.base shopify.product.variant search New
shopify_carrier_mapping_view_list shopify.carrier.mapping.list shopify.carrier.mapping list New
shopify_catalog_operability_search shopify.catalog.operability.search shopify.catalog search New
shopify_catalog_view_list shopify.catalog.list shopify.catalog list New
shopify_collection_search_operability shopify.collection.search.operability shopify.collection search Inherits shopify_collection_view_search
shopify_collection_view_form shopify.collection.form shopify.collection form New
shopify_collection_view_list shopify.collection.list shopify.collection list New
shopify_collection_view_search shopify.collection.search shopify.collection search New
shopify_company_operability_search shopify.company.operability.search shopify.company search New
shopify_company_view_form shopify.company.form shopify.company form New
shopify_company_view_list shopify.company.list shopify.company list New
shopify_customer_operability_search shopify.customer.operability.search shopify.customer search New
shopify_customer_view_form shopify.customer.form shopify.customer form New
shopify_customer_view_list shopify.customer.list shopify.customer list New
shopify_fulfillment_operability_search shopify.fulfillment.operability.search shopify.fulfillment search New
shopify_fulfillment_order_operability_search shopify.fulfillment.order.operability.search shopify.fulfillment.order search New
shopify_fulfillment_order_view_form shopify.fulfillment.order.form shopify.fulfillment.order form New
shopify_fulfillment_order_view_list shopify.fulfillment.order.list shopify.fulfillment.order list New
shopify_fulfillment_view_form shopify.fulfillment.form shopify.fulfillment form New
shopify_fulfillment_view_list shopify.fulfillment.list shopify.fulfillment list New
shopify_gateway_journal_view_list shopify.gateway.journal.list shopify.gateway.journal list New
shopify_instance_dashboard_kanban shopify.instance.dashboard.kanban shopify.instance kanban New
shopify_instance_fulfillment_view_form shopify.instance.form.fulfillment shopify.instance form Inherits shopify_instance_view_form
shopify_instance_order_view_form shopify.instance.form.orders shopify.instance form Inherits shopify_instance_view_form
shopify_instance_view_form shopify.instance.form shopify.instance form New
shopify_instance_view_list shopify.instance.list shopify.instance list New
shopify_instance_view_list_onboarding shopify.instance.list.onboarding shopify.instance list Inherits shopify_instance_view_list
shopify_instance_view_search shopify.instance.search shopify.instance search New
shopify_instance_wizard_view_form shopify.instance.wizard.form shopify.instance.wizard form New
shopify_location_search_operability shopify.location.search.operability shopify.location search Inherits shopify_location_view_search
shopify_location_view_form shopify.location.form shopify.location form New
shopify_location_view_list shopify.location.list shopify.location list New
shopify_location_view_search shopify.location.search shopify.location search New
shopify_log_view_list shopify.log.list shopify.log list New
shopify_log_view_search shopify.log.search shopify.log search New
shopify_order_fulfillment_view_form shopify.order.form.fulfillment shopify.order form Inherits shopify_order_view_form
shopify_order_operability_search shopify.order.operability.search shopify.order search New
shopify_order_view_form shopify.order.form shopify.order form New
shopify_order_view_list shopify.order.list shopify.order list New
shopify_product_export_wizard_view_form shopify.product.export.wizard.form shopify.product.export.wizard form New
shopify_product_search_operability shopify.product.search.operability shopify.product.template search Inherits shopify_product_template_view_search
shopify_product_template_view_form shopify.product.template.form shopify.product.template form New
shopify_product_template_view_list shopify.product.template.list shopify.product.template list New
shopify_product_template_view_search shopify.product.template.search shopify.product.template search New
shopify_product_variant_view_list shopify.product.variant.list shopify.product.variant list New
shopify_tax_mapping_view_form shopify.tax.mapping.form shopify.tax.mapping form New
shopify_tax_mapping_view_list shopify.tax.mapping.list shopify.tax.mapping list New
shopify_webhook_event_view_form shopify.webhook.event.form shopify.webhook.event form New
shopify_webhook_event_view_list shopify.webhook.event.list shopify.webhook.event list New
shopify_webhook_event_view_search shopify.webhook.event.search shopify.webhook.event search New
stock_picking_view_form_shopify_fulfillment stock.picking.form.shopify.fulfillment stock.picking form Inherits stock.view_picking_form
HTTP endpoints (2)
Route(s)HandlerAuthTypeMethodsFlags
/shopify/product-image/<int:instance_id>/<string:model_name>/<int:record_id>/<string:checksum>/<string:signature> ShopifyProductImageController.shopify_product_image public http GET csrf off sudo
/shopify/webhook/<int:instance_id> ShopifyWebhookController.shopify_webhook public http POST csrf off sudo
Models touched (76)

New fields (1)
  • shopify_image_binding_ids One2many → shopify.product.image
    string='Shopify Image Bindings' args: 'shopify.product.image', 'odoo_id'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, values)

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, values)

New fields (1)
  • shopify_variant_binding_ids One2many → shopify.product.variant
    string='Shopify Variant Bindings' args: 'shopify.product.variant', 'odoo_id'
Public methods (2)
  • action_open_shopify_export_wizard(self)
  • write(self, values)

New fields (1)
  • shopify_binding_ids One2many → shopify.product.template
    string='Shopify Bindings' args: 'shopify.product.template', 'odoo_id'
Public methods (2)
  • action_open_shopify_export_wizard(self)
  • write(self, values)

New fields (0)

No new fields.

Public methods (1)
  • write(self, values)

New fields (1)
  • shopify_customer_binding_ids One2many → shopify.customer
    string='Shopify Customer Bindings' args: 'shopify.customer', 'odoo_id'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, values)

New fields (1)
  • shopify_company_id Many2one → res.company
    help='Company scope for categories created from Shopify tags.' index=True ondelete='cascade' args: 'res.company'
Public methods (0)

No public methods.

New fields (6)
  • shopify_binding_ids One2many → shopify.order
    string='Shopify Bindings' args: 'shopify.order', 'odoo_id'
  • shopify_discount_codes Char
    copy=False readonly=True
  • shopify_note Text
    copy=False readonly=True
  • shopify_risk_hold Boolean
    copy=False index=True readonly=True
  • shopify_risk_level Selection
    copy=False readonly=True args: [('UNKNOWN', 'Unknown'), ('NONE', 'None'), ('LOW', 'Low'), ('MEDIUM', 'Medium'), ('HIGH', 'High')]
  • shopify_tags Char
    copy=False readonly=True
Public methods (1)
  • action_release_shopify_risk_hold(self)

New fields (5)
  • shopify_discount_amount Char
    copy=False readonly=True
  • shopify_expected_total Char
    copy=False readonly=True
  • shopify_is_gift_card Boolean
    copy=False readonly=True
  • shopify_is_shipping Boolean
    copy=False readonly=True
  • shopify_line_id Char
    copy=False index=True readonly=True
Public methods (0)

No public methods.

New fields (6)
  • error_message Text
    readonly=True
  • external_updated_at Datetime
    help='UTC update timestamp last reported by Shopify.' string='Shopify Updated At'
  • instance_id Many2one → shopify.instance
    index=True ondelete='cascade' required=True string='Shopify Instance' args: 'shopify.instance'
  • last_sync_date Datetime
    help='UTC timestamp of the last successful synchronization.' readonly=True string='Last Synchronization'
  • shopify_id Char
    help='Stable Shopify GraphQL global ID.' index=True required=True string='Shopify GID'
  • state Selection
    default='pending' index=True required=True args: [('pending', 'Pending'), ('synced', 'Synchronized'), ('error', 'Error')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • action_reset_to_pending(self)
  • action_retry_sync(self)

New fields (4)
  • carrier_id Many2one → delivery.carrier
    check_company=True ondelete='cascade' required=True args: 'delivery.carrier'
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • instance_id Many2one → shopify.instance
    index=True ondelete='cascade' required=True args: 'shopify.instance'
  • tracking_company Char
    help='Company string sent in Shopify tracking information.' required=True
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • odoo_pricelist_id Many2one → product.pricelist
    check_company=True ondelete='restrict' required=True args: 'product.pricelist'
  • price_list_shopify_id Char
    index=True readonly=True string='Shopify Price List GID'
  • status Char
    readonly=True
  • title Char
    required=True
Public methods (0)

No public methods.

New fields (5)
  • active Boolean
    default=True
  • collection_type Selection
    default='custom' index=True required=True args: [('custom', 'Custom'), ('smart', 'Smart')]
  • handle Char
    index=True
  • name Char
    index=True required=True
  • product_binding_ids Many2many → shopify.product.template
    string='Products' args: 'shopify.product.template', 'shopify_collection_product_rel', 'collection_id', 'product_binding_id'
Public methods (1)
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • contact_binding_ids One2many → shopify.company.contact
    string='Company Contacts' args: 'shopify.company.contact', 'company_binding_id'
  • external_id Char
    readonly=True string='Shopify External ID'
  • location_binding_ids One2many → shopify.company.location
    string='Company Locations' args: 'shopify.company.location', 'company_binding_id'
  • odoo_id Many2one → res.partner
    check_company=True index=True ondelete='cascade' required=True string='Odoo Company' args: 'res.partner'
Public methods (0)

No public methods.

New fields (6)
  • company_binding_id Many2one → shopify.company
    index=True ondelete='cascade' required=True args: 'shopify.company'
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • customer_shopify_id Char
    index=True readonly=True
  • odoo_id Many2one → res.partner
    check_company=True index=True ondelete='cascade' required=True string='Odoo Company Contact' args: 'res.partner'
  • roles Text
    readonly=True
  • title Char
    readonly=True
Public methods (0)

No public methods.

New fields (4)
  • billing_odoo_id Many2one → res.partner
    check_company=True ondelete='set null' string='Odoo Billing Address' args: 'res.partner'
  • company_binding_id Many2one → shopify.company
    index=True ondelete='cascade' required=True args: 'shopify.company'
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • odoo_id Many2one → res.partner
    check_company=True index=True ondelete='cascade' required=True string='Odoo Company Location' args: 'res.partner'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (7)
  • address_binding_ids One2many → shopify.customer.address
    string='Shopify Addresses' args: 'shopify.customer.address', 'customer_binding_id'
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • email_marketing_state Char
    readonly=True
  • odoo_id Many2one → res.partner
    check_company=True index=True ondelete='cascade' required=True string='Odoo Customer' args: 'res.partner'
  • tag_category_ids Many2many → res.partner.category
    readonly=True string='Imported Shopify Tags' args: 'res.partner.category', 'shopify_customer_category_rel', 'customer_binding_id', 'category_id'
  • tags Text
    readonly=True
  • tax_exempt Boolean
    readonly=True
Public methods (0)

No public methods.

New fields (4)
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • customer_binding_id Many2one → shopify.customer
    index=True ondelete='cascade' required=True args: 'shopify.customer'
  • is_default Boolean
    readonly=True
  • odoo_id Many2one → res.partner
    check_company=True index=True ondelete='cascade' required=True string='Odoo Address' args: 'res.partner'
Public methods (0)

No public methods.

New fields (3)
  • field Selection
    index=True required=True args: PRODUCT_FIELDS
  • instance_id Many2one → shopify.instance
    index=True ondelete='cascade' required=True args: 'shopify.instance'
  • owner Selection
    default='odoo' required=True args: [('odoo', 'Odoo'), ('shopify', 'Shopify')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (13)
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • fulfillment_order_ids Many2many → shopify.fulfillment.order
    readonly=True string='Fulfillment Orders' args: 'shopify.fulfillment.order', 'shopify_fulfillment_order_rel', 'fulfillment_id', 'fulfillment_order_id'
  • fulfillment_status Char
    index=True readonly=True string='Status'
  • idempotency_key Char
    copy=False index=True readonly=True
  • location_shopify_id Char
    index=True readonly=True
  • order_binding_id Many2one → shopify.order
    index=True ondelete='cascade' required=True args: 'shopify.order'
  • origin Selection
    default='shopify' index=True readonly=True required=True args: [('odoo', 'Odoo'), ('shopify', 'Shopify / External')]
  • picking_id Many2one → stock.picking
    check_company=True index=True ondelete='set null' readonly=True string='Odoo Delivery' args: 'stock.picking'
  • raw_payload Json
    readonly=True
  • shopify_id Char
    index=True readonly=True required=False string='Shopify GID'
  • tracking_company Char
    readonly=True
  • tracking_number Char
    readonly=True
  • tracking_url Char
    readonly=True
Public methods (1)
  • action_cancel_shopify(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (12)
  • assigned_location_id Many2one → shopify.location
    index=True ondelete='restrict' string='Assigned Shopify Location' args: 'shopify.location'
  • assigned_location_name Char
    readonly=True
  • assigned_location_shopify_id Char
    index=True readonly=True
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • fulfillment_holds Json
    readonly=True
  • fulfillment_ids Many2many → shopify.fulfillment
    readonly=True string='Fulfillments' args: 'shopify.fulfillment', 'shopify_fulfillment_order_rel', 'fulfillment_order_id', 'fulfillment_id'
  • fulfillment_status Char
    index=True readonly=True string='Status'
  • is_held Boolean
    index=True readonly=True
  • line_ids One2many → shopify.fulfillment.order.line
    string='Remaining Lines' args: 'shopify.fulfillment.order.line', 'fulfillment_order_id'
  • order_binding_id Many2one → shopify.order
    index=True ondelete='cascade' required=True args: 'shopify.order'
  • request_status Char
    index=True readonly=True
  • supported_actions Json
    readonly=True
Public methods (2)
  • action_refresh(self)
  • action_release_hold(self)

New fields (8)
  • company_id Many2one → res.company
    index=True readonly=True related='fulfillment_order_id.company_id' store=True args: 'res.company'
  • fulfillment_order_id Many2one → shopify.fulfillment.order
    index=True ondelete='cascade' required=True args: 'shopify.fulfillment.order'
  • instance_id Many2one → shopify.instance
    index=True readonly=True related='fulfillment_order_id.instance_id' store=True args: 'shopify.instance'
  • order_line_binding_id Many2one → shopify.order.line
    index=True ondelete='restrict' string='Shopify Order Line' args: 'shopify.order.line'
  • order_line_shopify_id Char
    index=True readonly=True
  • remaining_quantity Integer
    readonly=True
  • shopify_id Char
    index=True readonly=True required=True string='Fulfillment Order Line GID'
  • total_quantity Integer
    readonly=True
Public methods (0)

No public methods.

New fields (4)
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • gateway Char
    index=True required=True
  • instance_id Many2one → shopify.instance
    index=True ondelete='cascade' required=True args: 'shopify.instance'
  • journal_id Many2one → account.journal
    check_company=True domain="[('type', 'in', ('bank', 'cash'))]" ondelete='restrict' required=True args: 'account.journal'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (6)
  • amount Char
    required=True
  • gateway Char
    required=True
  • instance_id Many2one → shopify.instance
    index=True ondelete='cascade' required=True args: 'shopify.instance'
  • order_binding_id Many2one → shopify.order
    ondelete='cascade' required=True args: 'shopify.order'
  • payment_id Many2one → account.payment
    ondelete='restrict' required=True args: 'account.payment'
  • transaction_shopify_id Char
    index=True required=True
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • action_import_locations(self)
  • action_push_inventory(self)

New fields (0)

No new fields.

Public methods (1)
  • action_import_orders(self)

New fields (5)
  • field_mapping_ids One2many → shopify.field.mapping
    copy=True string='Product Field Ownership' args: 'shopify.field.mapping', 'instance_id'
  • product_create_if_missing Boolean
    default=True help='Create an Odoo product when no barcode or SKU match exists.' string='Create Missing Odoo Products'
  • product_delete_behavior Selection
    default='archive' required=True string='Shopify Product Deletion' args: [('archive', 'Archive in Odoo'), ('ignore', 'Keep Active in Odoo')]
  • product_pricelist_id Many2one → product.pricelist
    check_company=True help='Variant-specific Shopify prices are stored as fixed-price rules on this pricelist.' ondelete='restrict' required=True string='Shopify Product Pricelist' args: 'product.pricelist'
  • shop_currency_id Many2one → res.currency
    default=<expr> readonly=True required=True string='Shopify Shop Currency' args: 'res.currency'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (5)
  • inventory_allow_negative Boolean
    default=False help='Otherwise negative Odoo stock is clamped to zero and logged.' string='Allow Negative Shopify Quantities'
  • inventory_echo_window_seconds Integer
    default=300 help='Seconds during which a matching Shopify webhook is an echo.' required=True string='Webhook Echo Window'
  • inventory_import_enabled Boolean
    default=False help='Apply inventory_levels/update webhooks to mapped Odoo locations.' string='Import Shopify Inventory'
  • inventory_quantity_basis Selection
    default='free_qty' help='Odoo quantity used as the source for Shopify available stock.' required=True args: [('free_qty', 'Free Quantity'), ('qty_available', 'On-hand Quantity')]
  • location_binding_ids One2many → shopify.location
    string='Shopify Locations' args: 'shopify.location', 'instance_id'
Public methods (0)

No public methods.

New fields (10)
  • accept_webhooks Boolean
    default=True help='Disable to reject webhook delivery for this instance.'
  • access_token Char
    copy=False groups='shopify_connector.group_shopify_manager' string='Admin API Access Token'
  • active Boolean
    default=True
  • api_version Char
    default=API_VERSION readonly=True required=True string='API Version'
  • company_id Many2one → res.company
    default=<expr> index=True required=True args: 'res.company'
  • name Char
    required=True
  • shop_url Char
    help='Shopify myshopify.com domain, without an Admin API path.' required=True string='Shop Domain'
  • state Selection
    copy=False default='draft' readonly=True required=True args: [('draft', 'Draft'), ('connected', 'Connected'), ('error', 'Error')]
  • webhook_max_payload_bytes Integer
    default=<expr> help='Reject larger webhook request bodies before HMAC verification.' required=True string='Maximum Webhook Payload'
  • webhook_secret Char
    copy=False groups='shopify_connector.group_shopify_manager'
Public methods (5)
  • action_duplicate_configuration(self)
  • action_repair_webhook_subscriptions(self)
  • action_test_connection(self)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (0)

No new fields.

Public methods (2)
  • action_import_b2b(self)
  • action_import_customers(self)

New fields (18)
  • dashboard_collections Char
    compute='_compute_operability_dashboard'
  • dashboard_companies Char
    compute='_compute_operability_dashboard'
  • dashboard_customers Char
    compute='_compute_operability_dashboard'
  • dashboard_drift_crons Text
    compute='_compute_operability_dashboard'
  • dashboard_financial Char
    compute='_compute_operability_dashboard'
  • dashboard_fulfillments Char
    compute='_compute_operability_dashboard'
  • dashboard_locations Char
    compute='_compute_operability_dashboard'
  • dashboard_orders Char
    compute='_compute_operability_dashboard'
  • dashboard_products Char
    compute='_compute_operability_dashboard'
  • dashboard_queue_backlog Integer
    compute='_compute_operability_dashboard'
  • dashboard_recent_errors Text
    compute='_compute_operability_dashboard'
  • dashboard_table_sizes Text
    compute='_compute_operability_dashboard'
  • dashboard_variants Char
    compute='_compute_operability_dashboard'
  • dashboard_webhooks Text
    compute='_compute_operability_dashboard'
  • log_retention_days Integer
    default=30 required=True
  • webhook_health_checked_at Datetime
    readonly=True
  • webhook_missing_topics Text
    readonly=True
  • webhook_retention_days Integer
    default=30 required=True
Public methods (2)
  • action_check_webhook_health(self)
  • action_open_binding_errors(self)

New fields (17)
  • auto_confirm_paid Boolean
    default=True
  • auto_confirm_partially_paid Boolean
    default=True
  • delivery_product_id Many2one → product.product
    check_company=True ondelete='restrict' readonly=True args: 'product.product'
  • gateway_journal_ids One2many → shopify.gateway.journal
    string='Gateway Journals' args: 'shopify.gateway.journal', 'instance_id'
  • gift_card_journal_id Many2one → account.journal
    check_company=True domain="[('type', 'in', ('bank', 'cash'))]" ondelete='restrict' args: 'account.journal'
  • gift_card_product_id Many2one → product.product
    check_company=True ondelete='restrict' args: 'product.product'
  • high_risk_hold_enabled Boolean
    default=True
  • order_binding_ids One2many → shopify.order
    string='Orders' args: 'shopify.order', 'instance_id'
  • order_confirmation_policy Selection
    default='quotation' required=True args: [('quotation', 'Import as Quotation'), ('auto', 'Auto-confirm Eligible')]
  • order_currency_policy Selection
    default='presentment' required=True args: [('presentment', 'Presentment Currency'), ('shop', 'Shop Currency')]
  • order_import_date_from Date
  • order_import_date_to Date
  • order_invoicing_policy Selection
    default='manual' required=True args: [('manual', 'Manual'), ('paid', 'Invoice on Paid'), ('fulfillment', 'Invoice on Fulfillment')]
  • placeholder_product_id Many2one → product.product
    check_company=True ondelete='restrict' args: 'product.product'
  • refund_uninvoiced_policy Selection
    default='adjust' required=True args: [('adjust', 'Adjust Order'), ('cancel', 'Cancel Fully Refunded Order')]
  • tax_mapping_ids One2many → shopify.tax.mapping
    string='Tax Mappings' args: 'shopify.tax.mapping', 'instance_id'
  • unknown_product_policy Selection
    default='block' required=True args: [('block', 'Block With Error'), ('placeholder', 'Use Placeholder Product')]
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (3)
  • carrier_mapping_ids One2many → shopify.carrier.mapping
    string='Carrier Mappings' args: 'shopify.carrier.mapping', 'instance_id'
  • fulfillment_auto_validate_webhook Boolean
    default=False help='Validate matching Odoo deliveries when an external Shopify fulfillment webhook is received. Disabled is log-only.' string='Validate Deliveries from Webhooks'
  • fulfillment_notify_customer Boolean
    default=True help='Ask Shopify to send its fulfillment notification.' string='Notify Customer'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_import_products(self)

New fields (7)
  • b2b_import_enabled Boolean
    default=True string='Import Shopify B2B'
  • catalog_binding_ids One2many → shopify.catalog
    string='B2B Catalogs' args: 'shopify.catalog', 'instance_id'
  • company_binding_ids One2many → shopify.company
    string='B2B Companies' args: 'shopify.company', 'instance_id'
  • customer_binding_ids One2many → shopify.customer
    string='Customers' args: 'shopify.customer', 'instance_id'
  • customer_export_enabled Boolean
    default=False help='Export changes for linked customers when Odoo owns the field.' string='Export Odoo Customers'
  • guest_partner_id Many2one → res.partner
    check_company=True ondelete='restrict' readonly=True string='Shopify Guest Customer' args: 'res.partner'
  • shopify_plus_state Selection
    default='unknown' readonly=True required=True args: [('unknown', 'Not Checked'), ('available', 'Shopify Plus Available'), ('unavailable', 'Shopify Plus Unavailable')]
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (24)
  • access_token Char
    required=True
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • granted_scopes Text
    readonly=True
  • import_customers Boolean
    default=True
  • import_orders Boolean
    default=True
  • import_products Boolean
    default=True
  • instance_id Many2one → shopify.instance
    ondelete='cascade' readonly=True args: 'shopify.instance'
  • inventory_direction Selection
    default='odoo_to_shopify' required=True string='Stock Direction' args: [('odoo_to_shopify', 'Odoo to Shopify'), ('bidirectional', 'Odoo to Shopify + Shopify to Odoo')]
  • inventory_quantity_basis Selection
    default='free_qty' required=True args: [('free_qty', 'Free Quantity'), ('qty_available', 'On-hand Quantity')]
  • location_line_ids One2many → shopify.instance.wizard.location
    string='Location Mappings' args: 'shopify.instance.wizard.location', 'wizard_id'
  • missing_scopes Text
    readonly=True
  • name Char
    default='Shopify Store' required=True
  • order_confirmation_policy Selection
    default='quotation' required=True args: [('quotation', 'Import as Quotation'), ('auto', 'Auto-confirm Eligible')]
  • order_invoicing_policy Selection
    default='manual' required=True args: [('manual', 'Manual'), ('paid', 'Invoice on Paid'), ('fulfillment', 'Invoice on Fulfillment')]
  • product_create_if_missing Boolean
    default=True
  • required_scopes Text
    readonly=True
  • scope_check_ok Boolean
    readonly=True
  • shop_url Char
    required=True
  • step Selection
    default='credentials' required=True args: [('credentials', 'Credentials'), ('scopes', 'API Scopes'), ('locations', 'Locations'), ('taxes', 'Tax Defaults'), ('policies', 'Policies'), ('webhooks', 'Webhooks'), ('imports', 'Initial Import')]
  • tax_country_id Many2one → res.country
    readonly=True args: 'res.country'
  • tax_mapping_count Integer
    readonly=True
  • tax_shipping Boolean
    readonly=True
  • taxes_included Boolean
    readonly=True
  • webhook_secret Char
    required=True
Public methods (8)
  • action_apply_locations(self)
  • action_apply_policies(self)
  • action_check_scopes(self)
  • action_continue_to_policies(self)
  • action_finish(self)
  • action_setup_webhooks(self)
  • action_test_connection(self)
  • default_get(self, field_names)
    @api.model

New fields (6)
  • company_id Many2one → res.company
    readonly=True related='wizard_id.company_id' store=True args: 'res.company'
  • location_binding_id Many2one → shopify.location
    ondelete='cascade' readonly=True required=True args: 'shopify.location'
  • location_name Char
    readonly=True related='location_binding_id.name'
  • odoo_location_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'internal')]" ondelete='restrict' args: 'stock.location'
  • warehouse_id Many2one → stock.warehouse
    check_company=True ondelete='restrict' args: 'stock.warehouse'
  • wizard_id Many2one → shopify.instance.wizard
    ondelete='cascade' required=True args: 'shopify.instance.wizard'
Public methods (0)

No public methods.

New fields (8)
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • instance_id Many2one → shopify.instance
    index=True ondelete='cascade' required=True args: 'shopify.instance'
  • last_pushed_at Datetime
    readonly=True
  • last_pushed_quantity Integer
    readonly=True
  • last_shopify_quantity Integer
    readonly=True
  • last_sync_date Datetime
    readonly=True
  • location_binding_id Many2one → shopify.location
    index=True ondelete='cascade' required=True args: 'shopify.location'
  • variant_binding_id Many2one → shopify.product.variant
    index=True ondelete='cascade' required=True args: 'shopify.product.variant'
Public methods (0)

No public methods.

New fields (9)
  • active Boolean
    default=True index=True readonly=True string='Active in Shopify'
  • address Char
    readonly=True
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • fulfills_online_orders Boolean
    readonly=True
  • is_mapped Boolean
    compute='_compute_is_mapped' index=True store=True string='Mapped'
  • legacy_resource_id Char
    index=True readonly=True string='Shopify Legacy ID'
  • name Char
    index=True required=True
  • odoo_location_id Many2one → stock.location
    check_company=True domain="[('usage', '=', 'internal')]" ondelete='restrict' string='Odoo Internal Location' args: 'stock.location'
  • warehouse_id Many2one → stock.warehouse
    check_company=True help='Selecting a warehouse maps its main stock location by default.' ondelete='restrict' string='Odoo Warehouse' args: 'stock.warehouse'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (7)
  • direction Selection
    index=True required=True args: [('import', 'Shopify to Odoo'), ('export', 'Odoo to Shopify')]
  • entity Char
    index=True required=True
  • instance_id Many2one → shopify.instance
    index=True ondelete='cascade' required=True args: 'shopify.instance'
  • level Selection
    default='info' index=True required=True args: [('info', 'Info'), ('warning', 'Warning'), ('error', 'Error')]
  • message Text
    required=True
  • res_id Integer
    index=True string='Related Document ID'
  • res_model Char
    index=True string='Related Document Model'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_open_related_record(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_refresh_fulfillment_orders(self)

New fields (40)
  • cancelled_at Datetime
    readonly=True string='Shopify Cancelled At'
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • completed_order_shopify_id Char
    index=True readonly=True
  • created_at Datetime
    readonly=True string='Shopify Created At'
  • discount_codes Text
    readonly=True
  • draft_status Char
    readonly=True
  • financial_status Char
    index=True readonly=True
  • fulfillment_status Char
    index=True readonly=True
  • is_draft Boolean
    index=True readonly=True
  • line_binding_ids One2many → shopify.order.line
    string='Shopify Lines' args: 'shopify.order.line', 'order_binding_id'
  • missing_tax_country_id Many2one → res.country
    ondelete='set null' readonly=True args: 'res.country'
  • missing_tax_included Boolean
    readonly=True
  • missing_tax_rate Char
    readonly=True
  • odoo_id Many2one → sale.order
    check_company=True help='Empty when an atomic order build failed before creating a sale order.' index=True ondelete='set null' string='Odoo Sales Order' args: 'sale.order'
  • order_currency_id Many2one → res.currency
    ondelete='restrict' readonly=True args: 'res.currency'
  • order_name Char
    index=True readonly=True string='Shopify Order'
  • order_number Char
    index=True readonly=True
  • payload_digest Char
    index=True readonly=True
  • presentment_currency_id Many2one → res.currency
    ondelete='restrict' readonly=True args: 'res.currency'
  • presentment_discount_total Monetary
    currency_field='presentment_currency_id' readonly=True
  • presentment_money_json Json
    readonly=True
  • presentment_shipping_total Monetary
    currency_field='presentment_currency_id' readonly=True
  • presentment_subtotal Monetary
    currency_field='presentment_currency_id' readonly=True
  • presentment_tax_total Monetary
    currency_field='presentment_currency_id' readonly=True
  • presentment_total Monetary
    currency_field='presentment_currency_id' readonly=True
  • raw_payload Json
    readonly=True string='Raw Shopify Payload'
  • refund_binding_ids One2many → shopify.refund
    string='Shopify Refunds' args: 'shopify.refund', 'order_binding_id'
  • replaced_by_id Many2one → shopify.order
    ondelete='set null' readonly=True string='Completed Order Binding' args: 'shopify.order'
  • return_binding_ids One2many → shopify.return
    string='Shopify Returns' args: 'shopify.return', 'order_binding_id'
  • risk_level Selection
    default='UNKNOWN' index=True readonly=True required=True args: [('UNKNOWN', 'Unknown'), ('NONE', 'None'), ('LOW', 'Low'), ('MEDIUM', 'Medium'), ('HIGH', 'High')]
  • shop_currency_id Many2one → res.currency
    ondelete='restrict' readonly=True args: 'res.currency'
  • shop_discount_total Monetary
    currency_field='shop_currency_id' readonly=True
  • shop_money_json Json
    readonly=True
  • shop_shipping_total Monetary
    currency_field='shop_currency_id' readonly=True
  • shop_subtotal Monetary
    currency_field='shop_currency_id' readonly=True
  • shop_tax_total Monetary
    currency_field='shop_currency_id' readonly=True
  • shop_total Monetary
    currency_field='shop_currency_id' readonly=True
  • source Selection
    default='online' index=True readonly=True required=True args: [('online', 'Online Store'), ('pos', 'Point of Sale'), ('draft', 'Draft Order')]
  • source_identifier Char
    readonly=True
  • source_name Char
    readonly=True
Public methods (1)
  • action_create_tax_mapping(self)

New fields (2)
  • fulfillment_ids One2many → shopify.fulfillment
    string='Fulfillments' args: 'shopify.fulfillment', 'order_binding_id'
  • fulfillment_order_ids One2many → shopify.fulfillment.order
    string='Fulfillment Orders' args: 'shopify.fulfillment.order', 'order_binding_id'
Public methods (0)

No public methods.

New fields (15)
  • company_id Many2one → res.company
    readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • current_quantity Float
    readonly=True
  • is_gift_card Boolean
    readonly=True
  • is_shipping Boolean
    readonly=True
  • odoo_id Many2one → sale.order.line
    check_company=True index=True ondelete='cascade' required=True string='Odoo Sales Line' args: 'sale.order.line'
  • order_binding_id Many2one → shopify.order
    index=True ondelete='cascade' required=True args: 'shopify.order'
  • presentment_discount_total Char
    readonly=True
  • presentment_discounted_total Char
    readonly=True
  • presentment_unit_price Char
    readonly=True
  • refundable_quantity Float
    readonly=True
  • shop_discount_total Char
    readonly=True
  • shop_discounted_total Char
    readonly=True
  • shop_unit_price Char
    readonly=True
  • sku Char
    readonly=True
  • variant_shopify_id Char
    index=True readonly=True
Public methods (0)

No public methods.

New fields (2)
  • instance_id Many2one → shopify.instance
    required=True args: 'shopify.instance'
  • product_tmpl_ids Many2many → product.template
    required=True string='Products' args: 'product.template'
Public methods (1)
  • action_export(self)

New fields (6)
  • image_checksum Char
    copy=False readonly=True
  • odoo_id Many2one → product.image
    index=True ondelete='cascade' required=True string='Odoo Product Image' args: 'product.image'
  • source_url Char
    readonly=True
  • template_binding_id Many2one → shopify.product.template
    index=True ondelete='cascade' required=True args: 'shopify.product.template'
  • variant_binding_id Many2one → shopify.product.variant
    index=True ondelete='set null' args: 'shopify.product.variant'
  • variant_binding_ids Many2many → shopify.product.variant
    string='Associated Shopify Variants' args: 'shopify.product.variant', 'shopify_product_image_variant_rel', 'image_binding_id', 'variant_binding_id'
Public methods (0)

No public methods.

New fields (2)
  • inventory_sync_enabled Boolean
    default=True help='Disable to opt every variant of this product out of inventory sync.' string='Synchronize Inventory'
  • inventory_sync_status Char
    compute='_compute_template_inventory_sync_status' string='Inventory Status'
Public methods (0)

No public methods.

New fields (11)
  • collection_ids Many2many → shopify.collection
    string='Collections' args: 'shopify.collection', 'shopify_collection_product_rel', 'product_binding_id', 'collection_id'
  • handle Char
    index=True
  • image_binding_ids One2many → shopify.product.image
    string='Shopify Images' args: 'shopify.product.image', 'template_binding_id'
  • initial_seed_pending Boolean
    copy=False help='Retry marker for a newly created Odoo template.' readonly=True
  • main_image_checksum Char
    copy=False readonly=True
  • main_image_shopify_id Char
    copy=False readonly=True string='Main Image Shopify GID'
  • odoo_id Many2one → product.template
    index=True ondelete='cascade' required=True string='Odoo Product' args: 'product.template'
  • odoo_status Selection
    default='DRAFT' help='Full Shopify lifecycle status used when Odoo owns Status.' required=True string='Odoo-owned Shopify Status' args: [('ACTIVE', 'Active'), ('DRAFT', 'Draft'), ('ARCHIVED', 'Archived'), ('UNLISTED', 'Unlisted')]
  • remote_deleted Boolean
    copy=False index=True readonly=True string='Deleted from Shopify'
  • status Selection
    default='DRAFT' index=True required=True args: [('ACTIVE', 'Active'), ('DRAFT', 'Draft'), ('ARCHIVED', 'Archived'), ('UNLISTED', 'Unlisted')]
  • variant_binding_ids One2many → shopify.product.variant
    string='Shopify Variants' args: 'shopify.product.variant', 'template_binding_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • inventory_item_shopify_id Char
    copy=False index=True readonly=True string='Shopify Inventory Item GID'
  • inventory_state_ids One2many → shopify.inventory.state
    string='Inventory Levels' args: 'shopify.inventory.state', 'variant_binding_id'
  • inventory_sync_enabled Boolean
    default=True help='Disable to opt this variant out of inventory synchronization.' string='Synchronize Inventory'
  • inventory_sync_status Selection
    compute='_compute_inventory_sync_status' string='Inventory Status' args: [('ready', 'Ready'), ('disabled', 'Opted Out'), ('not_tracked', 'Not Tracked'), ('not_storable', 'Not Storable'), ('missing_item', 'Missing Inventory Item')]
  • inventory_tracked Boolean
    copy=False index=True readonly=True string='Tracked by Shopify'
Public methods (0)

No public methods.

New fields (8)
  • barcode_snapshot Char
    readonly=True string='Shopify Barcode'
  • image_checksum Char
    copy=False readonly=True
  • image_shopify_id Char
    copy=False readonly=True string='Variant Image Shopify GID'
  • odoo_id Many2one → product.product
    index=True ondelete='cascade' required=True string='Odoo Variant' args: 'product.product'
  • price_item_id Many2one → product.pricelist.item
    ondelete='set null' readonly=True string='Shopify Pricelist Rule' args: 'product.pricelist.item'
  • price_snapshot Char
    help='Decimal amount as provided by Shopify, without float arithmetic.' readonly=True string='Shopify Price'
  • sku_snapshot Char
    readonly=True string='Shopify SKU'
  • template_binding_id Many2one → shopify.product.template
    index=True ondelete='cascade' required=True args: 'shopify.product.template'
Public methods (0)

No public methods.

New fields (10)
  • amount Char
    help='Exact refund amount in the imported order currency.' readonly=True
  • company_id Many2one → res.company
    readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • created_at Datetime
    readonly=True
  • currency_id Many2one → res.currency
    ondelete='restrict' readonly=True args: 'res.currency'
  • line_ids One2many → shopify.refund.line
    string='Refund Lines' args: 'shopify.refund.line', 'refund_id'
  • move_id Many2one → account.move
    check_company=True ondelete='set null' readonly=True string='Credit Note' args: 'account.move'
  • note Text
    readonly=True
  • order_binding_id Many2one → shopify.order
    index=True ondelete='cascade' required=True args: 'shopify.order'
  • raw_payload Json
    readonly=True
  • restock_requested Boolean
    readonly=True
Public methods (0)

No public methods.

New fields (7)
  • order_line_binding_id Many2one → shopify.order.line
    ondelete='set null' args: 'shopify.order.line'
  • quantity Float
    readonly=True
  • refund_id Many2one → shopify.refund
    index=True ondelete='cascade' required=True args: 'shopify.refund'
  • restock_type Char
    readonly=True
  • shopify_id Char
    index=True required=True
  • subtotal Char
    readonly=True
  • tax Char
    readonly=True
Public methods (0)

No public methods.

New fields (10)
  • closed_at Datetime
    readonly=True
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • created_at Datetime
    readonly=True
  • exchange_lines Json
    readonly=True
  • name Char
    readonly=True
  • order_binding_id Many2one → shopify.order
    index=True ondelete='cascade' required=True args: 'shopify.order'
  • raw_payload Json
    readonly=True
  • return_lines Json
    readonly=True
  • return_status Char
    index=True readonly=True
  • total_quantity Float
    readonly=True
Public methods (0)

No public methods.

New fields (6)
  • company_id Many2one → res.company
    index=True readonly=True related='instance_id.company_id' store=True args: 'res.company'
  • country_id Many2one → res.country
    ondelete='restrict' required=True args: 'res.country'
  • instance_id Many2one → shopify.instance
    index=True ondelete='cascade' required=True args: 'shopify.instance'
  • price_included Boolean
    required=True
  • rate Char
    help='Exact Shopify tax rate as a decimal fraction, for example 0.11.' required=True
  • tax_id Many2one → account.tax
    check_company=True domain="[('type_tax_use', '=', 'sale')]" ondelete='restrict' required=True args: 'account.tax'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (6)
  • error_message Text
    readonly=True
  • instance_id Many2one → shopify.instance
    index=True ondelete='cascade' required=True args: 'shopify.instance'
  • payload Json
    readonly=True required=True string='Raw Payload'
  • state Selection
    default='received' index=True readonly=True required=True args: [('received', 'Received'), ('queued', 'Queued'), ('done', 'Done'), ('error', 'Error')]
  • topic Char
    index=True readonly=True required=True
  • webhook_id Char
    index=True readonly=True required=True
Public methods (1)
  • action_retry_dispatch(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_cancel(self)

New fields (1)
  • shopify_risk_hold Boolean
    copy=False index=True readonly=True
Public methods (1)
  • button_validate(self)

New fields (1)
  • shopify_fulfillment_ids One2many → shopify.fulfillment
    readonly=True string='Shopify Fulfillments' args: 'shopify.fulfillment', 'picking_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, values)