Can You Use Both DSers and CJ Dropshipping on Shopify?

Can You Use Both DSers and CJ Dropshipping on Shopify?

Introduction

You started with DSers and AliExpress suppliers. Then you discovered CJ Dropshipping — faster shipping times, better product quality control, warehousing options, print-on-demand. You installed CJ alongside DSers.

For a few days, everything seemed fine.

Then the problems started. An order came in for a product mapped in DSers — but CJ tried to fulfill it too. A product you set up in CJ showed up in DSers' order queue. Inventory counts started conflicting. A customer's order got routed to two suppliers simultaneously. You cancelled one fulfillment, but the other had already shipped.

You're not alone. This exact scenario — installing both DSers and CJ Dropshipping and hoping they'll peacefully coexist — is one of the most common and most painful mistakes new dropshippers make on Shopify.

The short answer to "Can you use both?" is: Yes, but only if you architect the separation correctly from the start. Both apps installed without deliberate product segregation will conflict — and the conflicts happen at the worst possible moment: when a real customer's order is processing.

This guide explains exactly where the conflicts occur, why they happen at the technical level, and how to run both apps on one store without fulfillment chaos.


Who This Guide Is For

  • New dropshippers who have both DSers and CJ installed and are experiencing order conflicts
  • Merchants planning to add a second dropshipping app to an existing store
  • Store owners experiencing double fulfillment, duplicate orders, or routing errors
  • Developers building or advising on multi-supplier dropshipping stores
  • Anyone who has Googled "DSers and CJ Dropshipping at the same time" and found no clear answer

Understanding How Each App Works at the Technical Level

Before diagnosing conflicts, understand what each app actually does inside Shopify — because the conflict is architectural, not a bug in either app.


How DSers Works

DSers operates as a fulfillment layer that:

  1. Monitors your Shopify order queue via Shopify's Order API
  2. Matches incoming orders to products using its own product mapping database (DSers-side, not Shopify-side)
  3. When a mapped product is ordered, DSers claims the order for fulfillment
  4. DSers places the order with your AliExpress (or other) supplier
  5. DSers marks the Shopify order as fulfilled and pushes tracking information back

Key technical behavior: DSers watches all new orders in your store. It then filters which orders it should act on based on its internal product mapping. If a product is not mapped in DSers, DSers ignores that order line.


How CJ Dropshipping Works

CJ Dropshipping operates with an almost identical architecture:

  1. Monitors your Shopify order queue via Shopify's Order API
  2. Matches incoming orders to products using its own product mapping database (CJ-side)
  3. When a mapped product is ordered, CJ claims the order for fulfillment
  4. CJ places the order with CJ's warehouse or supplier network
  5. CJ marks the Shopify order as fulfilled and pushes tracking information back

Key technical behavior: CJ also watches all new orders in your store. It filters based on its own internal product mapping.


Where the Conflict Happens


New Order arrives in Shopify
         ↓
    ┌────┴────┐
    ↓         ↓
  DSers     CJ Dropshipping
  checks    checks
  its own   its own
  mapping   mapping
    ↓         ↓
Product    Product
found?     found?
    ↓         ↓
  YES   ←→   YES   ← CONFLICT

Both apps receive the same order webhook from Shopify simultaneously. If the ordered product is mapped in both apps — either deliberately or accidentally — both apps attempt to fulfill it. The result:

  • Double fulfillment: Two orders placed with two suppliers for one customer
  • Double tracking: Two tracking numbers pushed to the customer
  • Double payment: You get charged by both suppliers
  • Fulfillment status conflict: Both apps try to mark the Shopify order as fulfilled — one succeeds, one may error or override the other

Neither app knows the other exists. There is no inter-app communication or locking mechanism. Shopify's Order API does not prevent two apps from reading and acting on the same order simultaneously.


The 5 Conflict Types and What They Look Like


Conflict 1 — Duplicate Product Mapping

Cause: You add the same product to your store through both DSers and CJ. Both apps have the product in their mapping database.

Symptom: Every order for that product triggers fulfillment attempts in both apps.

How to identify:

  • Go to DSers → Products → check which variants are mapped
  • Go to CJ Dropshipping → My Products → check which products are connected
  • Any product appearing in both lists is a dual-mapping conflict

Conflict 2 — Accidental Import Overlap

Cause: You import a product from AliExpress via DSers. Later, you find the same (or similar) product on CJ and import it again — creating a second Shopify product or connecting CJ to the already-DSers-mapped product.

Symptom: Intermittent double fulfillment — only affects orders for the duplicated products.

How to identify:

  • Look for near-duplicate product titles in your Shopify product list
  • Check both apps' mapping lists for the same Shopify Product ID

Conflict 3 — Order Status Race Condition

Cause: Both apps attempt to mark the same order as "fulfilled" nearly simultaneously. Shopify processes the first fulfillment correctly, but the second app's fulfillment attempt may error — or in rare cases, create a duplicate fulfillment record.

Symptom:

  • Orders showing "fulfilled" with two tracking numbers
  • App error messages like "Order already fulfilled"
  • Orders stuck in "partially fulfilled" status

Conflict 4 — Inventory Count Conflicts

Cause: Both apps write inventory levels to Shopify for products they manage. If the same product is tracked by both apps, they overwrite each other's inventory numbers on every sync.

Symptom:

  • Inventory counts changing unexpectedly
  • Products going out of stock and back in stock repeatedly
  • Inventory numbers that don't match your actual supplier stock

Conflict 5 — Auto-Fulfillment Setting Conflicts

Cause: Both DSers and CJ have optional auto-fulfillment settings that automatically process and place orders without manual review. If both are enabled, and a product is mapped in both, auto-fulfillment in both apps fires simultaneously.

Symptom: Orders fulfilled before you have a chance to review them — with costs charged to both payment methods linked to each app.

This is the most financially damaging conflict. Always disable auto-fulfillment in at least one app during initial setup.


The Safe Architecture: Clean Product Separation

The only reliable way to run both apps simultaneously is strict, enforced product-level separation. Every product in your store must belong to exactly one fulfillment app — never both.


Your Shopify Store
├── DSers Products (AliExpress-sourced)
│   ├── Product A → mapped in DSers ONLY
│   ├── Product B → mapped in DSers ONLY
│   └── Product C → mapped in DSers ONLY
│
└── CJ Products (CJ-sourced)
    ├── Product D → mapped in CJ ONLY
    ├── Product E → mapped in CJ ONLY
    └── Product F → mapped in CJ ONLY

Rule: No product appears in both apps' mapping databases. Ever.


Implementing Clean Separation

Step 1 — Audit your current state:

Before doing anything else, run a full audit of what's currently mapped where.

In DSers:

  1. Go to DSers → Products → My Products
  2. Export or note every Shopify product currently mapped
  3. Note the Shopify Product IDs (visible in the product URL)

In CJ Dropshipping:

  1. Go to CJ → My Products → Listed Products
  2. Export or note every Shopify product currently connected
  3. Note the Shopify Product IDs

Create your mapping audit spreadsheet:


| Shopify Product ID | Product Title          | Mapped in DSers? | Mapped in CJ? | CONFLICT? |
|--------------------|------------------------|------------------|---------------|-----------|
| 7891234567890      | Blue Wireless Earbuds  | YES              | YES           | ⚠️ YES    |
| 7891234567891      | Yoga Mat Premium       | YES              | NO            | ✅ Clean  |
| 7891234567892      | LED Strip Lights 5m    | NO               | YES           | ✅ Clean  |
| 7891234567893      | Phone Case iPhone 15   | YES              | YES           | ⚠️ YES    |

Any row with both YES = immediate conflict risk.


Step 2 — Resolve existing conflicts:

For every product mapped in both apps, decide which app owns it — then remove it from the other:


Decision criteria for which app owns a product:
→ Is the CJ supplier cheaper or faster? → CJ owns it, remove from DSers
→ Is the AliExpress supplier more established? → DSers owns it, remove from CJ
→ Have you already received orders for this product? → Keep whichever app has the order history

To remove from DSers:

  1. DSers → Products → Find the product
  2. Click the product → Unmap (removes the supplier connection without deleting the Shopify product)

To remove from CJ:

  1. CJ → My Products → Find the product
  2. Click Disconnect or Remove (removes CJ connection without deleting the Shopify product)

Step 3 — Enforce separation going forward:

Create a tagging system in Shopify to track app ownership:

  1. Tag DSers products with fulfillment:dsers
  2. Tag CJ products with fulfillment:cj
  3. Before adding any new product to an app, check if it already has a tag

{%- comment -%}
  You can display fulfillment source in your admin notes using product tags.
  This prevents team members from accidentally dual-mapping products.
{%- endcomment -%}

{%- if product.tags contains 'fulfillment:dsers' -%}
  <span class="fulfillment-badge fulfillment-badge--dsers">DSers</span>
{%- elsif product.tags contains 'fulfillment:cj' -%}
  <span class="fulfillment-badge fulfillment-badge--cj">CJ Dropshipping</span>
{%- else -%}
  <span class="fulfillment-badge fulfillment-badge--unassigned">⚠️ No fulfillment app assigned</span>
{%- endif -%}

Or use Shopify Flow to enforce it automatically:


Trigger: Product created
Condition: Product tags does NOT contain "fulfillment:dsers" AND does NOT contain "fulfillment:cj"
Action: Add tag "fulfillment:unassigned"
Action: Send internal email — "New product needs fulfillment app assignment"

Configuration Settings to Get Right in Each App

Even with clean product separation, incorrect app settings can cause conflicts. Verify these settings in both apps:


DSers Settings Audit

1. Auto-fulfillment settings:


DSers → Settings → Fulfillment Settings
→ "Auto Sync Tracking Number" — OK to enable (just syncs tracking to Shopify)
→ "Auto Fulfill Orders" — CAUTION: Only enable if you trust your AliExpress suppliers
→ "Auto Order" — CAUTION: This places orders automatically without review

Recommendation for stores also running CJ: Disable Auto Order in DSers during the first 30 days. Manually review and place orders to ensure nothing is being double-processed.

2. Order filter settings:


DSers → Settings → Order Settings
→ Verify "Awaiting Order" filter shows only your DSers-managed products
→ Any CJ products appearing here = mapping conflict that wasn't caught in audit

3. Notification settings:


DSers → Settings → Notifications
→ Enable email alerts for "Order Failed" — catches cases where DSers tried to fulfill a CJ product

CJ Dropshipping Settings Audit

1. Auto-fulfillment settings:


CJ Dashboard → Settings → Auto Order
→ "Auto order for new orders" — CAUTION: Same risk as DSers auto-order
→ Recommendation: Disable during initial dual-app setup period

2. Product sync settings:


CJ Dashboard → Settings → Sync Settings
→ "Auto sync inventory" — OK but watch for conflicts on shared products
→ "Auto sync price" — disable if you set prices manually in Shopify

3. Order routing rules:


CJ Dashboard → Orders → Order Settings
→ Verify that CJ's order queue only shows orders for CJ-mapped products
→ If DSers products appear here → mapping conflict exists

Order Workflow: Safe Manual Processing with Both Apps

Until you're confident in your separation, follow this manual order processing workflow:


New order arrives in Shopify
         ↓
Step 1: Check which product(s) are in the order
         ↓
Step 2: Check product tag (fulfillment:dsers or fulfillment:cj)
         ↓
Step 3: Go to ONLY that app to process the order
         ↓
         ├── DSers product → Process in DSers → Leave CJ untouched
         └── CJ product → Process in CJ → Leave DSers untouched
         ↓
Step 4: After fulfillment, verify Shopify order shows ONE tracking number
         ↓
Step 5: If two tracking numbers appear → investigate immediately

For mixed orders (customer ordered one DSers product + one CJ product):

This is the most complex scenario and requires partial fulfillment:


Mixed order: Product A (DSers) + Product D (CJ)
         ↓
Shopify will show the order as requiring fulfillment
         ↓
Process Product A in DSers → DSers creates partial fulfillment for Product A
         ↓
Process Product D in CJ → CJ creates partial fulfillment for Product D
         ↓
Shopify marks order as "fulfilled" once all line items have fulfillment records
         ↓
Customer receives two tracking numbers (expected — one from each supplier)

Communicate this to customers proactively:


Order confirmation email customization (in Shopify Notifications):
Add note: "Your order may ship in multiple packages from different locations.
You'll receive separate tracking numbers for each shipment."

Using Shopify Flow to Detect and Alert on Conflicts

Build an automated conflict detection system using Shopify Flow:


WORKFLOW 1: Detect double fulfillment
Trigger: Order fulfilled
Condition: Order has more than 1 fulfillment AND order has exactly 1 line item
Action: Add order tag "double-fulfillment-suspected"
Action: Send internal email with order link
Action: Add order note "ALERT: Possible double fulfillment — review immediately"

WORKFLOW 2: Detect duplicate tracking numbers
Trigger: Fulfillment created
Condition: Order already has a fulfillment with a tracking number
Action: Add order tag "duplicate-tracking-suspected"
Action: Send Slack notification (via HTTP request) or email alert

Deciding When to Use DSers vs. CJ for Each Product Type

Use this framework to assign new products to the right app from day one:


Choose DSers + AliExpress When:

  • Product is available from multiple AliExpress sellers (price competition)
  • You want maximum supplier choice and switching flexibility
  • Product has high order volume and established AliExpress reviews
  • Shipping time is less critical (customer base accepts 15-30 day shipping)
  • You're testing a new product with low initial volume
  • Product requires specific AliExpress seller relationships

Best product categories for DSers:

  • Fashion accessories, jewelry
  • Home décor items
  • Novelty and seasonal products
  • High-volume, low-margin products where AliExpress price is critical

Choose CJ Dropshipping When:

  • Faster shipping is a competitive requirement (CJ has US/EU warehouses)
  • You want print-on-demand capabilities (CJ supports POD)
  • Product quality consistency is important (CJ does QC)
  • You need branded packaging or custom labeling
  • Product has consistent demand that justifies CJ's slightly higher unit costs
  • You want to consolidate multi-product orders from one warehouse

Best product categories for CJ:

  • Custom/personalized products (POD)
  • Tech accessories where quality matters
  • Products sold to US/EU markets where speed is expected
  • Higher-margin products where CJ's quality advantage justifies cost

Products to Avoid in Both Apps Simultaneously:


❌ Never put the same product in both apps
❌ Never put product variants split across apps (Size S in DSers, Size L in CJ)
❌ Never test the same product with both apps simultaneously
❌ Never use both apps' "find similar products" features for the same category
   without checking for overlap in your mapping audit

Troubleshooting: Common Error Messages and Fixes


Error: "Order already fulfilled" in DSers or CJ


Cause: The other app fulfilled the order first
Immediate action:
1. Check Shopify order — how many fulfillments exist?
2. If 2 fulfillments: contact the second supplier IMMEDIATELY to cancel
3. Identify which product was dual-mapped
4. Remove the product from whichever app shouldn't own it
5. Issue refund to customer for any duplicate charges

Error: "Product not found" when placing order in DSers


Cause: Product was imported via CJ and isn't in DSers mapping
Immediate action:
1. Do NOT try to map it in DSers — this creates the dual-mapping conflict
2. Process the order in CJ Dropshipping instead
3. Add tag "fulfillment:cj" to the product to prevent future confusion

Error: Inventory fluctuating randomly


Cause: Both apps syncing inventory for the same product
Immediate action:
1. Identify the product in your mapping audit spreadsheet
2. Disable inventory sync in one app for that product
3. Assign the product definitively to one app
4. Manually correct the inventory count in Shopify

Error: Customer received two packages with similar items


Cause: Double fulfillment completed before you could catch it
Immediate action:
1. Apologize to customer proactively
2. Let them keep both items (do not request return of second package)
3. Request refund from the supplier who shouldn't have fulfilled
4. Document the dual-mapped product and resolve in your audit

The Single-App Alternative: Should You Consolidate?

Before committing to running both apps permanently, consider whether consolidation makes more sense:

Consolidate to CJ only if:

  • Most of your products are available on CJ
  • Shipping speed is important to your customers
  • You want simpler order management
  • Your store is growing and operational complexity is becoming a problem

Consolidate to DSers only if:

  • Your product catalog relies heavily on AliExpress-specific suppliers
  • Price is the primary competitive factor in your niche
  • CJ doesn't carry the variety you need

Keep both apps if:

  • Your catalog has a clear, natural split between AliExpress-exclusive and CJ-exclusive products
  • You have staff who can maintain the mapping discipline ongoing
  • The operational complexity is justified by access to both supplier networks

Summary: Rules for Running Both Apps Safely


RULE 1: One product, one app — never both
RULE 2: Audit your mapping before every new product addition
RULE 3: Disable auto-order in both apps until separation is confirmed clean
RULE 4: Tag every product with its fulfillment app in Shopify
RULE 5: Use Shopify Flow to alert on double-fulfillment signals
RULE 6: For mixed orders, use Shopify's partial fulfillment — don't force one app to handle both
RULE 7: Communicate multi-package shipping to customers in your order confirmation
RULE 8: Review your mapping audit spreadsheet monthly
Back to blog

Leave a comment