Every Shopify order that reaches Qoblex has to be attached to a customer contact. Qoblex works out which contact that is at the moment it processes the order: it looks for an existing customer that matches, reuses it if it finds one, and creates a new one if it does not. There is no separate customer import and no customer list to sync. Your Shopify customers arrive in Qoblex as a by-product of their orders.
This article explains exactly how that matching works, which Shopify field lands in which Qoblex field, how a business-to-business (B2B) company order is handled differently from an ordinary storefront order, and, most importantly, why the same real-world customer can end up with more than one contact record in Qoblex. After reading it you will be able to look at a duplicated contact and say which rule produced it, and decide what to change in Shopify so it stops happening.
When customer sync runs, and which way it flows
Customer sync is one-directional: Shopify to Qoblex, and it is driven entirely by orders.
- Qoblex does not subscribe to customer changes in Shopify. Creating, editing, or deleting a customer in Shopify does nothing in Qoblex on its own.
- A contact is created or updated only while Qoblex is processing a Shopify order. Three things bring orders in, and all three create contacts the same way: orders arriving while the store is connected, the import of your open orders that runs each time a product import finishes, and a manual historical order import for a date range you choose.
- Because the automatic first fill covers open orders only, a customer whose orders were all closed or cancelled before you connected the store will not appear until you run a manual historical import that covers them.
- Changes you make to a contact in Qoblex are never pushed back to Shopify. The two customer lists are not kept in step with each other; Shopify simply supplies the details attached to each order.
Which path an order takes: B2B or retail
Before anything else, Qoblex decides whether the order is a company (B2B) order or an ordinary retail order. This single decision changes how the contact is named, how it is matched, and what business type it gets.
An order is treated as a company order when Shopify reports a purchasing company on it and the order has a customer attached. The purchasing company is Shopify’s own B2B feature, where the order is placed on behalf of a company in your Shopify B2B catalog. Everything else is treated as a retail order, including a company order that carries no customer, which goes to Anonymous customer like any other order without one.
| Company (B2B) order | Retail order | |
|---|---|---|
| What identifies it | Shopify reports a purchasing company on the order and the order has a customer | Everything else |
| Contact is named after | The purchasing company name | The Company field on the customer’s default address, if filled; otherwise the customer’s name |
| Matched against existing contacts by | Name only | Email and name together |
| Business type | Wholesale, but only on a contact Qoblex creates | Retail, but only on a contact Qoblex creates |
| Buyer added as a contact person | Yes | No |
How a retail order finds or creates a contact
This is the path almost every storefront order takes.
Step 1. Qoblex works out the contact name
The name is decided in this order, and the first rule that produces something wins:
- If the Shopify customer’s default address has a Company filled in, that company name becomes the contact name.
- Otherwise the customer’s first name and last name, joined with a space. If only one of the two is filled, that one is used on its own.
- Otherwise the customer’s email address.
- Otherwise the literal name Anonymous customer.
Leading and trailing spaces are removed and runs of spaces inside the name are collapsed to one.
Step 2. Qoblex works out the email
The customer’s default email address is used. If the Shopify customer has no email at all, Qoblex generates a placeholder from the buyer’s name so the contact can still be saved: the name is lower-cased, spaces become underscores, and @notvalid.com is appended. A customer called John Smith with no email becomes john_smith@notvalid.com.
Step 3. Qoblex looks for an existing customer
Qoblex searches your customers for one where both the email and the name match what it worked out in steps 1 and 2. Suppliers are never matched, only customer contacts.
- A match is found. Qoblex reuses that contact and attaches the order to it. If the contact had been deleted, it is restored first. Any address on this order that the contact does not already hold is added to it. The contact’s existing name and email are left exactly as they are. The sync will not rename or re-email a contact you already have.
- No match is found. Qoblex creates a new customer with business type Retail.
If the order has no customer at all
Some orders reach Qoblex with no customer attached at all. These are all booked against a single built-in contact named Anonymous customer with the email anonymous_customer@noemail.com and business type Retail, so the order still has somewhere to live. Addresses from these orders are not merged into that contact.
How a company (B2B) order finds or creates a contact
When Shopify reports a purchasing company on the order:
- The contact name is the purchasing company name, trimmed and with repeated spaces collapsed.
- Qoblex searches your customers for one with the same name. The email is not part of this search.
- If one is found, it is reused, restored first if it had been deleted, and its addresses are merged.
- If none is found, a new customer is created with business type Wholesale.
- Either way, the person who placed the order is added to that company as a contact person, on the contact’s Contacts tab, with their name, email, and phone number. If a contact person with the same name is already there, their details are updated instead of a second row being added.
This is what you want for B2B: one company contact, with the individual buyers listed underneath it.
Field mapping
The contact record
| Qoblex field | Shopify source | Written on later orders? |
|---|---|---|
| Company name | B2B: the purchasing company name. Retail: the Company on the customer’s default address, else first + last name, else email, else Anonymous customer |
No. Trimmed and with repeated spaces collapsed when the contact is created, then left alone. |
| Customer’s default email address | No. If blank, a placeholder built from the buyer’s name is generated when the contact is created, then left alone. On a contact named after a company the two differ: Acme Fabrics can hold john_smith@notvalid.com. |
|
| Primary Person name | Customer’s first name + last name; their email if both names are blank | Yes, every time. Whatever is there is replaced. |
| Mobile | Customer’s default phone number | Yes, whenever Shopify has one. |
| Addresses | The customer’s default address, plus the order’s billing address, plus the order’s shipping address | Added to. Nothing is ever replaced or removed. |
| Business type | Wholesale for a purchasing-company order, Retail for everything else | No. Set only when the contact is created. On the Advanced tab. |
| Contact type | Always Customer | A Shopify order never creates a supplier. |
| Payment terms | Not supplied by Shopify | Never. The sync leaves the Payment terms dropdown unset; it is yours to choose. |
Each address
| Qoblex address field | Shopify address field |
|---|---|
| Line one | Address1 |
| Line two | Address2 |
| City | City |
| State | Province |
| Zip code | Zip |
| Country | Country |
| Landline | Phone |
| Mobile | Phone |
The one phone number Shopify holds on an address is written to both the Landline and the Mobile field on the Qoblex address.
Two addresses count as the same address when their Line one, Line two, City, Country, Zip code, and State all match. The phone number is not compared, so an address that is identical apart from its phone number is not added and the phone number already on file stays.
Each contact person (B2B orders only)
| Qoblex field | Shopify source |
|---|---|
| Name | Customer’s first name + last name; their email if both are blank; otherwise the words Anonymous customer |
| Customer’s default email address | |
| Phone | Customer’s default phone number, falling back to the phone on their default address |
What Qoblex does automatically
- Creates a customer contact the first time an order arrives that does not match one you already have.
- Reuses the matching contact on every later order, so repeat buyers do not pile up.
- Restores a deleted contact when a matching order arrives, rather than creating a new one.
- Adds new addresses from each order to the contact, keeping older addresses in place.
- Adds the buyer as a contact person under the company on B2B orders.
- Generates a placeholder email when Shopify has none, so the order is never blocked.
- Adds an empty address row when neither the customer nor the order carries an address, because a contact cannot be saved without one. A blank address on a Shopify-created contact means Shopify sent no address at all.
Why you are seeing duplicate contacts
Qoblex only reuses a contact when the match is exact. Because the name and email are re-derived from every single order, anything that changes them produces a contact that no longer matches the one you already have, and a new one is created. These are the causes, in roughly the order we see them.
The shopper fills in Company on some orders but not others
This is the most common cause by far, and the one that surprises people.
On a retail order, the Company field on the shopper’s default address decides the contact name. Fill it in and the contact is named after the company. Leave it blank and the contact is named after the person. So the same shopper, with the same email, produces:
Acme Fabricswhen their default address has Company filled in, andJane Smithwhen it does not.
The match needs the email and the name, so these are two different contacts. Anything that flips that field flips the name: the shopper editing their address, or adding a second address and making it their default.
Two people at the same company order separately
Two buyers at the same company, each with their own email, each with Company filled in as Acme Fabrics, produce two separate contacts both named Acme Fabrics, one per email address.
This is working as designed on the retail path: Qoblex has no way to tell whether two people sharing a company name in their address are really the same account. It is also why Shopify’s native B2B feature is the right tool when you genuinely sell to companies. A B2B company order matches on the company name alone and files each buyer as a contact person underneath the one company contact.
You have two contacts both called Anonymous customer
A Shopify customer who exists but has no first name, no last name, and no email is named from the only thing left: the words Anonymous customer. The placeholder email is then built from that same name, giving anonymous_customer@notvalid.com.
That is a different contact from the built-in one Qoblex uses for orders that carry no customer at all, whose email is anonymous_customer@noemail.com. The two can never match each other, so orders split across them and the list shows the same name twice.
Tell them apart by the email on the contact. Fix it in Shopify by giving those customers a name or an email address.
The customer changed their name or email in Shopify
Someone renamed or re-emailed the contact in Qoblex
The same thing happens from the other direction. If you tidy up a contact in Qoblex, shortening Acme Fabrics Ltd to Acme or changing the email to the accounts address, the next order from that Shopify customer no longer matches it, and a fresh contact appears under the original name and email.
Editing the Company name of a contact that receives Shopify orders, or its Email when the orders are retail, will cause the next order from that customer to create a duplicate. Leave those two as Shopify supplies them. Primary Person name and Mobile are safe to leave alone for a different reason: the sync rewrites them on every order anyway.
The company name is spelled differently between B2B orders
Acme Ltd and Acme Ltd. are two different companies as far as the match is concerned and you will get a contact for each.The company also orders through the storefront
The customer has no email in Shopify
@notvalid.com address built from their name. Two different people with the same name and no email will therefore collapse into one contact, which is the opposite problem. And if that customer later supplies a real email, their next order creates a new contact, because the generated address no longer matches.Editing an old order in Shopify created a contact
Qoblex works the customer out again from scratch every time an order changes, not only when it first arrives. So editing an order you synced months ago — even a change that has nothing to do with the customer, such as a note, a tag, or a quantity — re-runs the whole match. If that customer’s name, email, or address Company has changed in Shopify since, the edit creates a new contact and moves the order onto it, leaving the customer’s earlier orders on the old one.
There is one case where the new contact is left with no orders at all. If the Qoblex order is already Closed, Qoblex still creates the contact but does not move the order onto it, and records a warning on your activity feed asking you to change the customer in Qoblex yourself. The result is a contact with nothing against it, which is safe to delete once you have fixed the cause in Shopify.
You created the contact yourself before the first order arrived
Acme Fabrics with office@acme.com and then taking an order from buyer@acme.com gives you a second contact, because the retail match needs both halves.Once you have duplicates, you cannot tell which one an order will land on
You deleted a duplicate and it came back
Deleting a contact in Qoblex is a soft delete: the record stays on file so existing orders still point at it. When a Shopify order arrives that matches a deleted contact, Qoblex restores it rather than creating a new one. So deleting a duplicate that Shopify is still sending orders for will not make it go away. The next matching order brings it straight back.
Fix the cause in Shopify first, then clear up the contacts.
How to stop it happening
There is no merge action for contacts in Qoblex today, so the work is in preventing new duplicates rather than joining up the ones you have.
- Decide whether your store uses the Company field at all. If you sell to consumers, the cleanest outcome is for Company to be empty on every default address, so every contact is named after the person. Removing the field from your checkout form stops new addresses picking it up and has no effect on contacts you already have. Clearing it on an existing customer’s default address is different: it flips that customer’s name from the company to the person, so expect one more contact for each one you change.
- Use Shopify B2B for companies you genuinely sell to as companies. That is the only path that matches on the company name, keeps one contact per company, and lists the individual buyers as contact people underneath it.
- Keep company names consistent in Shopify. Agree one spelling, with or without the
Ltd, and stick to it. - Do not edit the Company name or Email of a Shopify-fed contact in Qoblex. Changing either makes the next order from that customer create a duplicate, and there is no way to merge the two back together.
- Do not keep your own details in Primary Person name or Mobile either. Those two are rewritten from Shopify on every matching order. Business type is set once, when the contact is created, and never touched again. Payment terms, price list, account manager, groups, tax class, notes, Land line Phone, Tax Number, and EORI are never written by the sync at all.
- Do not correct an address on the contact either. Addresses are re-derived from Shopify on every order. Editing one in Qoblex adds a second address rather than correcting the first, and deleting one only sticks if it is no longer the Shopify customer’s default address and is not on an incoming order. Correct the address in Shopify.
- Clean up existing duplicates last, and from the Shopify side first. Until the Shopify data stops producing two names, a deleted duplicate will be restored by the next order.
Troubleshooting
A Shopify customer has not appeared in Contacts at all
Contacts arrive only with orders, so a Shopify customer who has never placed an order that reached Qoblex will not be in your contacts list.
The usual cause on a newly connected store is that the automatic first fill covers open orders only. A customer whose orders had all been closed or cancelled before you connected brings nothing across. Run a historical order import for a date range that covers them.
Otherwise check that the order itself synced. See How Shopify order sync and order editing work for the conditions an order has to meet.
A contact has an odd @notvalid.com email
Orders are piling up on Anonymous customer
Check the email on the contact first.
If it is anonymous_customer@noemail.com, those orders reached Qoblex with no customer attached at all. Check in Shopify whether they are draft orders, company orders raised without a buyer, or orders from a sales channel that does not record a customer.
If it ends @notvalid.com, this is a different contact: a real Shopify customer with no name and no email. See You have two contacts both called Anonymous customer above.
A company contact is set to Retail instead of Wholesale
There are two causes, and both are common.
The contact may have been created by an ordinary storefront order that merely carried a company name in its address, which takes the retail path and creates a Retail. Or the contact already existed, in which case a genuine B2B order does not change it: Qoblex sets Business type only when it creates a contact, never when it reuses one.
Either way, set Business type yourself on the contact’s Advanced tab. The sync will not change it back. A future storefront order under a different email will still create a separate Retail contact, though.
A new contact person was not added to a company
The contact’s old address is still there after the customer moved
Addresses are added, not replaced. The sync never removes an address a contact already holds, so historical orders keep their addresses.
Deleting the stale one in Qoblex only sticks if Shopify has stopped sending it. If it is still the customer’s default address, or still on an order that syncs, the next order adds it straight back, exactly as a deleted duplicate contact is restored. Change it in Shopify first.