Is AliDropship 2.0 safe?
AliDropship 2.0 sends AliExpress product data and order details to its own servers and a third-party GraphQL endpoint.
When you visit AliExpress product or category pages, the extension collects product IDs, prices, and store URLs and POSTs them to tools.alidropship.com. When orders are placed or tracked, full order details including payment dates, tracking IDs, and product objects are transmitted via GraphQL mutations to node3.ssdma.com. A content script running on all pages also accepts order automation commands over window.postMessage without validating the message origin.
Who publishes itSunshine Ecommerce LLC - no other listings under this identity, 1 shared hostname
Sunshine Ecommerce LLC - no other listings under this identity, 1 shared hostname
What this publisher told the store about itself, and the other listings that told it the same thing.
Shared hosts - 1 hostname
Hostnames hardcoded in this extension that few other listings call. That can mean one operator behind both, and it can equally mean a small shared vendor, so it is context rather than a conclusion. Hosts that many listings call are left out: they are services, not connections.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
AliExpress order details sent to external GraphQL endpoint
AliDropship 2.0 posts order/tracking records for AliExpress orders to node3.ssdma.com/graphql: payment/shipping dates, tracking numbers, order/product IDs, order status, and tracking status.
A test without a store captured no body.
What actually happens
You process AliExpress orders or view an AliExpress order-detail page through AliDropship 2.0.
The trigger path is tied to order workflows; a test session without a connected store did not reach it.
The extension prepares order and tracking details for an external GraphQL request.
The destination configured in the background code is https://node3.ssdma.com/graphql.
Order fields prepared for the GraphQL mutations
- Payment date2026-07-12 14:38:05 (illustrative)
Shows when your AliExpress order was paid.
- Shipping date2026-07-13 09:22:41 (illustrative)
Shows when the order was shipped or prepared for shipment.
- Tracking numberLP123456789CN (illustrative)
Can tie the shipment record to a specific package and delivery route.
- AliExpress order ID8123456789012345 (illustrative)
Links the record to a specific AliExpress purchase processed through the extension.
- Product ID1005006123456789 (illustrative)
Identifies the product associated with the order record.
- Order and tracking statuscompleted / DELIVERED (illustrative)
Shows whether the order completed and the current shipping state recorded by AliExpress.
Captured request
The unauthenticated dynamic test did not trigger the order workflow, so no request body or response was captured.
The code that does this
Endpoint, field mapping, and mutation calls in the shipped extension
GraphQL endpoint and Apollo client
deobfuscated/js/background.js:30020,30125-30135jn = "https://node3.ssdma.com/graphql";var Un = r(20689).createApolloFetch, Wn = r(5895).createUploadLink;var Bn = new hr({ ssrMode: "undefined" != typeof window, cache: new En, fetchOptions: { credentials: "include" }, link: Wn({ uri: jn })})Order detail mapper
deobfuscated/js/background.js:30336-30362function l(e) { if (!e.statusOrder) return ""; var t = e.statusOrder; if (t.endReason) return t.id && "FINISH" === t.orderStatus ? "completed" : ""; return ["buyer_accept_goods_timeout", "buyer_accept_goods"][e.statusOrder.endReason] ? "completed" : ""}function d(e) { return e.map((function(e) { var t = !!(e.trackDetals && Object.keys(e.trackDetals).length > 0 && e.trackDetals.lightList) && e.trackDetals.lightList.find((function(e) { return e.current })); return { payDate: e.payDate, shipDate: e.shipDate, tracking_id: e.trackingNo, products: e.products.map((function(e) { return { order_id_ali: e.orderId, productId: e.productId } })), status: l(e), trackingStatus: t ? t.code : "" } }))}GraphQL mutations
deobfuscated/js/background.js:30465-30491if (console.log("sendApp"), console.log(e, t), console.log(t.action, t), "setOrdersTIP" === t.action) return r = t.ordersDetail, i = d(r), Bn.mutate({ mutation: (0, Pn.ZP)(Yn || (Yn = An(["\n mutation setOrdersTIP ($ordersDetail : [ordersDetailInput!]!) {\n setOrdersTIP(ordersDetail : $ordersDetail)\n }\n "]))), variables: { ordersDetail: i }}).then((function(e) { return e.data.setOrdersTIP})).catch((function(e) { return console.error(e)}));var r, i, o, l, m, p, _, y;if ("setOrdersIdAli" === t.action) return function(e, t) { var r = d(e); return t = t.map((function(e) { return delete e.success, e })), Bn.mutate({ mutation: (0, Pn.ZP)(Sn || (Sn = An(["\n mutation setOrdersIdAli ($products: [productsAutofillingOrderInput!], $ordersDetail : [ordersDetailInput!]!) {\n setOrdersIdAli(products: $products, ordersDetail : $ordersDetail)\n }\n "]))), variables: { products: qn(t), ordersDetail: r } }).then((function(e) { return e.data.UpdateProductTask })).catch((function(e) { return console.error(e) }))}(t.ordersDetail, t.products);Order-detail page trigger
deobfuscated/js/background.js:32021-32063function n(e) { _.isAuth(!0).then((function() { s(mi.getLastTabID(), !1, "getOrdersDetail", e).then((function(e) { mi.sendAllStore("setOrdersTIP", { ordersDetail: e }) })) }))}function i(e) { _.isAuth(!0).then((function() { console.log(e); var t = e.orderIdAli, r = e.orderIdStore, n = [t]; s(mi.getLastTabID(), !1, "getOrdersDetail", n).then((function(e) { var t = []; e.length > 0 && (t = e[0]), mi.sendAllStore("setOrderTIP", { orderDetail: t, orderIdStore: r }) })) }))}return { init: function() { e || (e = this, o.on("adsGoogleExtension:getTIPOrders", n), o.on("adsGoogleExtension:getTIPOrder", i), m("page_order_detail:open", (function(e, t) { s(t.tab.id, !1, "getOrdersDetail", e.orderList).then((function(e) { mi.sendAllStore("setOrdersTIP", { ordersDetail: e.filter(Boolean) }) })) }))) }, getOrdersDetail: function(e) { return function(e) { var t = []; return Array.isArray(e) && e.length > 0 ? t = e : "object" === Yi(e) ? t = Object.keys(e).map((function(t) { return e[t] })) : t.push(e), t = u(t), Promise.all(t.map(r)) }(e) }}External service receiving the order mutation
- node3.ssdma.com
Receives Apollo GraphQL requests for AliDropship order and product workflows, including setOrdersTIP and setOrdersIdAli variables.
What it can do
Permissions this extension asks for, as declared in version 3.0.0.95. Asking for a permission is not a finding on its own - it is what the extension can do if it chooses to.
Read and change your data on every site you visit
<all_urls>
See the address and title of every tab you have open
tabs
Store data in your browser
storage
Show you desktop notifications
notifications
Block and redirect the requests your browser makes
declarativeNetRequest
See which of your requests its blocking rules matched
declarativeNetRequestFeedback
Where it sends data
Destinations our analysis observed AliDropship contacting. Sending data somewhere is not a finding on its own - an extension that syncs your settings has to talk to its own server - but it is where your data can go, and who else it goes to.
- node3.ssdma.com
AliDropship sends data to node3.ssdma.com. No other extension we have analyzed sends data here.
- tools.alidropship.com
AliDropship sends data to tools.alidropship.com. No other extension we have analyzed sends data here.