There is no Oberlo API to connect to — Shopify permanently shut down Oberlo in June 2022. If you are searching for how to build a dropshipping app in FlutterFlow, the working path is the Shopify Admin API (for products and orders) combined with DSers for AliExpress sourcing. This guide shows you exactly how to make that switch via a Firebase Cloud Function proxy.
| Fact | Value |
|---|---|
| Tool | Oberlo |
| Category | E-commerce |
| Method | FlutterFlow API Call |
| Difficulty | Beginner |
| Time required | 45 minutes |
| Last updated | July 2026 |
Oberlo Is Gone — Here Is the Dropshipping App Path That Works in 2026
Shopify shut down Oberlo on June 15, 2022. The Oberlo app was removed from the Shopify App Store, all accounts were deactivated, and the underlying API endpoints were taken offline. If you have found tutorials or forum posts describing Oberlo API endpoints, they describe a product that no longer exists. Any code attempting to call those endpoints will receive a connection error or a 404 response at best.
Shopify's official replacement recommendation for Oberlo users was DSers, which handles the same AliExpress product import and order automation workflow that Oberlo did. DSers is free to install from the Shopify App Store for stores on any paid Shopify plan, and it connects directly to AliExpress to let merchants map and fulfill orders. For FlutterFlow builders, DSers is a Shopify-layer tool — you install it in your Shopify admin and let it manage AliExpress sourcing behind the scenes. Your FlutterFlow app doesn't talk to DSers directly; it talks to the Shopify Admin API and reads the resulting product listings and orders that DSers has imported and fulfilled.
The Shopify Admin API (base URL https://{shop}.myshopify.com/admin/api/{version}) provides REST endpoints for products, orders, customers, and fulfillment. Access requires a custom app in Shopify with the appropriate scopes, which generates an Admin API access token. That token is equivalent to full store admin access — a very sensitive credential that must never be placed in a FlutterFlow API Call header, where it would compile into the shipped Flutter app. A Firebase Cloud Function proxy is the required architecture, and this tutorial walks you through deploying one and connecting it to FlutterFlow.
Integration method
Oberlo has no live API — attempting to call any Oberlo endpoint will fail. The migration path is two-pronged: use DSers (Shopify's official Oberlo replacement) to handle AliExpress product sourcing and order automation on the Shopify side, then build your FlutterFlow app against the Shopify Admin REST API to read products, orders, and fulfillment status. The Shopify Admin API access token is a secret credential that must be proxied through a Firebase Cloud Function; it must never appear in a FlutterFlow API Call header directly.
Prerequisites
- A Shopify store on a paid plan (Basic or higher) — the Admin API is not available on Shopify's free/trial period
- DSers installed from the Shopify App Store and connected to AliExpress (this handles the sourcing side that Oberlo used to provide)
- A Firebase project with Cloud Functions enabled on the Blaze pay-as-you-go plan (required for outbound HTTP from functions)
- A FlutterFlow project (free tier is fine for setup; a paid plan is needed for custom actions and final deployment)
Step-by-step guide
Understand the migration: Oberlo is gone, DSers + Shopify Admin API is the path forward
Before touching FlutterFlow or Firebase, it is worth spending five minutes understanding what you are actually building against. Oberlo had its own API that let third-party apps interact with the dropshipping workflow. That API no longer exists. The only legitimate way to get dropshipping data programmatically in 2026 is through Shopify's own APIs, with DSers as the sourcing layer running inside Shopify. Here is how the layers stack: DSers sits in your Shopify admin as an installed app. You use DSers (via browser at app.dsers.com or the Shopify admin) to search AliExpress, import products into Shopify, and send orders to AliExpress suppliers for fulfillment. DSers writes product and order data directly into your Shopify store's database. Your FlutterFlow app then reads that data through the Shopify Admin API — it sees the same products and orders that DSers created. FlutterFlow cannot talk to DSers directly because DSers does not expose a public third-party API. It is a Shopify-embedded tool. This is actually fine for most use cases: the data you care about (products, orders, fulfillment status, tracking numbers) all lives in Shopify's data model and is accessible via the Admin API. The Admin API also supports write operations — you can update order notes, toggle product status, and trigger fulfillment requests. If you need to automate the actual AliExpress order placement (telling suppliers to ship a product), that is currently only possible through the DSers browser interface or a Shopify Flow automation — it cannot be triggered from FlutterFlow in 2026. Keep your FlutterFlow scope focused on reading and displaying data, with write operations limited to order management tasks the Admin API supports directly.
Pro tip: If you also need to surface raw AliExpress product data (not yet imported into Shopify) in your FlutterFlow app, pair this integration with the AliExpress API integration tutorial, which uses a separate Cloud Function with HMAC signing.
Expected result: You have a clear picture of the stack: DSers (AliExpress sourcing) → Shopify (data model) → Firebase Cloud Function (secure proxy) → FlutterFlow (mobile UI). You know that no Oberlo endpoints exist and no Oberlo credentials are needed.
Create a Shopify custom app and get an Admin API access token
To call the Shopify Admin API from outside the Shopify admin (which is what your Cloud Function will do), you need a custom app installed in your Shopify store. Open your Shopify admin in a browser (yourstore.myshopify.com/admin). Click 'Settings' in the bottom-left corner, then click 'Apps and sales channels'. At the top-right click 'Develop apps', then 'Allow custom app development' if this is your first time. Then click 'Create an app', give it a name like 'FlutterFlow Dashboard', and click 'Create app'. Once the app is created, click 'Configure Admin API scopes'. For a read-only dashboard, select: read_products, read_orders, read_customers, read_inventory. If you also need to update orders (for example, adding tracking notes or changing fulfillment status), add write_orders as well. Click 'Save'. Then click 'Install app' and confirm the installation. After installation, go to the 'API credentials' tab of your custom app. You will see an 'Admin API access token' that starts with shpat_. This is shown only once — copy it immediately and store it in a password manager. This token grants access to your entire Shopify store's admin data and must be treated like a master password. Do NOT paste it into FlutterFlow. It goes into the Cloud Function environment in the next step. Note the API version shown on the page as well (for example '2024-04'). You will use this version in the Admin API base URL.
Pro tip: Grant only the API scopes your FlutterFlow app actually needs. If the dashboard is read-only, do not add write scopes. The principle of least privilege limits the damage if the token is ever compromised.
Expected result: A custom Shopify app is installed in your store with the necessary Admin API scopes. You have copied the shpat_ access token to a secure location and noted your API version.
Deploy a Firebase Cloud Function proxy for the Shopify Admin API
Open the Firebase console and navigate to your project. Click 'Functions' in the left sidebar (upgrade to Blaze plan if prompted — outbound HTTP calls require a paid plan, though costs are typically under a few dollars per month at the traffic levels of a small dropshipping app). Click 'Create function' or 'Write in inline editor'. Name the function 'shopifyProxy'. Set the runtime to Node.js 18 or later. In the 'Runtime, build and connections settings' section, expand 'Runtime environment variables' and add three entries: SHOPIFY_STORE (your myshopify.com subdomain, for example 'myshop'), SHOPIFY_TOKEN (the shpat_ token from Step 2), and SHOPIFY_API_VERSION (for example '2024-04'). Paste the proxy code shown in the code block below into the inline editor. This function accepts a 'resource' query parameter from FlutterFlow (values like 'products', 'orders', 'customers'), builds the Shopify Admin API URL, and forwards the request with the token in the X-Shopify-Access-Token header. It also handles CORS for FlutterFlow web builds. Deploy the function. Copy the trigger URL from the Firebase console once deployment completes — it will look like https://us-central1-yourproject.cloudfunctions.net/shopifyProxy.
1const functions = require('firebase-functions');2const https = require('https');34exports.shopifyProxy = functions.https.onRequest(async (req, res) => {5 // CORS for FlutterFlow web builds6 res.set('Access-Control-Allow-Origin', '*');7 if (req.method === 'OPTIONS') {8 res.set('Access-Control-Allow-Methods', 'GET, PATCH');9 res.set('Access-Control-Allow-Headers', 'Content-Type');10 return res.status(204).send('');11 }1213 const STORE = process.env.SHOPIFY_STORE;14 const TOKEN = process.env.SHOPIFY_TOKEN;15 const VERSION = process.env.SHOPIFY_API_VERSION || '2024-04';1617 // Resource is passed as a query param from FlutterFlow18 // e.g. ?resource=products&limit=20&status=any19 const resource = req.query.resource || 'products';20 const limit = req.query.limit || '50';21 const status = req.query.status || '';2223 let shopifyUrl =24 `https://${STORE}.myshopify.com/admin/api/${VERSION}/${resource}.json?limit=${limit}`;2526 if (status) {27 shopifyUrl += `&status=${status}`;28 }2930 try {31 const response = await fetch(shopifyUrl, {32 method: 'GET',33 headers: {34 'X-Shopify-Access-Token': TOKEN,35 'Content-Type': 'application/json'36 }37 });3839 if (!response.ok) {40 const errText = await response.text();41 console.error('Shopify error:', response.status, errText);42 return res.status(response.status).json({ error: errText });43 }4445 const data = await response.json();46 return res.status(200).json(data);47 } catch (err) {48 console.error('Proxy error:', err);49 return res.status(500).json({ error: 'Proxy request failed' });50 }51});Pro tip: Test the deployed function in your browser by appending ?resource=products to the trigger URL. You should see a JSON response with your Shopify products. If you see a 401, double-check that the SHOPIFY_TOKEN environment variable is set correctly in the Firebase function configuration.
Expected result: The shopifyProxy Cloud Function is deployed and accessible. Visiting the trigger URL with ?resource=products in a browser returns a JSON object containing your Shopify store's products.
Create a FlutterFlow API Group and add Products and Orders calls
With the proxy running, open your FlutterFlow project and click 'API Calls' in the left navigation panel. Click '+ Add' and choose 'Create API Group'. Name it 'ShopifyProxy'. In the 'Base URL' field, paste your Cloud Function trigger URL (everything up to and including /shopifyProxy). Leave headers empty at the group level — authentication is handled by the Cloud Function. Add your first API Call: click '+ Add API Call' inside the ShopifyProxy group. Name it 'GetProducts'. Set the method to GET. In the Variables tab, add two variables: 'limit' (String, test value '20') and 'status' (String, test value 'active'). In the URL suffix field add: ?resource=products&limit={{limit}}&status={{status}}. Click 'Response & Test', fill in the test variables, and run the test. You should see a JSON object with a top-level key 'products' containing an array. Click 'Generate JSON Paths from Response'. The key paths to extract are: - $.products[*].id - $.products[*].title - $.products[*].status - $.products[*].images[0].src - $.products[*].variants[0].inventory_quantity - $.products[*].variants[0].price Repeat the process to add a second API Call named 'GetOrders'. Variables: 'limit' (String), 'status' (String, test value 'open'). URL suffix: ?resource=orders&limit={{limit}}&status={{status}}. Key JSON Paths: - $.orders[*].id - $.orders[*].name - $.orders[*].financial_status - $.orders[*].fulfillment_status - $.orders[*].total_price - $.orders[*].customer.first_name - $.orders[*].customer.last_name Save both API Calls.
Pro tip: Shopify's Admin REST API is rate-limited at 2 requests per second per store (leaky bucket algorithm). If your FlutterFlow app loads both products and orders on the same screen simultaneously, add a small sequential delay between the two calls or switch to the GraphQL Admin API which uses a cost-based quota system instead.
Expected result: Two API Calls exist in the ShopifyProxy group: GetProducts and GetOrders. Both test successfully and return paginated JSON from your Shopify store. JSON Paths are generated for the main fields needed in the dashboard UI.
Build the dropshipping dashboard UI and bind the API data
Create the main dashboard screen in FlutterFlow. Add a TabBar widget at the top with two tabs: 'Products' and 'Orders'. This gives users a clean way to switch between the two data sources without rebuilding the whole screen. In the Products tab, add a ListView widget. Set its data source to Backend Query → API Call → ShopifyProxy GetProducts. Pass 'active' as the status variable and '50' as the limit. Inside the ListView, drop a Card widget with: an Image widget bound to the $.products[*].images[0].src JSON Path, a Text widget for the title, a Text widget for the price, a Badge or Chip widget showing the status (active/draft), and a Text widget showing inventory_quantity with a label 'In Stock'. In the Orders tab, add another ListView with data source ShopifyProxy GetOrders. Pass 'any' as the status variable. Inside this ListView, use a Card with: a Text for the order name (e.g. '#1042'), a Text for the customer name (concatenate first_name and last_name), a Text for total_price, and a Chip showing fulfillment_status with conditional color (green for 'fulfilled', orange for 'partial', red for null/unfulfilled). For the Products tab, add a filter row above the ListView with three buttons: 'Active', 'Draft', 'All'. Wire each button to update an AppState variable 'productFilter' (String) and rebuild the ListView with the new status value. This lets the store owner quickly switch between viewing active and draft products without navigating to a new screen. To navigate to an order detail page, make each Order card tappable. On tap, navigate to a new 'OrderDetail' screen and pass the order ID as a page parameter. On that screen, call GetOrders with a specific order ID filter, or store the selected order object in AppState for display without an additional API call.
Pro tip: Create FlutterFlow Data Types for ShopifyProduct and ShopifyOrder before building the UI. Having typed data structures makes it much easier to bind fields and set up conditional logic like color-coding fulfillment status without repeatedly re-entering JSON path expressions.
Expected result: The dashboard shows a Products tab with a scrollable list of Shopify products (images, titles, prices, stock levels) and an Orders tab with a list of orders showing customer names, totals, and fulfillment status with color-coded chips. Filter buttons on the Products tab update the displayed product set.
Common use cases
Mobile dropshipping order dashboard
A Flutter app that shows a store owner all their current Shopify orders, with fulfillment status, tracking numbers, and the ability to filter by open, fulfilled, and cancelled. The orders come from the Shopify Admin API, which reflects the DSers-fulfilled order data.
Build a FlutterFlow screen that lists Shopify orders from my proxy Cloud Function. Each order card shows order number, customer name, total price, fulfillment status, and a tracking number if available. Add a filter row at the top to switch between All, Open, and Fulfilled orders.
Copy this prompt to try it in FlutterFlow
Product catalog browser with inventory levels
A store management app that lets the owner browse all imported products (originally sourced via DSers from AliExpress), see stock levels, update product descriptions, and toggle product visibility without opening the Shopify admin in a browser.
Create a FlutterFlow screen with a searchable product list. Each product card shows the Shopify product image, title, variants count, inventory quantity, and status (Active or Draft). Allow the owner to tap a product to see full details and toggle its Active/Draft status via a PATCH call through my proxy function.
Copy this prompt to try it in FlutterFlow
Customer and order lookup for fulfillment team
A lightweight app for a fulfillment team that looks up customer orders by name or order number, sees the shipping address and line items, and marks orders as ready for dispatch. All data is read from the Shopify Admin API via the proxy function.
Build a FlutterFlow screen with a search TextField. When the user types a customer name or order number and taps Search, call my Shopify proxy function with a search query, display the matching orders, and show each line item with the product title, quantity, and AliExpress supplier reference stored as an order tag.
Copy this prompt to try it in FlutterFlow
Troubleshooting
The API call returns a 401 Unauthorized or 'Invalid API key or access token' error
Cause: The Shopify Admin API access token stored in the Cloud Function environment variable is incorrect, has been revoked, or the custom app does not have the required API scopes for the requested resource.
Solution: In the Firebase console, go to Functions → shopifyProxy → 'Edit function' → Runtime environment variables. Verify that SHOPIFY_TOKEN starts with 'shpat_' and matches the token shown in Shopify Admin → Settings → Apps → your custom app → API credentials. Also verify that the custom app has the read_products and read_orders scopes installed. If you changed scopes after installing the app, you must reinstall it for the new scopes to take effect.
FlutterFlow API Call test shows 'XMLHttpRequest error' or 'CORS error'
Cause: The Firebase Cloud Function is missing the Access-Control-Allow-Origin header on its responses, or is not handling the OPTIONS preflight request. This affects FlutterFlow's web-based builder and web builds, though not native iOS/Android builds.
Solution: Verify that your Cloud Function includes the CORS setup shown in the index.js code block: res.set('Access-Control-Allow-Origin', '*') on every response path including the error paths, and a specific handler that returns 204 for OPTIONS requests. Redeploy the function after adding CORS headers.
1res.set('Access-Control-Allow-Origin', '*');2if (req.method === 'OPTIONS') {3 res.set('Access-Control-Allow-Methods', 'GET, PATCH');4 res.set('Access-Control-Allow-Headers', 'Content-Type');5 return res.status(204).send('');6}The ListView shows empty results even though the API test in FlutterFlow returns data
Cause: The JSON Path expressions are not matching the actual response structure, or the Data Type field bindings were set up before the API Call was fully saved and need to be refreshed.
Solution: Open the API Call's Response tab and click 'Generate JSON Paths from Response' again using the actual test response. Verify each path starts with $.products[*] for products or $.orders[*] for orders. Then open your ListView widget, remove the Backend Query binding, and re-add it by selecting the API Call. This forces FlutterFlow to refresh the field mapping options.
Requests work at first then return 429 Too Many Requests after a few minutes
Cause: Shopify's REST Admin API enforces a leaky bucket rate limit of 2 requests per second per store. Multiple simultaneous FlutterFlow API calls (for example, loading Products and Orders at the same time, or rapid tab switching) can exhaust the bucket.
Solution: Avoid loading multiple API resources simultaneously in the same screen's initialization. Stagger calls: load products first, wait for the response, then load orders. For the Orders and Products tabs, trigger the API call only when the tab becomes active, not on initial screen load. For higher-traffic scenarios, switch from the REST Admin API to the GraphQL Admin API, which uses a point-based quota system that's more flexible for burst reads.
Best practices
- State the Oberlo discontinuation clearly in any app onboarding or documentation — users searching for 'Oberlo FlutterFlow' need to know they must use the Shopify Admin API path before spending time looking for Oberlo credentials
- Never place the Shopify Admin API access token (shpat_) in a FlutterFlow API Call header — it grants full store admin access and compiles into the app binary where it can be extracted
- Grant only the minimum Shopify API scopes your app needs; a read-only dashboard needs read_products and read_orders, not write access
- Use DSers for the AliExpress sourcing layer (finding products, placing supplier orders) and keep FlutterFlow focused on the Shopify data layer (reading fulfilled products and orders)
- Implement tab-based lazy loading — fetch Products data only when the Products tab is active, and Orders data only when the Orders tab is active, to avoid hitting the 2 req/s Shopify rate limit on screen load
- Cache the product list in AppState after the first fetch and only refresh when the user explicitly pulls down to refresh, reducing API calls during normal browsing
- Log all proxy function invocations to Firestore with a timestamp so you can audit API usage and catch any unauthorized access to your function URL
- If your store grows beyond a few hundred orders, add cursor-based pagination using Shopify's page_info cursor rather than offset pagination, as Shopify deprecated offset pagination for large datasets
Alternatives
Spocket is a live, active dropshipping platform with a working REST API — unlike Oberlo, you can actually integrate it with FlutterFlow via a Bearer token proxy and browse a curated supplier catalog directly.
The AliExpress Open Platform API lets you search the full AliExpress product catalog directly (rather than through Shopify) using HMAC-signed requests proxied through a Cloud Function — ideal if you want a standalone dropshipping browser without Shopify.
WooCommerce is a WordPress-based alternative to Shopify that also has an Admin API FlutterFlow can connect to via a proxy, with no Oberlo dependency and a large ecosystem of dropshipping plugins including AliDropship.
Frequently asked questions
Is there any way to use Oberlo with FlutterFlow in 2026?
No. Oberlo was permanently shut down by Shopify on June 15, 2022. All Oberlo accounts were deactivated, the app was removed from the Shopify App Store, and its API endpoints were taken offline. There is no active Oberlo API to connect to. Any tutorial describing Oberlo API calls is outdated and will not work.
What replaced Oberlo for AliExpress dropshipping on Shopify?
Shopify's official recommendation was DSers, which installs from the Shopify App Store and replicates Oberlo's core workflows: searching AliExpress products, importing them into Shopify, mapping variants, and automating order placement with AliExpress suppliers. DSers offers a free tier that handles up to a few hundred orders per month, which is sufficient for most small dropshipping operations.
Does FlutterFlow have any built-in connection to Shopify that makes this easier?
FlutterFlow does not have a native Shopify connector in its integration settings. The Shopify Admin API connection must be built using FlutterFlow's API Calls panel, pointing at a Firebase Cloud Function proxy that holds your Admin API access token. This tutorial covers the exact steps. Once set up, the experience in FlutterFlow is the same as any other API Call — you bind JSON Path values to widgets just like any other data source.
Can I display AliExpress products directly in my FlutterFlow app alongside Shopify orders?
Yes, but they use separate integrations. For Shopify products (already imported via DSers), use this guide's Shopify Admin API proxy to display them in FlutterFlow. For raw AliExpress product search (products not yet in your Shopify store), follow the AliExpress API integration tutorial, which uses a separate Cloud Function with HMAC request signing. Both functions can run in the same Firebase project, and FlutterFlow can call both API Groups from different screens.
What Shopify plan do I need to use the Admin API from FlutterFlow?
The Shopify Admin API for custom apps requires a paid Shopify plan — Basic or higher. The trial period and Shopify Starter plan do not support custom app development. Once on a paid plan, creating a custom app and generating an Admin API access token is free and included in all paid tiers.
If my FlutterFlow app needs to trigger order fulfillment with AliExpress suppliers, can it do that via the Shopify API?
Not directly. The actual AliExpress order placement (telling a supplier to ship an item) is handled by DSers within Shopify, either through the DSers browser interface or Shopify Flow automations. The Shopify Admin API lets your FlutterFlow app read order status and update notes or tags, but you cannot trigger a DSers AliExpress order from FlutterFlow. If this workflow is critical, consider using Shopify Flow to auto-trigger DSers order placement when orders are marked as paid, rather than building the trigger into FlutterFlow.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation