Shopify Connector
shopify_connector · OCA/connector-shopify
- 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 ID | Name | Model | Type | Status |
|---|---|---|---|---|
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) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/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)
-
shopify_image_binding_idsOne2many → shopify.product.imagestring='Shopify Image Bindings' args: 'shopify.product.image', 'odoo_id'
-
create(self, vals_list)@api.model_create_multi -
unlink(self) -
write(self, values)
No new fields.
Public methods (3)-
create(self, vals_list)@api.model_create_multi -
unlink(self) -
write(self, values)
-
shopify_variant_binding_idsOne2many → shopify.product.variantstring='Shopify Variant Bindings' args: 'shopify.product.variant', 'odoo_id'
-
action_open_shopify_export_wizard(self) -
write(self, values)
-
shopify_binding_idsOne2many → shopify.product.templatestring='Shopify Bindings' args: 'shopify.product.template', 'odoo_id'
-
action_open_shopify_export_wizard(self) -
write(self, values)
No new fields.
Public methods (1)-
write(self, values)
-
shopify_customer_binding_idsOne2many → shopify.customerstring='Shopify Customer Bindings' args: 'shopify.customer', 'odoo_id'
-
create(self, vals_list)@api.model_create_multi -
unlink(self) -
write(self, values)
-
shopify_company_idMany2one → res.companyhelp='Company scope for categories created from Shopify tags.'index=Trueondelete='cascade' args: 'res.company'
No public methods.
-
shopify_binding_idsOne2many → shopify.orderstring='Shopify Bindings' args: 'shopify.order', 'odoo_id' -
shopify_discount_codesCharcopy=Falsereadonly=True -
shopify_noteTextcopy=Falsereadonly=True -
shopify_risk_holdBooleancopy=Falseindex=Truereadonly=True -
shopify_risk_levelSelectioncopy=Falsereadonly=True args: [('UNKNOWN', 'Unknown'), ('NONE', 'None'), ('LOW', 'Low'), ('MEDIUM', 'Medium'), ('HIGH', 'High')] -
shopify_tagsCharcopy=Falsereadonly=True
-
action_release_shopify_risk_hold(self)
-
shopify_discount_amountCharcopy=Falsereadonly=True -
shopify_expected_totalCharcopy=Falsereadonly=True -
shopify_is_gift_cardBooleancopy=Falsereadonly=True -
shopify_is_shippingBooleancopy=Falsereadonly=True -
shopify_line_idCharcopy=Falseindex=Truereadonly=True
No public methods.
-
error_messageTextreadonly=True -
external_updated_atDatetimehelp='UTC update timestamp last reported by Shopify.'string='Shopify Updated At' -
instance_idMany2one → shopify.instanceindex=Trueondelete='cascade'required=Truestring='Shopify Instance' args: 'shopify.instance' -
last_sync_dateDatetimehelp='UTC timestamp of the last successful synchronization.'readonly=Truestring='Last Synchronization' -
shopify_idCharhelp='Stable Shopify GraphQL global ID.'index=Truerequired=Truestring='Shopify GID' -
stateSelectiondefault='pending'index=Truerequired=True args: [('pending', 'Pending'), ('synced', 'Synchronized'), ('error', 'Error')]
No public methods.
No new fields.
Public methods (2)-
action_reset_to_pending(self) -
action_retry_sync(self)
-
carrier_idMany2one → delivery.carriercheck_company=Trueondelete='cascade'required=True args: 'delivery.carrier' -
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
instance_idMany2one → shopify.instanceindex=Trueondelete='cascade'required=True args: 'shopify.instance' -
tracking_companyCharhelp='Company string sent in Shopify tracking information.'required=True
-
create(self, vals_list)@api.model_create_multi
No new fields.
Public methods (0)No public methods.
-
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
odoo_pricelist_idMany2one → product.pricelistcheck_company=Trueondelete='restrict'required=True args: 'product.pricelist' -
price_list_shopify_idCharindex=Truereadonly=Truestring='Shopify Price List GID' -
statusCharreadonly=True -
titleCharrequired=True
No public methods.
-
activeBooleandefault=True -
collection_typeSelectiondefault='custom'index=Truerequired=True args: [('custom', 'Custom'), ('smart', 'Smart')] -
handleCharindex=True -
nameCharindex=Truerequired=True -
product_binding_idsMany2many → shopify.product.templatestring='Products' args: 'shopify.product.template', 'shopify_collection_product_rel', 'collection_id', 'product_binding_id'
-
write(self, values)
No new fields.
Public methods (0)No public methods.
-
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
contact_binding_idsOne2many → shopify.company.contactstring='Company Contacts' args: 'shopify.company.contact', 'company_binding_id' -
external_idCharreadonly=Truestring='Shopify External ID' -
location_binding_idsOne2many → shopify.company.locationstring='Company Locations' args: 'shopify.company.location', 'company_binding_id' -
odoo_idMany2one → res.partnercheck_company=Trueindex=Trueondelete='cascade'required=Truestring='Odoo Company' args: 'res.partner'
No public methods.
-
company_binding_idMany2one → shopify.companyindex=Trueondelete='cascade'required=True args: 'shopify.company' -
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
customer_shopify_idCharindex=Truereadonly=True -
odoo_idMany2one → res.partnercheck_company=Trueindex=Trueondelete='cascade'required=Truestring='Odoo Company Contact' args: 'res.partner' -
rolesTextreadonly=True -
titleCharreadonly=True
No public methods.
-
billing_odoo_idMany2one → res.partnercheck_company=Trueondelete='set null'string='Odoo Billing Address' args: 'res.partner' -
company_binding_idMany2one → shopify.companyindex=Trueondelete='cascade'required=True args: 'shopify.company' -
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
odoo_idMany2one → res.partnercheck_company=Trueindex=Trueondelete='cascade'required=Truestring='Odoo Company Location' args: 'res.partner'
No public methods.
No new fields.
Public methods (0)No public methods.
-
address_binding_idsOne2many → shopify.customer.addressstring='Shopify Addresses' args: 'shopify.customer.address', 'customer_binding_id' -
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
email_marketing_stateCharreadonly=True -
odoo_idMany2one → res.partnercheck_company=Trueindex=Trueondelete='cascade'required=Truestring='Odoo Customer' args: 'res.partner' -
tag_category_idsMany2many → res.partner.categoryreadonly=Truestring='Imported Shopify Tags' args: 'res.partner.category', 'shopify_customer_category_rel', 'customer_binding_id', 'category_id' -
tagsTextreadonly=True -
tax_exemptBooleanreadonly=True
No public methods.
-
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
customer_binding_idMany2one → shopify.customerindex=Trueondelete='cascade'required=True args: 'shopify.customer' -
is_defaultBooleanreadonly=True -
odoo_idMany2one → res.partnercheck_company=Trueindex=Trueondelete='cascade'required=Truestring='Odoo Address' args: 'res.partner'
No public methods.
-
fieldSelectionindex=Truerequired=True args: PRODUCT_FIELDS -
instance_idMany2one → shopify.instanceindex=Trueondelete='cascade'required=True args: 'shopify.instance' -
ownerSelectiondefault='odoo'required=True args: [('odoo', 'Odoo'), ('shopify', 'Shopify')]
No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
-
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
fulfillment_order_idsMany2many → shopify.fulfillment.orderreadonly=Truestring='Fulfillment Orders' args: 'shopify.fulfillment.order', 'shopify_fulfillment_order_rel', 'fulfillment_id', 'fulfillment_order_id' -
fulfillment_statusCharindex=Truereadonly=Truestring='Status' -
idempotency_keyCharcopy=Falseindex=Truereadonly=True -
location_shopify_idCharindex=Truereadonly=True -
order_binding_idMany2one → shopify.orderindex=Trueondelete='cascade'required=True args: 'shopify.order' -
originSelectiondefault='shopify'index=Truereadonly=Truerequired=True args: [('odoo', 'Odoo'), ('shopify', 'Shopify / External')] -
picking_idMany2one → stock.pickingcheck_company=Trueindex=Trueondelete='set null'readonly=Truestring='Odoo Delivery' args: 'stock.picking' -
raw_payloadJsonreadonly=True -
shopify_idCharindex=Truereadonly=Truerequired=Falsestring='Shopify GID' -
tracking_companyCharreadonly=True -
tracking_numberCharreadonly=True -
tracking_urlCharreadonly=True
-
action_cancel_shopify(self)
No new fields.
Public methods (0)No public methods.
-
assigned_location_idMany2one → shopify.locationindex=Trueondelete='restrict'string='Assigned Shopify Location' args: 'shopify.location' -
assigned_location_nameCharreadonly=True -
assigned_location_shopify_idCharindex=Truereadonly=True -
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
fulfillment_holdsJsonreadonly=True -
fulfillment_idsMany2many → shopify.fulfillmentreadonly=Truestring='Fulfillments' args: 'shopify.fulfillment', 'shopify_fulfillment_order_rel', 'fulfillment_order_id', 'fulfillment_id' -
fulfillment_statusCharindex=Truereadonly=Truestring='Status' -
is_heldBooleanindex=Truereadonly=True -
line_idsOne2many → shopify.fulfillment.order.linestring='Remaining Lines' args: 'shopify.fulfillment.order.line', 'fulfillment_order_id' -
order_binding_idMany2one → shopify.orderindex=Trueondelete='cascade'required=True args: 'shopify.order' -
request_statusCharindex=Truereadonly=True -
supported_actionsJsonreadonly=True
-
action_refresh(self) -
action_release_hold(self)
-
company_idMany2one → res.companyindex=Truereadonly=Truerelated='fulfillment_order_id.company_id'store=True args: 'res.company' -
fulfillment_order_idMany2one → shopify.fulfillment.orderindex=Trueondelete='cascade'required=True args: 'shopify.fulfillment.order' -
instance_idMany2one → shopify.instanceindex=Truereadonly=Truerelated='fulfillment_order_id.instance_id'store=True args: 'shopify.instance' -
order_line_binding_idMany2one → shopify.order.lineindex=Trueondelete='restrict'string='Shopify Order Line' args: 'shopify.order.line' -
order_line_shopify_idCharindex=Truereadonly=True -
remaining_quantityIntegerreadonly=True -
shopify_idCharindex=Truereadonly=Truerequired=Truestring='Fulfillment Order Line GID' -
total_quantityIntegerreadonly=True
No public methods.
-
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
gatewayCharindex=Truerequired=True -
instance_idMany2one → shopify.instanceindex=Trueondelete='cascade'required=True args: 'shopify.instance' -
journal_idMany2one → account.journalcheck_company=Truedomain="[('type', 'in', ('bank', 'cash'))]"ondelete='restrict'required=True args: 'account.journal'
-
create(self, vals_list)@api.model_create_multi -
write(self, values)
-
amountCharrequired=True -
gatewayCharrequired=True -
instance_idMany2one → shopify.instanceindex=Trueondelete='cascade'required=True args: 'shopify.instance' -
order_binding_idMany2one → shopify.orderondelete='cascade'required=True args: 'shopify.order' -
payment_idMany2one → account.paymentondelete='restrict'required=True args: 'account.payment' -
transaction_shopify_idCharindex=Truerequired=True
No public methods.
No new fields.
Public methods (2)-
action_import_locations(self) -
action_push_inventory(self)
No new fields.
Public methods (1)-
action_import_orders(self)
-
field_mapping_idsOne2many → shopify.field.mappingcopy=Truestring='Product Field Ownership' args: 'shopify.field.mapping', 'instance_id' -
product_create_if_missingBooleandefault=Truehelp='Create an Odoo product when no barcode or SKU match exists.'string='Create Missing Odoo Products' -
product_delete_behaviorSelectiondefault='archive'required=Truestring='Shopify Product Deletion' args: [('archive', 'Archive in Odoo'), ('ignore', 'Keep Active in Odoo')] -
product_pricelist_idMany2one → product.pricelistcheck_company=Truehelp='Variant-specific Shopify prices are stored as fixed-price rules on this pricelist.'ondelete='restrict'required=Truestring='Shopify Product Pricelist' args: 'product.pricelist' -
shop_currency_idMany2one → res.currencydefault=<expr>readonly=Truerequired=Truestring='Shopify Shop Currency' args: 'res.currency'
-
create(self, vals_list)@api.model_create_multi -
write(self, values)
-
inventory_allow_negativeBooleandefault=Falsehelp='Otherwise negative Odoo stock is clamped to zero and logged.'string='Allow Negative Shopify Quantities' -
inventory_echo_window_secondsIntegerdefault=300help='Seconds during which a matching Shopify webhook is an echo.'required=Truestring='Webhook Echo Window' -
inventory_import_enabledBooleandefault=Falsehelp='Apply inventory_levels/update webhooks to mapped Odoo locations.'string='Import Shopify Inventory' -
inventory_quantity_basisSelectiondefault='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_idsOne2many → shopify.locationstring='Shopify Locations' args: 'shopify.location', 'instance_id'
No public methods.
-
accept_webhooksBooleandefault=Truehelp='Disable to reject webhook delivery for this instance.' -
access_tokenCharcopy=Falsegroups='shopify_connector.group_shopify_manager'string='Admin API Access Token' -
activeBooleandefault=True -
api_versionChardefault=API_VERSIONreadonly=Truerequired=Truestring='API Version' -
company_idMany2one → res.companydefault=<expr>index=Truerequired=True args: 'res.company' -
nameCharrequired=True -
shop_urlCharhelp='Shopify myshopify.com domain, without an Admin API path.'required=Truestring='Shop Domain' -
stateSelectioncopy=Falsedefault='draft'readonly=Truerequired=True args: [('draft', 'Draft'), ('connected', 'Connected'), ('error', 'Error')] -
webhook_max_payload_bytesIntegerdefault=<expr>help='Reject larger webhook request bodies before HMAC verification.'required=Truestring='Maximum Webhook Payload' -
webhook_secretCharcopy=Falsegroups='shopify_connector.group_shopify_manager'
-
action_duplicate_configuration(self) -
action_repair_webhook_subscriptions(self) -
action_test_connection(self) -
create(self, vals_list)@api.model_create_multi -
write(self, values)
No new fields.
Public methods (2)-
action_import_b2b(self) -
action_import_customers(self)
-
dashboard_collectionsCharcompute='_compute_operability_dashboard' -
dashboard_companiesCharcompute='_compute_operability_dashboard' -
dashboard_customersCharcompute='_compute_operability_dashboard' -
dashboard_drift_cronsTextcompute='_compute_operability_dashboard' -
dashboard_financialCharcompute='_compute_operability_dashboard' -
dashboard_fulfillmentsCharcompute='_compute_operability_dashboard' -
dashboard_locationsCharcompute='_compute_operability_dashboard' -
dashboard_ordersCharcompute='_compute_operability_dashboard' -
dashboard_productsCharcompute='_compute_operability_dashboard' -
dashboard_queue_backlogIntegercompute='_compute_operability_dashboard' -
dashboard_recent_errorsTextcompute='_compute_operability_dashboard' -
dashboard_table_sizesTextcompute='_compute_operability_dashboard' -
dashboard_variantsCharcompute='_compute_operability_dashboard' -
dashboard_webhooksTextcompute='_compute_operability_dashboard' -
log_retention_daysIntegerdefault=30required=True -
webhook_health_checked_atDatetimereadonly=True -
webhook_missing_topicsTextreadonly=True -
webhook_retention_daysIntegerdefault=30required=True
-
action_check_webhook_health(self) -
action_open_binding_errors(self)
-
auto_confirm_paidBooleandefault=True -
auto_confirm_partially_paidBooleandefault=True -
delivery_product_idMany2one → product.productcheck_company=Trueondelete='restrict'readonly=True args: 'product.product' -
gateway_journal_idsOne2many → shopify.gateway.journalstring='Gateway Journals' args: 'shopify.gateway.journal', 'instance_id' -
gift_card_journal_idMany2one → account.journalcheck_company=Truedomain="[('type', 'in', ('bank', 'cash'))]"ondelete='restrict' args: 'account.journal' -
gift_card_product_idMany2one → product.productcheck_company=Trueondelete='restrict' args: 'product.product' -
high_risk_hold_enabledBooleandefault=True -
order_binding_idsOne2many → shopify.orderstring='Orders' args: 'shopify.order', 'instance_id' -
order_confirmation_policySelectiondefault='quotation'required=True args: [('quotation', 'Import as Quotation'), ('auto', 'Auto-confirm Eligible')] -
order_currency_policySelectiondefault='presentment'required=True args: [('presentment', 'Presentment Currency'), ('shop', 'Shop Currency')] -
order_import_date_fromDate -
order_import_date_toDate -
order_invoicing_policySelectiondefault='manual'required=True args: [('manual', 'Manual'), ('paid', 'Invoice on Paid'), ('fulfillment', 'Invoice on Fulfillment')] -
placeholder_product_idMany2one → product.productcheck_company=Trueondelete='restrict' args: 'product.product' -
refund_uninvoiced_policySelectiondefault='adjust'required=True args: [('adjust', 'Adjust Order'), ('cancel', 'Cancel Fully Refunded Order')] -
tax_mapping_idsOne2many → shopify.tax.mappingstring='Tax Mappings' args: 'shopify.tax.mapping', 'instance_id' -
unknown_product_policySelectiondefault='block'required=True args: [('block', 'Block With Error'), ('placeholder', 'Use Placeholder Product')]
-
create(self, vals_list)@api.model_create_multi -
write(self, values)
-
carrier_mapping_idsOne2many → shopify.carrier.mappingstring='Carrier Mappings' args: 'shopify.carrier.mapping', 'instance_id' -
fulfillment_auto_validate_webhookBooleandefault=Falsehelp='Validate matching Odoo deliveries when an external Shopify fulfillment webhook is received. Disabled is log-only.'string='Validate Deliveries from Webhooks' -
fulfillment_notify_customerBooleandefault=Truehelp='Ask Shopify to send its fulfillment notification.'string='Notify Customer'
No public methods.
No new fields.
Public methods (1)-
action_import_products(self)
-
b2b_import_enabledBooleandefault=Truestring='Import Shopify B2B' -
catalog_binding_idsOne2many → shopify.catalogstring='B2B Catalogs' args: 'shopify.catalog', 'instance_id' -
company_binding_idsOne2many → shopify.companystring='B2B Companies' args: 'shopify.company', 'instance_id' -
customer_binding_idsOne2many → shopify.customerstring='Customers' args: 'shopify.customer', 'instance_id' -
customer_export_enabledBooleandefault=Falsehelp='Export changes for linked customers when Odoo owns the field.'string='Export Odoo Customers' -
guest_partner_idMany2one → res.partnercheck_company=Trueondelete='restrict'readonly=Truestring='Shopify Guest Customer' args: 'res.partner' -
shopify_plus_stateSelectiondefault='unknown'readonly=Truerequired=True args: [('unknown', 'Not Checked'), ('available', 'Shopify Plus Available'), ('unavailable', 'Shopify Plus Unavailable')]
-
create(self, vals_list)@api.model_create_multi -
write(self, values)
-
access_tokenCharrequired=True -
company_idMany2one → res.companydefault=<expr>required=True args: 'res.company' -
granted_scopesTextreadonly=True -
import_customersBooleandefault=True -
import_ordersBooleandefault=True -
import_productsBooleandefault=True -
instance_idMany2one → shopify.instanceondelete='cascade'readonly=True args: 'shopify.instance' -
inventory_directionSelectiondefault='odoo_to_shopify'required=Truestring='Stock Direction' args: [('odoo_to_shopify', 'Odoo to Shopify'), ('bidirectional', 'Odoo to Shopify + Shopify to Odoo')] -
inventory_quantity_basisSelectiondefault='free_qty'required=True args: [('free_qty', 'Free Quantity'), ('qty_available', 'On-hand Quantity')] -
location_line_idsOne2many → shopify.instance.wizard.locationstring='Location Mappings' args: 'shopify.instance.wizard.location', 'wizard_id' -
missing_scopesTextreadonly=True -
nameChardefault='Shopify Store'required=True -
order_confirmation_policySelectiondefault='quotation'required=True args: [('quotation', 'Import as Quotation'), ('auto', 'Auto-confirm Eligible')] -
order_invoicing_policySelectiondefault='manual'required=True args: [('manual', 'Manual'), ('paid', 'Invoice on Paid'), ('fulfillment', 'Invoice on Fulfillment')] -
product_create_if_missingBooleandefault=True -
required_scopesTextreadonly=True -
scope_check_okBooleanreadonly=True -
shop_urlCharrequired=True -
stepSelectiondefault='credentials'required=True args: [('credentials', 'Credentials'), ('scopes', 'API Scopes'), ('locations', 'Locations'), ('taxes', 'Tax Defaults'), ('policies', 'Policies'), ('webhooks', 'Webhooks'), ('imports', 'Initial Import')] -
tax_country_idMany2one → res.countryreadonly=True args: 'res.country' -
tax_mapping_countIntegerreadonly=True -
tax_shippingBooleanreadonly=True -
taxes_includedBooleanreadonly=True -
webhook_secretCharrequired=True
-
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
-
company_idMany2one → res.companyreadonly=Truerelated='wizard_id.company_id'store=True args: 'res.company' -
location_binding_idMany2one → shopify.locationondelete='cascade'readonly=Truerequired=True args: 'shopify.location' -
location_nameCharreadonly=Truerelated='location_binding_id.name' -
odoo_location_idMany2one → stock.locationcheck_company=Truedomain="[('usage', '=', 'internal')]"ondelete='restrict' args: 'stock.location' -
warehouse_idMany2one → stock.warehousecheck_company=Trueondelete='restrict' args: 'stock.warehouse' -
wizard_idMany2one → shopify.instance.wizardondelete='cascade'required=True args: 'shopify.instance.wizard'
No public methods.
-
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
instance_idMany2one → shopify.instanceindex=Trueondelete='cascade'required=True args: 'shopify.instance' -
last_pushed_atDatetimereadonly=True -
last_pushed_quantityIntegerreadonly=True -
last_shopify_quantityIntegerreadonly=True -
last_sync_dateDatetimereadonly=True -
location_binding_idMany2one → shopify.locationindex=Trueondelete='cascade'required=True args: 'shopify.location' -
variant_binding_idMany2one → shopify.product.variantindex=Trueondelete='cascade'required=True args: 'shopify.product.variant'
No public methods.
-
activeBooleandefault=Trueindex=Truereadonly=Truestring='Active in Shopify' -
addressCharreadonly=True -
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
fulfills_online_ordersBooleanreadonly=True -
is_mappedBooleancompute='_compute_is_mapped'index=Truestore=Truestring='Mapped' -
legacy_resource_idCharindex=Truereadonly=Truestring='Shopify Legacy ID' -
nameCharindex=Truerequired=True -
odoo_location_idMany2one → stock.locationcheck_company=Truedomain="[('usage', '=', 'internal')]"ondelete='restrict'string='Odoo Internal Location' args: 'stock.location' -
warehouse_idMany2one → stock.warehousecheck_company=Truehelp='Selecting a warehouse maps its main stock location by default.'ondelete='restrict'string='Odoo Warehouse' args: 'stock.warehouse'
-
create(self, vals_list)@api.model_create_multi -
write(self, values)
-
directionSelectionindex=Truerequired=True args: [('import', 'Shopify to Odoo'), ('export', 'Odoo to Shopify')] -
entityCharindex=Truerequired=True -
instance_idMany2one → shopify.instanceindex=Trueondelete='cascade'required=True args: 'shopify.instance' -
levelSelectiondefault='info'index=Truerequired=True args: [('info', 'Info'), ('warning', 'Warning'), ('error', 'Error')] -
messageTextrequired=True -
res_idIntegerindex=Truestring='Related Document ID' -
res_modelCharindex=Truestring='Related Document Model'
No public methods.
No new fields.
Public methods (1)-
action_open_related_record(self)
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (1)-
action_refresh_fulfillment_orders(self)
-
cancelled_atDatetimereadonly=Truestring='Shopify Cancelled At' -
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
completed_order_shopify_idCharindex=Truereadonly=True -
created_atDatetimereadonly=Truestring='Shopify Created At' -
discount_codesTextreadonly=True -
draft_statusCharreadonly=True -
financial_statusCharindex=Truereadonly=True -
fulfillment_statusCharindex=Truereadonly=True -
is_draftBooleanindex=Truereadonly=True -
line_binding_idsOne2many → shopify.order.linestring='Shopify Lines' args: 'shopify.order.line', 'order_binding_id' -
missing_tax_country_idMany2one → res.countryondelete='set null'readonly=True args: 'res.country' -
missing_tax_includedBooleanreadonly=True -
missing_tax_rateCharreadonly=True -
odoo_idMany2one → sale.ordercheck_company=Truehelp='Empty when an atomic order build failed before creating a sale order.'index=Trueondelete='set null'string='Odoo Sales Order' args: 'sale.order' -
order_currency_idMany2one → res.currencyondelete='restrict'readonly=True args: 'res.currency' -
order_nameCharindex=Truereadonly=Truestring='Shopify Order' -
order_numberCharindex=Truereadonly=True -
payload_digestCharindex=Truereadonly=True -
presentment_currency_idMany2one → res.currencyondelete='restrict'readonly=True args: 'res.currency' -
presentment_discount_totalMonetarycurrency_field='presentment_currency_id'readonly=True -
presentment_money_jsonJsonreadonly=True -
presentment_shipping_totalMonetarycurrency_field='presentment_currency_id'readonly=True -
presentment_subtotalMonetarycurrency_field='presentment_currency_id'readonly=True -
presentment_tax_totalMonetarycurrency_field='presentment_currency_id'readonly=True -
presentment_totalMonetarycurrency_field='presentment_currency_id'readonly=True -
raw_payloadJsonreadonly=Truestring='Raw Shopify Payload' -
refund_binding_idsOne2many → shopify.refundstring='Shopify Refunds' args: 'shopify.refund', 'order_binding_id' -
replaced_by_idMany2one → shopify.orderondelete='set null'readonly=Truestring='Completed Order Binding' args: 'shopify.order' -
return_binding_idsOne2many → shopify.returnstring='Shopify Returns' args: 'shopify.return', 'order_binding_id' -
risk_levelSelectiondefault='UNKNOWN'index=Truereadonly=Truerequired=True args: [('UNKNOWN', 'Unknown'), ('NONE', 'None'), ('LOW', 'Low'), ('MEDIUM', 'Medium'), ('HIGH', 'High')] -
shop_currency_idMany2one → res.currencyondelete='restrict'readonly=True args: 'res.currency' -
shop_discount_totalMonetarycurrency_field='shop_currency_id'readonly=True -
shop_money_jsonJsonreadonly=True -
shop_shipping_totalMonetarycurrency_field='shop_currency_id'readonly=True -
shop_subtotalMonetarycurrency_field='shop_currency_id'readonly=True -
shop_tax_totalMonetarycurrency_field='shop_currency_id'readonly=True -
shop_totalMonetarycurrency_field='shop_currency_id'readonly=True -
sourceSelectiondefault='online'index=Truereadonly=Truerequired=True args: [('online', 'Online Store'), ('pos', 'Point of Sale'), ('draft', 'Draft Order')] -
source_identifierCharreadonly=True -
source_nameCharreadonly=True
-
action_create_tax_mapping(self)
-
fulfillment_idsOne2many → shopify.fulfillmentstring='Fulfillments' args: 'shopify.fulfillment', 'order_binding_id' -
fulfillment_order_idsOne2many → shopify.fulfillment.orderstring='Fulfillment Orders' args: 'shopify.fulfillment.order', 'order_binding_id'
No public methods.
-
company_idMany2one → res.companyreadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
current_quantityFloatreadonly=True -
is_gift_cardBooleanreadonly=True -
is_shippingBooleanreadonly=True -
odoo_idMany2one → sale.order.linecheck_company=Trueindex=Trueondelete='cascade'required=Truestring='Odoo Sales Line' args: 'sale.order.line' -
order_binding_idMany2one → shopify.orderindex=Trueondelete='cascade'required=True args: 'shopify.order' -
presentment_discount_totalCharreadonly=True -
presentment_discounted_totalCharreadonly=True -
presentment_unit_priceCharreadonly=True -
refundable_quantityFloatreadonly=True -
shop_discount_totalCharreadonly=True -
shop_discounted_totalCharreadonly=True -
shop_unit_priceCharreadonly=True -
skuCharreadonly=True -
variant_shopify_idCharindex=Truereadonly=True
No public methods.
-
instance_idMany2one → shopify.instancerequired=True args: 'shopify.instance' -
product_tmpl_idsMany2many → product.templaterequired=Truestring='Products' args: 'product.template'
-
action_export(self)
-
image_checksumCharcopy=Falsereadonly=True -
odoo_idMany2one → product.imageindex=Trueondelete='cascade'required=Truestring='Odoo Product Image' args: 'product.image' -
source_urlCharreadonly=True -
template_binding_idMany2one → shopify.product.templateindex=Trueondelete='cascade'required=True args: 'shopify.product.template' -
variant_binding_idMany2one → shopify.product.variantindex=Trueondelete='set null' args: 'shopify.product.variant' -
variant_binding_idsMany2many → shopify.product.variantstring='Associated Shopify Variants' args: 'shopify.product.variant', 'shopify_product_image_variant_rel', 'image_binding_id', 'variant_binding_id'
No public methods.
-
inventory_sync_enabledBooleandefault=Truehelp='Disable to opt every variant of this product out of inventory sync.'string='Synchronize Inventory' -
inventory_sync_statusCharcompute='_compute_template_inventory_sync_status'string='Inventory Status'
No public methods.
-
collection_idsMany2many → shopify.collectionstring='Collections' args: 'shopify.collection', 'shopify_collection_product_rel', 'product_binding_id', 'collection_id' -
handleCharindex=True -
image_binding_idsOne2many → shopify.product.imagestring='Shopify Images' args: 'shopify.product.image', 'template_binding_id' -
initial_seed_pendingBooleancopy=Falsehelp='Retry marker for a newly created Odoo template.'readonly=True -
main_image_checksumCharcopy=Falsereadonly=True -
main_image_shopify_idCharcopy=Falsereadonly=Truestring='Main Image Shopify GID' -
odoo_idMany2one → product.templateindex=Trueondelete='cascade'required=Truestring='Odoo Product' args: 'product.template' -
odoo_statusSelectiondefault='DRAFT'help='Full Shopify lifecycle status used when Odoo owns Status.'required=Truestring='Odoo-owned Shopify Status' args: [('ACTIVE', 'Active'), ('DRAFT', 'Draft'), ('ARCHIVED', 'Archived'), ('UNLISTED', 'Unlisted')] -
remote_deletedBooleancopy=Falseindex=Truereadonly=Truestring='Deleted from Shopify' -
statusSelectiondefault='DRAFT'index=Truerequired=True args: [('ACTIVE', 'Active'), ('DRAFT', 'Draft'), ('ARCHIVED', 'Archived'), ('UNLISTED', 'Unlisted')] -
variant_binding_idsOne2many → shopify.product.variantstring='Shopify Variants' args: 'shopify.product.variant', 'template_binding_id'
No public methods.
No new fields.
Public methods (1)-
write(self, values)
No new fields.
Public methods (0)No public methods.
-
inventory_item_shopify_idCharcopy=Falseindex=Truereadonly=Truestring='Shopify Inventory Item GID' -
inventory_state_idsOne2many → shopify.inventory.statestring='Inventory Levels' args: 'shopify.inventory.state', 'variant_binding_id' -
inventory_sync_enabledBooleandefault=Truehelp='Disable to opt this variant out of inventory synchronization.'string='Synchronize Inventory' -
inventory_sync_statusSelectioncompute='_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_trackedBooleancopy=Falseindex=Truereadonly=Truestring='Tracked by Shopify'
No public methods.
-
barcode_snapshotCharreadonly=Truestring='Shopify Barcode' -
image_checksumCharcopy=Falsereadonly=True -
image_shopify_idCharcopy=Falsereadonly=Truestring='Variant Image Shopify GID' -
odoo_idMany2one → product.productindex=Trueondelete='cascade'required=Truestring='Odoo Variant' args: 'product.product' -
price_item_idMany2one → product.pricelist.itemondelete='set null'readonly=Truestring='Shopify Pricelist Rule' args: 'product.pricelist.item' -
price_snapshotCharhelp='Decimal amount as provided by Shopify, without float arithmetic.'readonly=Truestring='Shopify Price' -
sku_snapshotCharreadonly=Truestring='Shopify SKU' -
template_binding_idMany2one → shopify.product.templateindex=Trueondelete='cascade'required=True args: 'shopify.product.template'
No public methods.
-
amountCharhelp='Exact refund amount in the imported order currency.'readonly=True -
company_idMany2one → res.companyreadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
created_atDatetimereadonly=True -
currency_idMany2one → res.currencyondelete='restrict'readonly=True args: 'res.currency' -
line_idsOne2many → shopify.refund.linestring='Refund Lines' args: 'shopify.refund.line', 'refund_id' -
move_idMany2one → account.movecheck_company=Trueondelete='set null'readonly=Truestring='Credit Note' args: 'account.move' -
noteTextreadonly=True -
order_binding_idMany2one → shopify.orderindex=Trueondelete='cascade'required=True args: 'shopify.order' -
raw_payloadJsonreadonly=True -
restock_requestedBooleanreadonly=True
No public methods.
-
order_line_binding_idMany2one → shopify.order.lineondelete='set null' args: 'shopify.order.line' -
quantityFloatreadonly=True -
refund_idMany2one → shopify.refundindex=Trueondelete='cascade'required=True args: 'shopify.refund' -
restock_typeCharreadonly=True -
shopify_idCharindex=Truerequired=True -
subtotalCharreadonly=True -
taxCharreadonly=True
No public methods.
-
closed_atDatetimereadonly=True -
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
created_atDatetimereadonly=True -
exchange_linesJsonreadonly=True -
nameCharreadonly=True -
order_binding_idMany2one → shopify.orderindex=Trueondelete='cascade'required=True args: 'shopify.order' -
raw_payloadJsonreadonly=True -
return_linesJsonreadonly=True -
return_statusCharindex=Truereadonly=True -
total_quantityFloatreadonly=True
No public methods.
-
company_idMany2one → res.companyindex=Truereadonly=Truerelated='instance_id.company_id'store=True args: 'res.company' -
country_idMany2one → res.countryondelete='restrict'required=True args: 'res.country' -
instance_idMany2one → shopify.instanceindex=Trueondelete='cascade'required=True args: 'shopify.instance' -
price_includedBooleanrequired=True -
rateCharhelp='Exact Shopify tax rate as a decimal fraction, for example 0.11.'required=True -
tax_idMany2one → account.taxcheck_company=Truedomain="[('type_tax_use', '=', 'sale')]"ondelete='restrict'required=True args: 'account.tax'
-
create(self, vals_list)@api.model_create_multi -
write(self, values)
-
error_messageTextreadonly=True -
instance_idMany2one → shopify.instanceindex=Trueondelete='cascade'required=True args: 'shopify.instance' -
payloadJsonreadonly=Truerequired=Truestring='Raw Payload' -
stateSelectiondefault='received'index=Truereadonly=Truerequired=True args: [('received', 'Received'), ('queued', 'Queued'), ('done', 'Done'), ('error', 'Error')] -
topicCharindex=Truereadonly=Truerequired=True -
webhook_idCharindex=Truereadonly=Truerequired=True
-
action_retry_dispatch(self)
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (0)No public methods.
No new fields.
Public methods (1)-
action_cancel(self)
-
shopify_risk_holdBooleancopy=Falseindex=Truereadonly=True
-
button_validate(self)
-
shopify_fulfillment_idsOne2many → shopify.fulfillmentreadonly=Truestring='Shopify Fulfillments' args: 'shopify.fulfillment', 'picking_id'
No public methods.
No new fields.
Public methods (3)-
create(self, vals_list)@api.model_create_multi -
unlink(self) -
write(self, values)