Connect a WooCommerce store on WordPress so that every order creates or updates the customer's contact, shows on their record, counts in your sales reports and can carry its campaign. Nothing is installed on the store: you add four webhooks in WooCommerce's own settings.
On WordPress, the WordPress plugin does all of this at once, with one code: it makes the four webhooks and turns them back on every day, adds a WhatsApp consent box at checkout and links each order to the visits that led to it. If you connected the store by hand first, the plugin takes over that connection and gives it its own secret, so remove your hand-made webhooks. Follow this page only to connect a store by hand. Past orders are imported the same way in both cases, as described below.
Before you start
- Who can do it: owners and administrators of the company.
- Plan: available when your plan includes Store connections. The number of active store connections is a plan limit.
- A pipeline: the connection asks for a stage. If the company has no pipeline yet, create one first under Deals, then Sales pipelines. See Deals and pipelines.
- Access to WordPress: a WordPress user who can open WooCommerce → Settings → Advanced.
- A public HTTPS store. WooCommerce sends webhooks from your web server, so the server must be able to reach https://rutbacrm.com over HTTPS.
Step 1: create the connection
- In the sidebar open Products, then click Store connections. If your plan has store connections but not products, Products opens Store connections directly.
- Under Connect a store, fill in the form:
| Field | What to enter |
|---|---|
| Store name | A name your team will recognise, up to 120 characters |
| Store platform | WooCommerce (WordPress) |
| Store currency | The currency of the store's prices. It is used for products; each order keeps its own currency |
| Webhook key from Shopify or Salla | Leave it empty |
| New quote requests start in | Any stage. WooCommerce does not send quote requests, so this is only kept for later |
| Assign new deals to | Optional. New contacts created by the store are given to this person |
- Click Connect a store.
- A box titled Signing secret appears. Copy the secret now and keep it somewhere safe: it is shown only once.
- In the new store card, copy the address in Address for your store. This is the delivery URL.
Step 2: add four webhooks in WooCommerce
In WordPress open WooCommerce → Settings → Advanced → Webhooks, click Add webhook, and create four webhooks with the same values except the topic:
| WooCommerce field | Value |
|---|---|
| Name | Anything, for example the topic name |
| Status | Active |
| Topic | One per webhook: Order created, Order updated, Product created, Product updated |
| Delivery URL | The address copied from Address for your store |
| Secret | The signing secret from step 1 |
| API Version | WP REST API Integration v3 |
When you save a webhook, WooCommerce sends a short test call. Rutba CRM answers it without changing anything, so the webhook stays active.
Step 3: turn on order attribution
For orders to carry their campaign, WooCommerce must record where the customer came from. In WordPress open WooCommerce → Settings → Advanced → Features and turn on Order Attribution. Rutba CRM then reads the utm_source, utm_medium and utm_campaign that WooCommerce saves with each order.
Your ad links must carry utm_campaign for a campaign to appear by name. Without it the order appears under its source, or under No campaign. For Google Ads, see Google Ads.
Step 4: test it
- Open your store with a link such as
https://YOUR_STORE/?utm_source=test&utm_medium=test&utm_campaign=crm-test. - Place a test order, ideally with cash on delivery or your payment gateway's test mode.
- In Rutba CRM, open Contacts and find the customer. The order is listed on their record.
- Open Store connections. The card shows Last event: with the time of the order.
- Change the order's status to Cancelled in WooCommerce. Open Reports: the order no longer counts in sales.
- Check that the campaign
crm-testappears in Reports under Sales by campaign.
What is sent, and what is not
| Arrives | Does not arrive |
|---|---|
| New orders and every status change | Orders placed before the connection, until you import them (below) |
| The customer's name, email, phone and company from the billing details | Passwords and card details |
| Order lines: SKU, name, quantity and line total | Stock levels |
| Products when they are created or edited | Customers who register without placing an order |
| The order's source, medium and campaign | Ad costs. Add them in Google Ads or by hand |
How orders are matched and counted
- Customer matching: the email decides first. If no contact has that email, the phone is tried, but only against a contact that has no other email, so two people sharing a phone are not merged. Archived contacts are not matched. The name, email and phone of an existing contact are never overwritten.
- Phone numbers: a local number is turned into international form using the billing country, for Saudi Arabia, the UAE, Kuwait, Qatar, Bahrain, Oman, Egypt, Jordan and Turkey. A store order from
0501234567then meets the same person's WhatsApp conversation. - Sales: orders with the status processing, completed, paid or delivered count as sales. A cash on delivery order therefore counts from processing. Cancelled, refunded and failed orders do not count. A partial refund does not reduce the total.
- New contacts start as leads. The first order that counts as a sale makes the contact a customer.
- Repeats are safe: WooCommerce can send the same update twice. An update older than the one already saved, or identical to it, is ignored.
- Statuses from gateways (for example a status added by an instalment provider) are saved as they are, and count as a sale only once the order reaches one of the statuses above.
- Drafts saved by the checkout before the customer finishes are ignored.
Import past orders and products
The webhooks only send what happens from now on. To bring in what came before:
- In WordPress open WooCommerce → Settings → Advanced → REST API, click Add key, and choose Read permissions only.
- In Rutba CRM, on the store card, open Import past orders and products.
- Enter Store address (the public
https://address, with no port), Consumer key and Consumer secret, then click Save keys. The keys are stored encrypted and never shown again. Type them yourself; never send them in a chat or email. - Optionally choose Orders since (empty for all), then click Start import.
The import runs in the background, products first and then orders, at up to about 500 records a minute. Its progress shows on the card, for example Running: 120 imported, 2 refused. Running it again adds nothing twice. Imported orders do not start automations, reminders or webhooks, and they do not change Last event:. Only published products are imported.
Good to know
- Unfinished checkouts: if you use WhatsApp reminders for unpaid orders, set them up under Home, then Alerts and automations. Add a consent checkbox to your checkout and enter its field name, for example
whatsapp_opt_in, in Order field that holds WhatsApp consent. The WordPress plugin adds this box and fills in the field name for you. The consent is read on every order, paid at once or not. In WooCommerce, under Settings → Products → Inventory, leave Hold stock (minutes) empty; otherwise WooCommerce cancels unpaid orders after that time and the payment link stops working. See Alerts and digests. - Privacy: customers' names, emails and phones move into Rutba CRM. Say so in your store's privacy policy before you go live.
- Turning a connection off stops it from accepting events; WooCommerce's deliveries then fail. Turn it on again with Turn on.
Troubleshooting
| What you see | What to do |
|---|---|
| No events received yet. after a test order | Check that the webhook status in WooCommerce is Active and the delivery URL is exactly the copied address. Your server must reach https://rutbacrm.com over HTTPS |
| Events refused: with a number | Events that could not be saved. Most often the order had a currency other than USD, EUR, GBP, TRY, SAR or AED, or no email and no phone. Events that arrive while your plan does not include Store connections are counted here too. They are answered as received so WooCommerce keeps the webhook on, but nothing is saved |
| WooCommerce shows a webhook as Disabled | WooCommerce disables a webhook after five failed deliveries in a row, for example during an outage. Set it back to Active after any interruption. With the WordPress plugin, click Check the store connection; the plugin also turns its webhooks back on once a day |
| Deliveries fail after Replace the secret | The new secret must be pasted into all four webhooks. Until then they are refused |
| The store refused the keys. | Create a new read-only key. Some hosts strip the authorisation header from API calls; ask your host to allow it |
| The store API was not found. | Check the store address, and that the WordPress REST API is reachable at /wp-json |
| Orders arrive with No campaign | Turn on Order Attribution and make sure your ad links carry utm_campaign |
Last updated 2026-11-08