@embedreach/components 0.3.47 → 0.3.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/CallTracking.js +123 -0
- package/dist/chunks/CampaignPerformance.js +71 -0
- package/dist/chunks/ChannelsTab.js +253 -0
- package/dist/chunks/ClickVsTransactionAttribution.js +47 -0
- package/dist/chunks/ConnectGoogleAds.js +46 -0
- package/dist/chunks/ConnectMeta.js +98 -0
- package/dist/chunks/CostPerLead.js +82 -0
- package/dist/chunks/DataNotShowing.js +107 -0
- package/dist/chunks/HowRevenueAttributionWorks.js +156 -0
- package/dist/chunks/LeadsVsTransactions.js +128 -0
- package/dist/chunks/MeasuredVsTotal.js +47 -0
- package/dist/chunks/OverviewDashboard.js +67 -0
- package/dist/chunks/RevenueVsCustomerAttribution.js +102 -0
- package/dist/chunks/TrackingSnippet.js +137 -0
- package/dist/chunks/TrafficFunnel.js +88 -0
- package/dist/chunks/UnknownConversions.js +55 -0
- package/dist/chunks/WhatIsROAS.js +61 -0
- package/dist/chunks/circle-help.js +15 -0
- package/dist/chunks/dollar-sign.js +14 -0
- package/dist/chunks/index.js +68934 -67240
- package/dist/chunks/index2.js +42 -0
- package/dist/chunks/sandbox-loading-screen.js +9 -15
- package/dist/chunks/shopping-cart.js +21 -0
- package/dist/index.d.ts +9 -15
- package/dist/index.es.js +7 -7
- package/dist/index.umd.js +23 -23
- package/dist/styles.css +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { F as FeatureHighlights, U as Users, K as KeyPointsList } from "./index.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { I as InfoCard } from "./index2.js";
|
|
5
|
+
import { D as DollarSign } from "./dollar-sign.js";
|
|
6
|
+
function _createMdxContent(props) {
|
|
7
|
+
const _components = {
|
|
8
|
+
p: "p",
|
|
9
|
+
...props.components
|
|
10
|
+
};
|
|
11
|
+
return jsxs(Fragment, {
|
|
12
|
+
children: [jsx(FeatureHighlights, {
|
|
13
|
+
cardTitle: "Revenue Attribution vs Customer Attribution",
|
|
14
|
+
cardDescription: "Revenue and customer counts use different attribution logic, which is why a sale can appear attributed to one sources while the customer affiliated with that sale is attributed to a different source. This will not always be the case, but it is important to understand why it may happen.",
|
|
15
|
+
cardIcon: DollarSign,
|
|
16
|
+
columns: 2,
|
|
17
|
+
highlights: [{
|
|
18
|
+
icon: DollarSign,
|
|
19
|
+
title: "Measured Revenue",
|
|
20
|
+
description: "Last-touch: the most recent marketing interaction before purchase gets credit"
|
|
21
|
+
}, {
|
|
22
|
+
icon: Users,
|
|
23
|
+
title: "New Customers",
|
|
24
|
+
description: "First-touch: the customer's very first visit ever gets permanent credit"
|
|
25
|
+
}]
|
|
26
|
+
}), "\n", jsx(InfoCard, {
|
|
27
|
+
title: "A concrete example",
|
|
28
|
+
description: "How the same customer can appear in two different places",
|
|
29
|
+
icon: Users,
|
|
30
|
+
variant: "highlighted",
|
|
31
|
+
children: jsxs("div", {
|
|
32
|
+
className: "space-y-4 text-sm",
|
|
33
|
+
children: [jsx("p", {
|
|
34
|
+
className: "text-muted-foreground",
|
|
35
|
+
children: jsx(_components.p, {
|
|
36
|
+
children: "Imagine a customer who first found you through a Google Ad six months ago, then came back last\nweek by clicking a Facebook Ad before buying."
|
|
37
|
+
})
|
|
38
|
+
}), jsxs("div", {
|
|
39
|
+
className: "space-y-2",
|
|
40
|
+
children: [jsxs("div", {
|
|
41
|
+
className: "flex items-start gap-3",
|
|
42
|
+
children: [jsx("div", {
|
|
43
|
+
className: "w-2 h-2 rounded-full bg-blue-500 mt-2 flex-shrink-0"
|
|
44
|
+
}), jsx("p", {
|
|
45
|
+
children: jsxs(_components.p, {
|
|
46
|
+
children: [jsx("span", {
|
|
47
|
+
className: "font-medium",
|
|
48
|
+
children: "Measured Revenue"
|
|
49
|
+
}), " attributes this sale to", " ", "\n", jsx("span", {
|
|
50
|
+
className: "font-medium",
|
|
51
|
+
children: "Facebook Ads"
|
|
52
|
+
}), " — the last paid click before purchase."]
|
|
53
|
+
})
|
|
54
|
+
})]
|
|
55
|
+
}), jsxs("div", {
|
|
56
|
+
className: "flex items-start gap-3",
|
|
57
|
+
children: [jsx("div", {
|
|
58
|
+
className: "w-2 h-2 rounded-full bg-blue-500 mt-2 flex-shrink-0"
|
|
59
|
+
}), jsx("p", {
|
|
60
|
+
children: jsxs(_components.p, {
|
|
61
|
+
children: [jsx("span", {
|
|
62
|
+
className: "font-medium",
|
|
63
|
+
children: "New Customers"
|
|
64
|
+
}), " attributes this customer to", " ", "\n", jsx("span", {
|
|
65
|
+
className: "font-medium",
|
|
66
|
+
children: "Google Ads"
|
|
67
|
+
}), " — the very first interaction that brought\nthem to your site."]
|
|
68
|
+
})
|
|
69
|
+
})]
|
|
70
|
+
})]
|
|
71
|
+
}), jsx("p", {
|
|
72
|
+
className: "text-muted-foreground",
|
|
73
|
+
children: jsx(_components.p, {
|
|
74
|
+
children: "These two data points simply answer different questions, but together paint a picture of how different marketing touchpoints affect your business."
|
|
75
|
+
})
|
|
76
|
+
})]
|
|
77
|
+
})
|
|
78
|
+
}), "\n", jsx(KeyPointsList, {
|
|
79
|
+
title: "When to use each view",
|
|
80
|
+
points: [{
|
|
81
|
+
text: "Use Measured Revenue to understand which campaigns are directly driving purchases right now — it reflects what's converting customers at the moment of sale"
|
|
82
|
+
}, {
|
|
83
|
+
text: "Use New Customers to understand which channels are introducing new people to your business for the first time — it reflects where your audience discovery is coming from"
|
|
84
|
+
}, {
|
|
85
|
+
text: "It's normal for the same customer to appear under different sources in each view — this is expected behavior, not a data error"
|
|
86
|
+
}],
|
|
87
|
+
variant: "highlighted"
|
|
88
|
+
})]
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function MDXContent(props = {}) {
|
|
92
|
+
const { wrapper: MDXLayout } = props.components || {};
|
|
93
|
+
return MDXLayout ? jsx(MDXLayout, {
|
|
94
|
+
...props,
|
|
95
|
+
children: jsx(_createMdxContent, {
|
|
96
|
+
...props
|
|
97
|
+
})
|
|
98
|
+
}) : _createMdxContent(props);
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
MDXContent as default
|
|
102
|
+
};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { f as createLucideIcon, u as useHelpCenterActions, F as FeatureHighlights, L as Link, T as TrendingUp, P as ProcessSteps } from "./index.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { I as InfoCard } from "./index2.js";
|
|
5
|
+
/**
|
|
6
|
+
* @license lucide-react v0.464.0 - ISC
|
|
7
|
+
*
|
|
8
|
+
* This source code is licensed under the ISC license.
|
|
9
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
10
|
+
*/
|
|
11
|
+
const Code = createLucideIcon("Code", [
|
|
12
|
+
["polyline", { points: "16 18 22 12 16 6", key: "z7tu5w" }],
|
|
13
|
+
["polyline", { points: "8 6 2 12 8 18", key: "1eg1df" }]
|
|
14
|
+
]);
|
|
15
|
+
const OpenInstallPixelLink = ({ children }) => {
|
|
16
|
+
const { openInstallPixel } = useHelpCenterActions();
|
|
17
|
+
return /* @__PURE__ */ jsx(
|
|
18
|
+
"button",
|
|
19
|
+
{
|
|
20
|
+
onClick: openInstallPixel,
|
|
21
|
+
className: "text-primary underline underline-offset-4 hover:text-primary/80 cursor-pointer bg-transparent border-none p-0 font-[inherit] text-[inherit]",
|
|
22
|
+
children
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
function _createMdxContent(props) {
|
|
27
|
+
const _components = {
|
|
28
|
+
p: "p",
|
|
29
|
+
...props.components
|
|
30
|
+
};
|
|
31
|
+
return jsxs(Fragment, {
|
|
32
|
+
children: [jsx(FeatureHighlights, {
|
|
33
|
+
cardTitle: "What the Tracking Snippet Does",
|
|
34
|
+
cardDescription: "A small piece of JavaScript code installed on your website. Without it, your dashboard will not show meaningful attribution data.",
|
|
35
|
+
cardIcon: Code,
|
|
36
|
+
columns: 3,
|
|
37
|
+
highlights: [{
|
|
38
|
+
icon: Link,
|
|
39
|
+
title: "Tracks Visitors",
|
|
40
|
+
description: "Identifies when someone lands on your site from an ad click"
|
|
41
|
+
}, {
|
|
42
|
+
icon: Code,
|
|
43
|
+
title: "Captures Conversions",
|
|
44
|
+
description: "Records when a tracked visitor completes a purchase or fills out a form"
|
|
45
|
+
}, {
|
|
46
|
+
icon: TrendingUp,
|
|
47
|
+
title: "Connects the Dots",
|
|
48
|
+
description: "Links the ad click to the purchase so revenue is attributed correctly"
|
|
49
|
+
}]
|
|
50
|
+
}), "\n", jsx(ProcessSteps, {
|
|
51
|
+
title: "How the snippet works",
|
|
52
|
+
icon: Code,
|
|
53
|
+
steps: [{
|
|
54
|
+
number: 1,
|
|
55
|
+
title: "Customer clicks an ad",
|
|
56
|
+
description: "When someone clicks one of your ads, the ad platform passes a click identifier in the URL (like a Google Click ID or Meta fbclid), as well as UTM parameters."
|
|
57
|
+
}, {
|
|
58
|
+
number: 2,
|
|
59
|
+
title: "Snippet captures the click",
|
|
60
|
+
description: "The snippet reads those identifiers from the URL and saves them in the customer's browser. This happens automatically in the background."
|
|
61
|
+
}, {
|
|
62
|
+
number: 3,
|
|
63
|
+
title: "Customer is identified",
|
|
64
|
+
description: "When the customer fills out any form on your site (contact us, purchase, sign up, etc.) or makes a phone call (if you have implemented call tracking), their information is captured and tied to the source of their click."
|
|
65
|
+
}, {
|
|
66
|
+
number: 4,
|
|
67
|
+
title: "Customer makes a purchase",
|
|
68
|
+
description: "When the customer completes a purchase, the purchase data is matched to the identifying information captured by the tracking snippet."
|
|
69
|
+
}, {
|
|
70
|
+
number: 5,
|
|
71
|
+
title: "Attribution is recorded",
|
|
72
|
+
description: "The system matches the click to the purchase and attributes the revenue to the correct campaign and channel, and you can then see it all in your dashboard."
|
|
73
|
+
}]
|
|
74
|
+
}), "\n", jsx(InfoCard, {
|
|
75
|
+
title: "Why your dashboard needs it",
|
|
76
|
+
description: "The snippet is required for attribution data to appear",
|
|
77
|
+
icon: TrendingUp,
|
|
78
|
+
variant: "warning",
|
|
79
|
+
children: jsxs("div", {
|
|
80
|
+
className: "space-y-3 text-sm",
|
|
81
|
+
children: [jsx("p", {
|
|
82
|
+
className: "text-muted-foreground",
|
|
83
|
+
children: jsx(_components.p, {
|
|
84
|
+
children: "Without the snippet installed on your website, we have no way to connect ad clicks to\npurchases. Your dashboard will show ad spend but will not show measured revenue or\nattribution data."
|
|
85
|
+
})
|
|
86
|
+
}), jsx("p", {
|
|
87
|
+
className: "text-muted-foreground",
|
|
88
|
+
children: jsx(_components.p, {
|
|
89
|
+
children: "The snippet should be installed on every page of your website, not just the homepage or\ncheckout page. Visitors can land on any page from an ad."
|
|
90
|
+
})
|
|
91
|
+
})]
|
|
92
|
+
})
|
|
93
|
+
}), "\n", jsx(InfoCard, {
|
|
94
|
+
title: "How to install it",
|
|
95
|
+
description: "You or your webmaster adds one snippet to your site",
|
|
96
|
+
icon: Code,
|
|
97
|
+
variant: "highlighted",
|
|
98
|
+
children: jsxs("div", {
|
|
99
|
+
className: "space-y-3 text-sm",
|
|
100
|
+
children: [jsx("p", {
|
|
101
|
+
className: "text-muted-foreground",
|
|
102
|
+
children: jsxs(_components.p, {
|
|
103
|
+
children: ["The snippet is a single block of JavaScript that gets pasted into the ", jsx("code", {
|
|
104
|
+
className: "font-mono bg-muted px-1 rounded text-xs",
|
|
105
|
+
children: "<head>"
|
|
106
|
+
}), " section of your website's HTML. Because the ", jsx("code", {
|
|
107
|
+
className: "font-mono bg-muted px-1 rounded text-xs",
|
|
108
|
+
children: "<head>"
|
|
109
|
+
}), " is shared across every page, installing it once is all it takes — you do not need to add it page by page."]
|
|
110
|
+
})
|
|
111
|
+
}), jsx("p", {
|
|
112
|
+
className: "text-muted-foreground",
|
|
113
|
+
children: jsx(_components.p, {
|
|
114
|
+
children: "If you use a platform like WordPress, Shopify, or Squarespace, there is usually a dedicated field for adding scripts to the site-wide header. Your webmaster will know where to find it."
|
|
115
|
+
})
|
|
116
|
+
}), jsx("p", {
|
|
117
|
+
className: "text-muted-foreground",
|
|
118
|
+
children: jsx(OpenInstallPixelLink, {
|
|
119
|
+
children: "Click here to get your snippet and step-by-step installation instructions."
|
|
120
|
+
})
|
|
121
|
+
})]
|
|
122
|
+
})
|
|
123
|
+
})]
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
function MDXContent(props = {}) {
|
|
127
|
+
const { wrapper: MDXLayout } = props.components || {};
|
|
128
|
+
return MDXLayout ? jsx(MDXLayout, {
|
|
129
|
+
...props,
|
|
130
|
+
children: jsx(_createMdxContent, {
|
|
131
|
+
...props
|
|
132
|
+
})
|
|
133
|
+
}) : _createMdxContent(props);
|
|
134
|
+
}
|
|
135
|
+
export {
|
|
136
|
+
MDXContent as default
|
|
137
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { P as ProcessSteps, U as Users, T as TrendingUp, K as KeyPointsList } from "./index.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { I as InfoCard } from "./index2.js";
|
|
5
|
+
function _createMdxContent(props) {
|
|
6
|
+
const _components = {
|
|
7
|
+
p: "p",
|
|
8
|
+
...props.components
|
|
9
|
+
};
|
|
10
|
+
return jsxs(Fragment, {
|
|
11
|
+
children: [jsx(ProcessSteps, {
|
|
12
|
+
title: "The Traffic Funnel",
|
|
13
|
+
icon: Users,
|
|
14
|
+
steps: [{
|
|
15
|
+
number: 1,
|
|
16
|
+
title: "Visitors",
|
|
17
|
+
description: "Everyone who lands on your website, regardless of where they came from. This is the widest part of the funnel."
|
|
18
|
+
}, {
|
|
19
|
+
number: 2,
|
|
20
|
+
title: "Identified Leads",
|
|
21
|
+
description: "Visitors we've connected to a real person — someone who submitted a form, made an inquiry, or was identified by the tracking snippet via an email or phone number."
|
|
22
|
+
}, {
|
|
23
|
+
number: 3,
|
|
24
|
+
title: "Conversions",
|
|
25
|
+
description: "Identified leads who completed a purchase. These are the customers whose revenue appears in your measured revenue total."
|
|
26
|
+
}]
|
|
27
|
+
}), "\n", jsx(InfoCard, {
|
|
28
|
+
title: "Where you may be losing potential customers",
|
|
29
|
+
description: "The gap between each stage reveals where to focus",
|
|
30
|
+
icon: TrendingUp,
|
|
31
|
+
variant: "highlighted",
|
|
32
|
+
children: jsxs("div", {
|
|
33
|
+
className: "space-y-4 text-sm",
|
|
34
|
+
children: [jsxs("div", {
|
|
35
|
+
className: "flex items-start gap-3",
|
|
36
|
+
children: [jsx("div", {
|
|
37
|
+
className: "w-2 h-2 rounded-full bg-blue-500 mt-2 flex-shrink-0"
|
|
38
|
+
}), jsxs("div", {
|
|
39
|
+
children: [jsx("h5", {
|
|
40
|
+
className: "font-medium",
|
|
41
|
+
children: "Visitors to Leads gap"
|
|
42
|
+
}), jsx("p", {
|
|
43
|
+
className: "text-muted-foreground",
|
|
44
|
+
children: jsx(_components.p, {
|
|
45
|
+
children: "A large drop-off here means visitors are leaving without identifying themselves. Consider\nwhether your site has clear calls to action, contact forms, or easy ways for visitors to\nshare their information."
|
|
46
|
+
})
|
|
47
|
+
})]
|
|
48
|
+
})]
|
|
49
|
+
}), jsxs("div", {
|
|
50
|
+
className: "flex items-start gap-3",
|
|
51
|
+
children: [jsx("div", {
|
|
52
|
+
className: "w-2 h-2 rounded-full bg-blue-500 mt-2 flex-shrink-0"
|
|
53
|
+
}), jsxs("div", {
|
|
54
|
+
children: [jsx("h5", {
|
|
55
|
+
className: "font-medium",
|
|
56
|
+
children: "Leads to Conversions gap"
|
|
57
|
+
}), jsx("p", {
|
|
58
|
+
className: "text-muted-foreground",
|
|
59
|
+
children: jsx(_components.p, {
|
|
60
|
+
children: "A large drop-off here means leads are identified but not buying. This could point to\npricing, sales follow-up, or the checkout experience as areas to investigate."
|
|
61
|
+
})
|
|
62
|
+
})]
|
|
63
|
+
})]
|
|
64
|
+
})]
|
|
65
|
+
})
|
|
66
|
+
}), "\n", jsx(KeyPointsList, {
|
|
67
|
+
title: "Important to know",
|
|
68
|
+
points: [{
|
|
69
|
+
text: "The funnel only shows people we can track — visitors using ad blockers or private browsing may not appear"
|
|
70
|
+
}, {
|
|
71
|
+
text: "Funnel counts reflect the selected date range — comparing two date ranges side by side shows whether things are improving"
|
|
72
|
+
}],
|
|
73
|
+
variant: "highlighted"
|
|
74
|
+
})]
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function MDXContent(props = {}) {
|
|
78
|
+
const { wrapper: MDXLayout } = props.components || {};
|
|
79
|
+
return MDXLayout ? jsx(MDXLayout, {
|
|
80
|
+
...props,
|
|
81
|
+
children: jsx(_createMdxContent, {
|
|
82
|
+
...props
|
|
83
|
+
})
|
|
84
|
+
}) : _createMdxContent(props);
|
|
85
|
+
}
|
|
86
|
+
export {
|
|
87
|
+
MDXContent as default
|
|
88
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { K as KeyPointsList } from "./index.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { I as InfoCard } from "./index2.js";
|
|
5
|
+
import { C as CircleHelp } from "./circle-help.js";
|
|
6
|
+
function _createMdxContent(props) {
|
|
7
|
+
return jsxs(Fragment, {
|
|
8
|
+
children: [jsx(InfoCard, {
|
|
9
|
+
title: 'Why Some Conversions Show as "Unknown"',
|
|
10
|
+
description: "Unknown appears when a purchase is recorded but we cannot find any marketing touchpoint in the 90-day window",
|
|
11
|
+
icon: CircleHelp,
|
|
12
|
+
variant: "warning",
|
|
13
|
+
intro: "A conversion is labeled Unknown when the purchase event fired but we could not connect it to any identifiable marketing source. This is expected to some degree — no tracking system captures 100% of customer journeys.",
|
|
14
|
+
items: [{
|
|
15
|
+
title: "Customer had no website visits in the 90-day window",
|
|
16
|
+
description: "They may have purchased based on word-of-mouth, an offline interaction, or a much older marketing impression that falls outside the attribution window.",
|
|
17
|
+
dotColor: "amber"
|
|
18
|
+
}, {
|
|
19
|
+
title: "The customer could not be matched",
|
|
20
|
+
description: "We track visitors by email or phone number. If the buyer used a different contact detail for the purchase than they did when browsing, we cannot make the connection.",
|
|
21
|
+
dotColor: "amber"
|
|
22
|
+
}, {
|
|
23
|
+
title: "The snippet did not fire on the checkout page",
|
|
24
|
+
description: "If the tracking snippet is not installed on the checkout or confirmation page, the conversion is recorded but the visit data is not captured.",
|
|
25
|
+
dotColor: "amber"
|
|
26
|
+
}, {
|
|
27
|
+
title: "Ad blockers or private browsing",
|
|
28
|
+
description: "Some customers browse with ad blockers that prevent the snippet from running, making their visit invisible to attribution.",
|
|
29
|
+
dotColor: "amber"
|
|
30
|
+
}]
|
|
31
|
+
}), "\n", jsx(KeyPointsList, {
|
|
32
|
+
title: "What you can do to reduce Unknown conversions",
|
|
33
|
+
points: [{
|
|
34
|
+
text: "Verify the tracking snippet is installed on every page of your website, including checkout confirmation pages"
|
|
35
|
+
}, {
|
|
36
|
+
text: "Ensure your purchase events are passing the correct customer identifiers (email or phone) so we can match the conversion to a visitor record"
|
|
37
|
+
}, {
|
|
38
|
+
text: "Some Unknown conversions are unavoidable — focus on ensuring the snippet is correctly installed before investigating further"
|
|
39
|
+
}],
|
|
40
|
+
variant: "highlighted"
|
|
41
|
+
})]
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function MDXContent(props = {}) {
|
|
45
|
+
const { wrapper: MDXLayout } = props.components || {};
|
|
46
|
+
return MDXLayout ? jsx(MDXLayout, {
|
|
47
|
+
...props,
|
|
48
|
+
children: jsx(_createMdxContent, {
|
|
49
|
+
...props
|
|
50
|
+
})
|
|
51
|
+
}) : _createMdxContent();
|
|
52
|
+
}
|
|
53
|
+
export {
|
|
54
|
+
MDXContent as default
|
|
55
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { F as FeatureHighlights, T as TrendingUp, K as KeyPointsList } from "./index.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { I as InfoCard } from "./index2.js";
|
|
5
|
+
import { D as DollarSign } from "./dollar-sign.js";
|
|
6
|
+
function _createMdxContent(props) {
|
|
7
|
+
return jsxs(Fragment, {
|
|
8
|
+
children: [jsx(FeatureHighlights, {
|
|
9
|
+
cardTitle: "Return on Ad Spend (ROAS)",
|
|
10
|
+
cardDescription: "ROAS tells you how much revenue you earn for every dollar you spend on advertising. It's the primary way to evaluate whether your ads are working.",
|
|
11
|
+
cardIcon: TrendingUp,
|
|
12
|
+
columns: 2,
|
|
13
|
+
highlights: [{
|
|
14
|
+
icon: DollarSign,
|
|
15
|
+
title: "The Formula",
|
|
16
|
+
description: "Revenue from ads divided by Ad spend = ROAS"
|
|
17
|
+
}, {
|
|
18
|
+
icon: TrendingUp,
|
|
19
|
+
title: "What It Means",
|
|
20
|
+
description: "A ROAS of 3x means you earn $3 for every $1 spent on ads"
|
|
21
|
+
}]
|
|
22
|
+
}), "\n", jsx(InfoCard, {
|
|
23
|
+
title: "Reading Your ROAS",
|
|
24
|
+
description: "How to interpret the number you see in your dashboard",
|
|
25
|
+
icon: TrendingUp,
|
|
26
|
+
variant: "highlighted",
|
|
27
|
+
items: [{
|
|
28
|
+
title: "ROAS measures revenue returned, not profit",
|
|
29
|
+
description: "A ROAS of 1x means you recouped your ad spend in revenue — but revenue is not the same as profit. After accounting for the cost of goods, labor, and other expenses, you need your ROAS to be high enough that what remains after those costs exceeds what you spent on ads."
|
|
30
|
+
}, {
|
|
31
|
+
title: "Higher is better, but there is no universal target",
|
|
32
|
+
description: "The ROAS you need to be profitable depends on your margins. A business with high margins can do well at a lower ROAS. A business with thin margins needs a higher ROAS just to break even on ad spend."
|
|
33
|
+
}, {
|
|
34
|
+
title: "What counts as good varies by product",
|
|
35
|
+
description: "High-margin products can be profitable at 2-3x. Low-margin products may need 5x or higher to cover costs. Compare your ROAS to your margins, not to generic benchmarks."
|
|
36
|
+
}]
|
|
37
|
+
}), "\n", jsx(KeyPointsList, {
|
|
38
|
+
title: "Key things to remember",
|
|
39
|
+
points: [{
|
|
40
|
+
text: "ROAS only counts revenue we can trace back to an ad click — it reflects measured revenue, not your total business revenue"
|
|
41
|
+
}, {
|
|
42
|
+
text: "Use ROAS to compare campaigns: a campaign with a higher ROAS is delivering more revenue per dollar spent"
|
|
43
|
+
}, {
|
|
44
|
+
text: "ROAS goes up when you either increase revenue from ads or decrease ad spend without losing sales"
|
|
45
|
+
}],
|
|
46
|
+
variant: "highlighted"
|
|
47
|
+
})]
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function MDXContent(props = {}) {
|
|
51
|
+
const { wrapper: MDXLayout } = props.components || {};
|
|
52
|
+
return MDXLayout ? jsx(MDXLayout, {
|
|
53
|
+
...props,
|
|
54
|
+
children: jsx(_createMdxContent, {
|
|
55
|
+
...props
|
|
56
|
+
})
|
|
57
|
+
}) : _createMdxContent();
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
MDXContent as default
|
|
61
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { f as createLucideIcon } from "./index.js";
|
|
2
|
+
/**
|
|
3
|
+
* @license lucide-react v0.464.0 - ISC
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the ISC license.
|
|
6
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
const CircleHelp = createLucideIcon("CircleHelp", [
|
|
9
|
+
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
10
|
+
["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
|
|
11
|
+
["path", { d: "M12 17h.01", key: "p32p05" }]
|
|
12
|
+
]);
|
|
13
|
+
export {
|
|
14
|
+
CircleHelp as C
|
|
15
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { f as createLucideIcon } from "./index.js";
|
|
2
|
+
/**
|
|
3
|
+
* @license lucide-react v0.464.0 - ISC
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the ISC license.
|
|
6
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
const DollarSign = createLucideIcon("DollarSign", [
|
|
9
|
+
["line", { x1: "12", x2: "12", y1: "2", y2: "22", key: "7eqyqh" }],
|
|
10
|
+
["path", { d: "M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6", key: "1b0p4s" }]
|
|
11
|
+
]);
|
|
12
|
+
export {
|
|
13
|
+
DollarSign as D
|
|
14
|
+
};
|