

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-timeUse case type
importReal-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.
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
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.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Deal Name | dealname | |
| Deal Amount | amount | |
| Deal Stage | dealstage | |
| Close Date | closedate | |
| Pipeline | pipeline | |
| Customer Email | email | |
4 optional fields▸ show
| Shopify Order ID (custom property) | shopify_order_id |
| Customer First Name | firstname |
| Customer Last Name | lastname |
| Order Source / Deal Type | deal_type |
Step-by-Step Setup
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.
- 1Click 'My flows' in the left sidebar
- 2Click '+ New flow' at the top right
- 3Select 'Automated cloud flow'
- 4Type a name in the 'Flow name' field (e.g. 'Shopify Order → HubSpot Deal')
- 5Click 'Skip' on the trigger picker — you'll set it in the next step
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.
- 1Click the 'Add a trigger' block on the canvas
- 2Type 'Shopify' in the connector search bar
- 3Click the Shopify connector icon
- 4Select 'When an order is created' from the trigger list
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.
- 1Click 'Sign in' in the trigger block
- 2Enter your store URL as 'yourstore.myshopify.com'
- 3Paste the API key into the 'API Key' field
- 4Paste the API password into the 'Password' field
- 5Click 'Create'
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.
- 1Click '+ New step'
- 2Search for 'Condition' in the action picker
- 3Select 'Condition' under the Control connector
- 4Click the left value box and choose 'Financial Status' from the dynamic content panel
- 5Set operator to 'is equal to' and type 'paid' in the right box
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.
- 1Click 'Add an action' inside the 'If yes' branch
- 2Search 'HubSpot' in the action picker
- 3Select 'HubSpot CRM' connector
- 4Choose 'Search for contacts'
- 5Set filter field to 'email' and map the Shopify 'Email' dynamic field as the value
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'.
- 1Add a 'Condition' action after the search step
- 2In the left value box, click 'Expression' tab and type: empty(outputs('Search_for_contacts')?['body/results'])
- 3Set operator to 'is equal to true'
- 4Inside nested 'If yes', add 'HubSpot CRM > Create a contact'
- 5Map Email, First Name, Last Name, and Phone from Shopify dynamic content
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.
- 1Click '+ New step' after the nested condition
- 2Search 'Initialize variable' in the action picker
- 3Set Name to 'ContactID', Type to 'String'
- 4Click the Value field, open the 'Expression' tab
- 5Paste the if() expression resolving to the correct contact 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'], '"}'))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')'.
- 1Click '+ New step' and search 'HubSpot CRM'
- 2Select 'Create a deal'
- 3Set Deal Name to 'Shopify Order #' + Shopify 'Order Number' dynamic field
- 4Set Amount to Shopify 'Total Price'
- 5Set Close Date using Expression: formatDateTime(utcNow(), 'yyyy-MM-dd')
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).
- 1Click '+ New step' after 'Create a deal'
- 2Search 'HubSpot CRM' and select 'Create an association'
- 3Set Object Type 1 to 'deals'
- 4Set Object ID 1 using Expression: outputs('Create_a_deal')?['body/id']
- 5Set Object Type 2 to 'contacts', Object ID 2 to the 'ContactID' variable, Association Type ID to '3'
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.
- 1Click 'Save' (disk icon) in the top right
- 2Click 'Test' and select 'Manually'
- 3Click 'Test' again to put the flow in listening mode
- 4Place a test order in Shopify using Bogus Gateway
- 5Watch the Power Automate test panel for step-by-step results
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.
- 1Click the back arrow from the canvas
- 2Find your flow in 'My flows' and confirm the status toggle is 'On'
- 3Click the flow name to open its detail page
- 4Click '28 day run history' to view executions
- 5Click any failed run to expand the step-by-step error details
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
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.
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.
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 Teams — After 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 sequence — Use 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 sale — Build 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
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup
How to Share Notion Meeting Notes to Slack with Power Automate
~15 min setup
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup