Intermediate~15 min setupCRM & E-commerceVerified April 2026
HubSpot logo
Shopify logo

How to Create HubSpot Deals from Shopify Orders with Power Automate

Automatically creates a HubSpot deal every time a customer completes a purchase in Shopify, mapping order value, product details, and customer data so sales teams can track revenue and follow up on high-value orders.

Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.

Best for

E-commerce teams already using Microsoft 365 who want sales reps to see and act on every Shopify order inside HubSpot without manual entry.

Not ideal for

Stores processing 1,000+ orders per day where per-run Power Automate costs add up — Make handles that volume cheaper.

Sync type

real-time

Use case type

import

Real-World Example

💡

A 12-person DTC brand sells skincare products on Shopify and tracks upsell conversations in HubSpot. Before this flow, account managers exported orders weekly from Shopify and created deals by hand — a process that took 2–3 hours every Friday and meant high-value customers waited days before anyone followed up. With this flow, a deal appears in HubSpot within 90 seconds of checkout, tagged with order value, so reps immediately see which customers crossed the $300 threshold they target for upsell outreach.

What Will This Cost?

Drag the slider to your expected monthly volume.

/mo
505005K50K

Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.

Prices shown for annual billing. Based on published pricing as of April 2026.

Estimated ROI

1000

min saved/mo

$583

labor value/mo

Free

no platform cost

Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.

Implementation

Skip the setup

Import this workflow directly into Power Automate

Copy the pre-built Power Automate blueprint and paste it straight into Power Automate. All modules, filters, and field mappings are already configured — you just need to connect your accounts.

Before You Start

Make sure you have everything ready.

Shopify private app with 'read_orders' and 'read_customers' API scopes enabled under Admin API access
HubSpot account with a CRM Connections token — your Power Automate HubSpot connector needs 'crm.objects.deals.write', 'crm.objects.contacts.write', and 'crm.objects.contacts.read' scopes
Power Automate account with a plan that includes premium connectors — both Shopify and HubSpot CRM connectors are premium and require at minimum a Power Automate Per User plan ($15/user/month)
Your HubSpot deal pipeline stage IDs — retrieve these from HubSpot Settings > CRM > Deals > Pipelines before building, as the Power Automate connector requires IDs not display names
A Shopify store on Basic plan or higher with checkout enabled and at least one payment gateway configured for test orders

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Deal Namedealname
Deal Amountamount
Deal Stagedealstage
Close Dateclosedate
Pipelinepipeline
Customer Emailemail
4 optional fields▸ show
Shopify Order ID (custom property)shopify_order_id
Customer First Namefirstname
Customer Last Namelastname
Order Source / Deal Typedeal_type

Step-by-Step Setup

1

make.powerautomate.com > My flows > + New flow > Automated cloud flow

Create a new Automated cloud flow in Power Automate

Go to make.powerautomate.com and sign in. In the left sidebar, click 'My flows', then click '+ New flow' at the top of the page. Select 'Automated cloud flow' from the dropdown — this is the option that fires on an external event, which is what you need for a Shopify order trigger. Give the flow a name like 'Shopify Order → HubSpot Deal' so it's easy to find later.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click '+ New flow' at the top right
  3. 3Select 'Automated cloud flow'
  4. 4Type a name in the 'Flow name' field (e.g. 'Shopify Order → HubSpot Deal')
  5. 5Click 'Skip' on the trigger picker — you'll set it in the next step
What you should see: You should see the flow canvas open with an empty 'Add a trigger' block at the top.
Common mistake — Do not choose 'Instant cloud flow' or 'Scheduled cloud flow'. Instant requires manual activation; Scheduled uses polling and introduces delay. Automated cloud flow is the only option that reacts to a Shopify webhook in real time.
2

Flow canvas > Add a trigger > Search 'Shopify' > When an order is created

Add the Shopify 'When an order is created' trigger

Click the empty trigger block on the canvas. A search panel opens on the right. Type 'Shopify' in the search bar and select the Shopify connector from the results. You'll see a list of triggers — choose 'When an order is created'. Power Automate will immediately ask you to authenticate your Shopify store if you haven't connected it before.

  1. 1Click the 'Add a trigger' block on the canvas
  2. 2Type 'Shopify' in the connector search bar
  3. 3Click the Shopify connector icon
  4. 4Select 'When an order is created' from the trigger list
What you should see: The trigger block should show 'Shopify — When an order is created' with a connection prompt beneath it.
Common mistake — The Shopify connector in Power Automate requires a Shopify Partner account or a private app API key — it does not use OAuth login via your Shopify admin email. Have your API key and password from Shopify Admin > Apps > Develop apps ready before this step.
Power Automate
+
click +
search apps
HubSpot
HU
HubSpot
Add the Shopify 'When an ord…
HubSpot
HU
module added
3

Trigger block > Sign in > Shopify connection dialog

Connect your Shopify store

Click 'Sign in' inside the trigger block. A dialog box appears asking for your Shopify store URL, API key, and API password. Enter your store URL in the format 'yourstore.myshopify.com' — no 'https://' prefix. Paste in the API key and password from the private app you created in Shopify Admin. Click 'Create' and Power Automate will validate the connection.

  1. 1Click 'Sign in' in the trigger block
  2. 2Enter your store URL as 'yourstore.myshopify.com'
  3. 3Paste the API key into the 'API Key' field
  4. 4Paste the API password into the 'Password' field
  5. 5Click 'Create'
What you should see: The trigger block should now show your store name in a dropdown labeled 'Site' with no error banner.
Common mistake — If you see 'Connection failed — 401 Unauthorized', your private app is missing the 'Orders' read permission. Go back to Shopify Admin > Apps > Develop apps > your app > Configuration, and enable 'read_orders' under Admin API access scopes.
4

Flow canvas > + New step > Control > Condition

Add a Condition to filter by order status

Not every order event you want to create a deal for — Shopify fires this trigger on draft orders and test orders too. Click '+ New step' below the trigger, search for 'Condition', and add the built-in Control action. Set the left value to the dynamic content field 'Financial Status' from the Shopify trigger, set the operator to 'is equal to', and type 'paid' in the right field. This ensures deals only get created for completed, paid orders.

  1. 1Click '+ New step'
  2. 2Search for 'Condition' in the action picker
  3. 3Select 'Condition' under the Control connector
  4. 4Click the left value box and choose 'Financial Status' from the dynamic content panel
  5. 5Set operator to 'is equal to' and type 'paid' in the right box
What you should see: You should see a Condition block with two branches: 'If yes' and 'If no'. All subsequent HubSpot steps go inside the 'If yes' branch.
Common mistake — Filters are the most common place setups break. Double-check the field name and value exactly match what your app sends — a single capital letter difference will block everything.
HubSpot
HU
trigger
filter
Status
matches criteria?
yes — passes through
no — skipped
Shopify
SH
notified
5

Condition > If yes > Add an action > HubSpot CRM > Search for contacts

Check if a HubSpot contact already exists for this customer

Inside the 'If yes' branch, click 'Add an action'. Search for 'HubSpot' and choose the HubSpot CRM connector. Select the action 'Search for contacts'. Set the search field to 'email' and map the value to the dynamic content field 'Email' from the Shopify trigger (found under the customer object). This lookup prevents you from creating orphan deals with no contact association.

  1. 1Click 'Add an action' inside the 'If yes' branch
  2. 2Search 'HubSpot' in the action picker
  3. 3Select 'HubSpot CRM' connector
  4. 4Choose 'Search for contacts'
  5. 5Set filter field to 'email' and map the Shopify 'Email' dynamic field as the value
What you should see: The action block shows a 'Results' output you can reference in later steps — even if it returns empty, the flow continues.
Common mistake — HubSpot's search action returns an array. If zero contacts match, the array is empty — not null. Use a Condition or 'length()' expression in the next step to check before accessing index [0]. Trying to read a property from an empty array will crash the flow.
6

If yes branch > Add an action > Control > Condition > If yes > HubSpot CRM > Create a contact

Create a HubSpot contact if none was found

Add another Condition step inside the 'If yes' branch, after the search. Use the Power Automate expression 'empty(outputs('Search_for_contacts')?['body/results'])' as the left value, set operator to 'is equal to', and type 'true'. Inside the nested 'If yes' branch, add the HubSpot CRM action 'Create a contact'. Map Shopify dynamic fields: Email to 'email', First Name to 'firstname', Last Name to 'lastname', and Phone to 'phone'.

  1. 1Add a 'Condition' action after the search step
  2. 2In the left value box, click 'Expression' tab and type: empty(outputs('Search_for_contacts')?['body/results'])
  3. 3Set operator to 'is equal to true'
  4. 4Inside nested 'If yes', add 'HubSpot CRM > Create a contact'
  5. 5Map Email, First Name, Last Name, and Phone from Shopify dynamic content
What you should see: When a new customer places an order, a contact will be created in HubSpot before the deal step runs. Returning customers skip this step.
7

Flow canvas > + New step > Variables > Initialize variable

Resolve the contact ID for deal association

After the create/search branch, you need a single contact ID to associate with the deal. Add a 'Initialize variable' action (search 'Variable' in the action picker) named 'ContactID' of type String. Set its value using an expression that checks if the contact was just created or already existed: if(empty(outputs('Search_for_contacts')?['body/results']), outputs('Create_a_contact')?['body/id'], first(outputs('Search_for_contacts')?['body/results'])?['id']). This collapses both code paths into one variable.

  1. 1Click '+ New step' after the nested condition
  2. 2Search 'Initialize variable' in the action picker
  3. 3Set Name to 'ContactID', Type to 'String'
  4. 4Click the Value field, open the 'Expression' tab
  5. 5Paste the if() expression resolving to the correct contact ID
What you should see: The variable block shows 'ContactID' with your expression visible in the Value field. You can verify it by saving and running a test — the run history will show the resolved ID.
Common mistake — HubSpot contact IDs are integers in the API response but Power Automate may type them as numbers. If you get a type mismatch error when associating the deal later, wrap the expression in string(): string(first(outputs('Search_for_contacts')?['body/results'])?['id']).

Paste this expression into the 'Value' field of an 'Initialize variable' or 'Compose' action in Power Automate, right after your 'Create a deal' step. It builds a single formatted object you can use for logging or sending to a Teams/Slack notification — and handles the float conversion for Amount that trips up most people.

JavaScript — Code Step// Power Automate - Compose action expressions for Shopify → HubSpot Deal
▸ Show code
// Power Automate - Compose action expressions for Shopify → HubSpot Deal
// Use these in Expression mode (not Dynamic content) in your Compose or variable steps
// 1. Convert Shopify total_price string to float for HubSpot amount field

... expand to see full code

// Power Automate - Compose action expressions for Shopify → HubSpot Deal
// Use these in Expression mode (not Dynamic content) in your Compose or variable steps

// 1. Convert Shopify total_price string to float for HubSpot amount field
float(triggerOutputs()?['body/total_price'])

// 2. Build deal name from order number
concat('Shopify Order #', string(triggerOutputs()?['body/order_number']))

// 3. Format order date to HubSpot-compatible yyyy-MM-dd
formatDateTime(triggerOutputs()?['body/created_at'], 'yyyy-MM-dd')

// 4. Resolve contact ID — checks search results first, falls back to newly created contact
if(
  empty(outputs('Search_for_contacts')?['body/results']),
  string(outputs('Create_a_contact')?['body/id']),
  string(first(outputs('Search_for_contacts')?['body/results'])?['id'])
)

// 5. Build a summary payload for logging (use in a Compose step for run history debugging)
json(concat('{"order":"', string(triggerOutputs()?['body/order_number']), '","amount":', string(float(triggerOutputs()?['body/total_price'])), ',"customer":"', triggerOutputs()?['body/customer/email'], '"}'))
8

Flow canvas > + New step > HubSpot CRM > Create a deal

Create the HubSpot deal

Add the HubSpot CRM action 'Create a deal'. This is the core step. Map Deal Name to a composed string like 'Shopify Order #' plus the Shopify 'Order Number' dynamic field. Map Amount to 'Total Price' from Shopify. Set Deal Stage to your pipeline's first stage ID (find this in HubSpot > Settings > CRM > Deals > Pipelines). Set Close Date to today using the expression 'formatDateTime(utcNow(), 'yyyy-MM-dd')'.

  1. 1Click '+ New step' and search 'HubSpot CRM'
  2. 2Select 'Create a deal'
  3. 3Set Deal Name to 'Shopify Order #' + Shopify 'Order Number' dynamic field
  4. 4Set Amount to Shopify 'Total Price'
  5. 5Set Close Date using Expression: formatDateTime(utcNow(), 'yyyy-MM-dd')
What you should see: The action block shows all mapped fields. The Deal Name preview should look like 'Shopify Order #1042'.
Common mistake — HubSpot's 'Create a deal' action in Power Automate requires the Deal Stage field to be a stage ID string (e.g. '1173891'), not a display name like 'Appointment Scheduled'. Go to HubSpot > Settings > CRM > Deals > Pipelines, click your pipeline, and hover over the stage name to see the ID in the URL.
9

Flow canvas > + New step > HubSpot CRM > Create an association

Associate the deal with the contact

HubSpot's 'Create a deal' action does not automatically link the deal to a contact — that requires a separate association call. Add the HubSpot CRM action 'Create an association'. Set Object Type 1 to 'deals', Object ID 1 to the deal ID from the previous step's output (outputs('Create_a_deal')?['body/id']), Object Type 2 to 'contacts', and Object ID 2 to your 'ContactID' variable. Set Association Category to 'HUBSPOT_DEFINED' and Association Type ID to '3' (deal-to-contact).

  1. 1Click '+ New step' after 'Create a deal'
  2. 2Search 'HubSpot CRM' and select 'Create an association'
  3. 3Set Object Type 1 to 'deals'
  4. 4Set Object ID 1 using Expression: outputs('Create_a_deal')?['body/id']
  5. 5Set Object Type 2 to 'contacts', Object ID 2 to the 'ContactID' variable, Association Type ID to '3'
What you should see: After a test run, open the deal in HubSpot — you should see the customer listed under 'Contacts' in the right panel with no manual linking needed.
Common mistake — Association Type ID '3' is the standard HubSpot deal-to-contact association. If your HubSpot portal uses custom association labels, the ID will differ. Check HubSpot's CRM API reference or use a GET request to /crm/v4/associations/deals/contacts/labels to find your portal-specific ID.
10

Flow canvas > Test (top right) > Manually > Trigger flow

Test the flow end-to-end

Save the flow by clicking the disk icon at the top. Then click 'Test' in the top right, select 'Manually', and click 'Test' again. Power Automate will wait for a real trigger. Go to your Shopify store and place a test order using a real email address (use Shopify's Bogus Gateway for payment). Return to Power Automate — within 60–90 seconds you should see the run appear in the test panel with green checkmarks on each step.

  1. 1Click 'Save' (disk icon) in the top right
  2. 2Click 'Test' and select 'Manually'
  3. 3Click 'Test' again to put the flow in listening mode
  4. 4Place a test order in Shopify using Bogus Gateway
  5. 5Watch the Power Automate test panel for step-by-step results
What you should see: All steps show green checkmarks. In HubSpot, a new deal appears with the correct order amount, deal name, and the customer contact linked to it.
Common mistake — If you've placed test orders before, Shopify may mark them 'pending' instead of 'paid' depending on your gateway settings. Your Condition filter in Step 4 will route these to the 'If no' branch and skip deal creation — which is correct behavior, but can make it look like the flow isn't working. Use a real credit card with Bogus Gateway (enter '1' as the card number) to generate a 'paid' status order.
Power Automate
▶ Test flow
executed
HubSpot
Shopify
Shopify
🔔 notification
received
11

My flows > [your flow name] > 28 day run history

Turn the flow on and monitor run history

Click the back arrow to exit the canvas and return to 'My flows'. Find your flow and confirm the toggle shows 'On'. For the first 48 hours, check the flow's run history daily — click the flow name, then '28 day run history' to see each execution. Look for any failed runs and click into them to see which step failed and the exact error message. Power Automate keeps 28 days of run history by default.

  1. 1Click the back arrow from the canvas
  2. 2Find your flow in 'My flows' and confirm the status toggle is 'On'
  3. 3Click the flow name to open its detail page
  4. 4Click '28 day run history' to view executions
  5. 5Click any failed run to expand the step-by-step error details
What you should see: Each Shopify order you receive should appear as a new row in the run history within 90 seconds of the order being placed, with a 'Succeeded' status.

Going live

Production Checklist

Before you turn this on for real, confirm each item.

Troubleshooting

Common errors and how to fix them.

Frequently Asked Questions

Common questions about this workflow.

Analysis

VerdictWhy n8n for this workflow

Use Power Automate for this if your company is already paying for Microsoft 365 E3 or E5 — the Power Automate Per User plan may already be included in your license, making this effectively free to run. It's also the right call if your sales team uses Microsoft Teams heavily and you want to chain this workflow into a Teams notification or a SharePoint log in the same ecosystem without stitching together external tools. The one scenario where you'd pick something else immediately: if your Shopify store does more than 3,000 orders per month and you're paying $15/user just for the Power Automate connector access, Make will do the same job for $9/month flat with no per-connector tax.

Cost

The cost math is straightforward. Power Automate's Per User plan is $15/user/month. The Shopify and HubSpot CRM connectors are both premium, so you need at least that tier — there's no way around it. Each order run consumes roughly 5–6 actions (trigger, condition, search contact, create contact or skip, create deal, create association). At 500 orders/month, that's ~3,000 actions/month, well within limits. At 2,000 orders/month, you're at ~12,000 actions — still fine on Per User, but you're paying $15/month for the plan regardless of whether you have 1 user or 10 (it's per seat). Make's equivalent setup costs $9/month for up to 10,000 operations total, making it ~40% cheaper at moderate volume. Power Automate's cost advantage only appears if you're already paying for Microsoft 365 Business Premium, where the plan is bundled.

Tradeoffs

Zapier has a dedicated Shopify 'New Order' trigger that fires in under 60 seconds and requires zero expression writing — deal creation is a 5-step Zap with no code. The downside: at 2,000 orders/month you're looking at $73/month on the Professional plan. Make handles the same logic with a Shopify watch webhook module and is faster to build if you're comfortable with its scenario editor, though the conditional branching for contact lookup takes more modules than it should. n8n gives you the most control — you can write JavaScript inline to handle line items, custom properties, and deduplication in a single Function node — but you need a self-hosted instance or n8n Cloud ($20+/month), and the Shopify credential setup requires a webhook URL you configure manually. Pipedream is the fastest to prototype, with a pre-built Shopify source and HubSpot actions, and it's free up to 10,000 invocations/month — the best option if you want to test before committing. Power Automate is right here specifically when Microsoft ecosystem integration matters: if you want this deal creation to also post to Teams, log to SharePoint, or trigger a Power BI refresh, you stay in one platform.

Three things you'll run into after the flow goes live. First, Shopify occasionally sends duplicate webhook events for the same order — this happens more often than Shopify's docs admit, usually within 5 minutes of the original event. Without a deduplication check (storing Shopify order IDs on HubSpot deals and searching before creating), you'll end up with duplicate deals. Second, HubSpot's 'amount' field silently drops non-numeric strings — if Shopify sends '347.00' as a string and you don't wrap it in float(), your deals will show $0 in reports and you won't get an error telling you why. Third, Power Automate's Shopify connector uses REST API polling under the hood for some trigger configurations despite looking like a webhook — check your flow's trigger definition and confirm it shows 'ApiConnection' type, not a scheduled recurrence, or your 'real-time' flow might actually be running every 3 minutes.

Ideas for what to build next

  • Add a high-value order alert to Microsoft TeamsAfter the 'Create a deal' action, add a condition checking if Amount > your upsell threshold (e.g. $250), and post a Teams message in your #sales channel with the customer name and order total. Reps get notified in under 2 minutes.
  • Enroll high-value deals in a HubSpot upsell sequenceUse the HubSpot CRM action 'Add contact to a list' in a parallel branch to automatically enroll customers who spent over your threshold into a static list, which can trigger a HubSpot enrollment workflow for your upsell email sequence.
  • Sync deal stage back to Shopify when a rep closes a follow-up saleBuild a second flow triggered by a HubSpot deal stage change (using polling on HubSpot's 'Get deals' action filtered by modified date) that creates a Shopify draft order — closing the loop between your CRM and storefront.

Related guides

Was this guide helpful?
HubSpot + Shopify overviewPower Automate profile →