Per-workflow revenue attribution. Identifies which automations actually generate $ vs which just shuffle contacts around.
At a glance
Per-workflow commerce-revenue attribution. For each HubSpot workflow that ran in the window, the dollar revenue from contacts who completed a commerce order within 7 days of being touched by that workflow. Separates the automations that actually pay for themselves from the ones that merely shuffle contacts between lists. Computed as sum(commerce.order.total) WHERE order.customer_email IN workflow.enrolled_contacts AND order.created_at - workflow.action_completed_at <= 7 days, grouped by workflow_id.
| What it counts | For each HubSpot workflow with at least one enrolment in the window, the sum of commerce-platform order totals from contacts whose email matches an enrolled contact AND whose order was placed within 7 days of a workflow action firing. Workflows are ranked by attributed revenue descending. |
| Numerator (commerce) | SUM(order.total) from Shopify (Order.totalPrice), BigCommerce (total_inc_tax), Adobe Commerce (grand_total), or Stripe (charge.amount / invoice.amount_paid). |
| Workflow-side trigger | workflow_action_completed events from /automation/v3/workflows enrolment-history. Only “send-email”, “set-property”, and “branch” actions count as a touch; internal-task actions do not. |
| Email-matching scope | Exact email match between enrolled-contact email and commerce-platform customer email. Sub-aliases and forwarded inboxes are not matched unless explicitly normalised. |
| Lifecycle-stage scope | All lifecycle stages. A workflow targeting subscribers that converts a buyer is credited the same as one targeting customers for upsell. The card surfaces revenue regardless of cohort. |
| Attribution model | Last-touch within 7 days. If a contact was touched by 3 workflows in the 7 days before purchase, the most-recent action wins. Contacts touched by both a workflow and a campaign-send have the workflow credited only if it was the last touch. |
| Currency | Both sides home-currency-normalised. Multi-currency portals see one figure per workflow, summed at order-creation FX. |
| Refunds | NOT subtracted by default (gross attribution). Refund-adjusted variant is available for finance-team CFO conversations. |
| Multi-portal aggregation | One card per portal. Workflows in portal B do not appear in portal A’s card. Workflows that share a name across portals are reported separately by portal_id + workflow_id. |
| Time window | 90D. Long enough to surface monthly-cadence workflows; short enough to catch a workflow that has stopped producing. |
| Alert trigger | None by default. The card is comparative (rank workflows against each other), not threshold-based. Optional alert: “any workflow >25% of total attributed revenue concentrated risk”. |
| Roles | marketing, finance. Marketing optimises which workflows to keep and which to retire; finance maps automation spend to revenue. |
Calculation
Calculated automatically from your HubSpot data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A services consultancy at $620k MRR running HubSpot Operations Hub plus a Stripe-billed engagement model alongside a Shopify Plus subscription store for productised offerings. Reading on 14 Apr 26 over the trailing 90 days (15 Jan 26 to 14 Apr 26). Top 6 workflows by attributed revenue:| Workflow | Action type | Enrolments 90D | Buyers within 7d | Attributed revenue | $ per enrolment |
|---|---|---|---|---|---|
| 01_post_demo_followup | Sales-Hub send-email | 1,840 | 312 | $186,400 | $101.30 |
| 02_trial_to_paid_nurture | Marketing send-email + branch | 4,210 | 488 | $122,800 | $29.17 |
| 03_renewal_60d_reminder | Set-property + email | 920 | 124 | $96,200 | $104.57 |
| 04_winback_dormant_60d | Email + branch | 6,800 | 96 | $42,800 | $6.29 |
| 05_first_purchase_thankyou | 3,420 | 184 | $18,420 | $5.39 | |
| 06_subscriber_welcome | Email-sequence (3 emails) | 12,600 | 86 | $9,640 | $0.77 |
| Bucket | 90D total |
|---|---|
| Top 6 workflows by revenue | $476,260 |
| Long-tail (other 14 active workflows) | $38,100 |
| Total workflow-attributed revenue | $514,360 |
01_post_demo_followupis the highest-leverage workflow at $101 per enrolment. Sales-rep-triggered post-demo emails convert demo-takers into paying customers within a week. The merchant should not retire this even if open-rate looks middling; revenue-per-enrolment is the right lens, not engagement.- **
06_subscriber_welcomelooks busy but produces 9,640 in 7-day attributed revenue. The workflow is “shuffling contacts around”, not paying for itself. Two options: shorten to a single email, or add a stronger offer in the second email. - **
04_winback_dormant_60druns at 42,800) even though the per-enrolment figure looks weak. Winback campaigns succeed by playing the volume game; the merchant should keep the workflow but expect modest per-touch numbers. - The list-segment refresh lag bias affects
02_trial_to_paid_nurturereading. This workflow useslifecyclestage = trialas its enrolment trigger. When HubSpot’s trial-to-customer transition arrives via Stripe webhook, there is a 5-15 minute lag before the workflow next-action evaluates and the contact exits the workflow. During that lag, the workflow can fire one extra “still on trial?” email after the user already converted. The card credits revenue correctly (last-touch within 7 days), but the workflow’s open-rate looks artificially low because of those late-firing sends. - Workflow-trigger vs send-time attribution conflict surfaces here. A buyer who received a
02_trial_to_paid_nurtureemail AND a Marketing-Hub campaign-send AND a Sales-rep one-to-one in the 7 days before purchase has the order attributed to whichever fired last. The same purchase shows up inEmail-Attributed Commerce Revenue(campaign attribution) and in this card (workflow attribution), but only one wins last-touch credit. Reconcile by adding the two cards: total marketing-attributed revenue should not exceed total commerce revenue.
Sibling cards merchants should reference together
This is the workflow-attribution slice of HubSpot’s commerce revenue picture. Pair with these to triangulate:| Card | Why pair it with Workflow-Triggered Commerce Revenue |
|---|---|
| Email-Attributed Commerce Revenue | The campaign-side companion. This card is workflow-only; that one captures campaign sends. The two should sum close to total marketing-attributed revenue. |
| Workflows Active Count | The denominator-side stock. Workflow proliferation without revenue growth means automation drift; consolidate. |
| Marketing Emails Sent | Volume context. Workflow-attributed revenue per send is the durable productivity number. |
| Pipeline-vs-Realised Revenue Gap | The sales-attributed sister card. Workflows can be sales-touch (post-demo follow-up) or marketing-nurture; the split here matters for credit allocation. |
| Lifecycle Stage → First Purchase Conversion | The lifecycle-validation card. A workflow’s enrolment cohort should map to lifecyclestage progression; gaps mean the workflow is firing without changing stage. |
| Top Customers Without HubSpot Contact | The reverse: customers no workflow can reach. Each missing contact is workflow-attributed revenue NOT captured here. |
| Shopify Total Revenue | The denominator. Workflow-attributed share of total commerce revenue is the automation-leverage measure. |
| Klaviyo Email-Attributed Revenue | If a merchant runs both ESPs (rare), HubSpot-workflow attribution and Klaviyo-flow attribution should not overlap subscriber-set. Triangulate before scaling either. |
Reconciling against the vendor’s own dashboard
Where to look in HubSpot: HubSpot does not natively show per-workflow commerce revenue; it knows what its workflows fire and what its emails open, but commerce-order data lives in a different system. Closest individual views:HubSpot → Automation → Workflows → (workflow) → History (per-workflow enrolment + action history) HubSpot → Reports → Analytics tools → Marketing email (per-email send/open/click) Stripe Dashboard → Reports → Net Volume / Shopify Admin → Analytics → Sales (commerce-side revenue)The merchant traditionally reconciles by exporting workflow-enrolment history, exporting commerce orders, and joining on email; this card automates that nightly per workflow. Why our number may legitimately differ from the merchant’s expectation:
| Reason | Direction | Why |
|---|---|---|
| Timezone | Boundary day off | HubSpot portal timezone may differ from commerce-platform timezone and from UTC. Effect is small over 90D rolling but visible on edge-case daily readings. |
| List-membership refresh lag | Attributed revenue lower | Workflows triggered by list-membership see a 15-60 minute lag between criteria-met and enrolment-fired. Buyers who purchase in that lag window are not credited to the workflow. |
| HubSpot lifecycle-stage backfill | Attributed revenue spike | A bulk lifecycle-backfill can re-trigger workflows that branch on stage, inflating short-term enrolment counts and thus 7-day revenue attribution. |
| Workflow-trigger latency | Attributed revenue lower | Internal HubSpot workflow processing has a typical 5-15 minute action-fire latency; under high load this stretches to 30-60 minutes. Late-firing actions miss buyers who purchased between trigger-evaluated and action-completed. |
| Multi-portal aggregation ambiguity | Either | A workflow named identically across portals is reported per portal, not consolidated. If the merchant intends a single portfolio view, sum manually. |
| Last-touch attribution | Attributed revenue concentrated | A buyer touched by 3 workflows in 7 days credits all revenue to the last-action workflow; the other two see zero. Multi-touch attribution would split the credit and the per-workflow numbers would look smaller and more even. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
| Shopify Total Revenue | Total workflow-attributed revenue must be ≤ Shopify Total Revenue (subset relationship) | Some buyers were never touched by any workflow; their orders count in Shopify but not here. Self-serve buyers and never-emailed customers fall into this bucket. |
| Klaviyo Email-Attributed Revenue | Different attribution model: HubSpot uses last-touch within 7 days; Klaviyo uses 5-day-click + 1-day-view. The two cards do not have to sum to total commerce revenue, but neither should exceed it on its own. | A buyer who clicked a Klaviyo email AND received a HubSpot workflow email in the same window may show up in both with separate credit; that is double-attribution if the merchant assumes single-touch reality. |
| GA4 Channel Revenue | The “Email” channel in GA4 uses UTM-tagged session attribution (cookie-based, last-non-direct-click). HubSpot workflow attribution is identity-based (email match). The two should be directionally similar on a 90D window. | Buyers who clicked a workflow email but completed checkout in a separate session without UTM persistence land in GA4’s direct channel; HubSpot still credits them. Expect HubSpot’s attributed share to run 10-25% higher than GA4’s email-channel share. |
Known limitations / merchant FAQs
Why does my workflow show 186,000 from the same audience? Two attribution models. This card credits a workflow only when the workflow’s last-action fired within 7 days BEFORE the order. Shopify counts every order from that audience regardless of marketing touch. The 95% gap is mostly buyers who would have purchased anyway (organic return) plus buyers who were touched by a different channel in the 7-day window. The honest measure of incremental workflow value is a holdout test: suppress 10% of the workflow’s audience for 30 days and compare conversion. My workflow ran 12,600 enrolments and only 86 buyers, that is 0.68% conversion, what is wrong? Conversion rate alone is the wrong lens. Look at 112 AOV produces 0.77 per enrolment is below your audience-fatigue threshold, retire or shorten the workflow. For top-of-funnelsubscriber_welcome workflows, $0.77 per enrolment is normal; for bottom-of-funnel cart-abandon workflows, it is failing.
Vendor discrepancy with HubSpot’s own dashboard, who is right?
HubSpot’s dashboard shows workflow performance (enrolments, action-completions, email opens, email clicks) but does NOT show commerce revenue per workflow. There is no vendor number to be wrong about. This card is the missing report; the merchant has historically reconciled it manually with CSV exports.
List-segment refresh lag, does it affect this?
Yes meaningfully. Workflows triggered by list-membership inherit list-refresh lag (15-60 minutes for active lists, longer for static). Buyers who become eligible for the workflow but purchase before the workflow enrols them are not credited. This biases attributed revenue downward for list-triggered workflows; event-triggered workflows (form-submit, deal-stage-change) are largely lag-free.
Lifecycle-stage definitions, do they affect this card?
Indirectly. Workflows that branch on lifecyclestage will fire different actions depending on stage; if a stage-backfill happens during the window, the action-history changes mid-period. The card sums total revenue per workflow regardless of which branch fired, so the top-level number is stable; per-action breakdown drilling can look noisy on backfill days.
Multi-portal aggregation, how does it work?
One card per portal. Workflows in portal B do not appear in portal A’s card. If the merchant runs a primary marketing portal plus a sandbox portal, only the primary should be wired into commerce; the sandbox card will be empty or contain test data. For agencies running multi-region portals, expect each region’s card to surface its own top-revenue workflows.
Workflow-trigger latency vs send-time, what does this card measure?
The card uses workflow_action_completed_at (send-time, not trigger-time). A workflow triggered at 09:00 that fires its email at 09:14 has the action-completion timestamp at 09:14; that is the anchor for the 7-day window. Trigger-time is irrelevant for attribution; what matters is when the contact was actually touched.
Today-volatility, why does this swing?
Workflows fire continuously; commerce orders fire continuously. The card refreshes daily. Day-to-day swings of 5-15% are normal because a single $50k deal closing today via a 01_post_demo_followup workflow shows up in tomorrow’s reading. The 90D rolling window smooths most of this; sub-weekly trend reading is noisy and should be ignored.
Action playbook on workflow under-performance:
- Sort workflows by
$ per enrolmentascending; the bottom 5 are candidates for review. - For each, check enrolment volume; high-volume low-$ workflows are the audience-fatigue risk.
- For each, check whether the workflow’s last action is “send-email” or just a property-set; property-set-only workflows often shuffle data without driving revenue.
- A/B test: shorten the workflow to half its current length, or replace the email creative.
- Re-baseline after 30 days; if $ per enrolment doubles, the change paid off.