@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.
@@ -0,0 +1,123 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { F as FeatureHighlights, h as Phone, T as TrendingUp, L as Link, 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(FeatureHighlights, {
12
+ cardTitle: "Why Call Tracking Matters",
13
+ cardDescription: "If your business receives inbound phone calls, a significant share of your conversions may be invisible to your dashboard. Call tracking closes that gap by treating phone calls as measurable conversion events — just like a form submission or a purchase.",
14
+ cardIcon: Phone,
15
+ columns: 3,
16
+ highlights: [{
17
+ icon: Phone,
18
+ title: "Calls Are Conversions",
19
+ description: "A customer calling your business is often the most valuable action they can take. Without call tracking, that conversion goes unrecorded."
20
+ }, {
21
+ icon: TrendingUp,
22
+ title: "Attribution Without It Is Incomplete",
23
+ description: "Campaigns that drive calls will look like they have low ROAS. Call tracking surfaces the revenue and leads those campaigns are actually generating."
24
+ }, {
25
+ icon: Link,
26
+ title: "Connects Calls to Campaigns",
27
+ description: "Call tracking ties each inbound call back to the specific ad, keyword, or channel that brought that caller to you."
28
+ }]
29
+ }), "\n", jsx(InfoCard, {
30
+ title: "How Dynamic Number Insertion Works",
31
+ description: "The technique that makes source-level call attribution possible",
32
+ icon: Phone,
33
+ variant: "highlighted",
34
+ children: jsxs("div", {
35
+ className: "space-y-3 text-sm",
36
+ children: [jsx("p", {
37
+ className: "text-muted-foreground",
38
+ children: jsx(_components.p, {
39
+ children: "Dynamic Number Insertion (DNI) is the core technology behind source-level call tracking. Instead of displaying a single static phone number on your website, DNI uses a JavaScript snippet to automatically swap the phone number a visitor sees based on how they arrived at your site."
40
+ })
41
+ }), jsx("p", {
42
+ className: "text-muted-foreground",
43
+ children: jsx(_components.p, {
44
+ children: "Each marketing source — Google Ads, a specific campaign, organic search, a social referral — gets assigned its own tracking number from a pool. When a visitor lands on your site, the snippet detects their source and replaces the phone number on the page with the tracking number assigned to that source. When the visitor calls, the provider knows exactly where they came from."
45
+ })
46
+ }), jsx("p", {
47
+ className: "text-muted-foreground",
48
+ children: jsx(_components.p, {
49
+ children: "After the call ends, the provider sends the call details — phone number, duration, source, campaign, and keyword — to your attribution system. From there it is recorded as a conversion and attributed to the right marketing channel."
50
+ })
51
+ })]
52
+ })
53
+ }), "\n", jsx(InfoCard, {
54
+ title: "Your Three Options",
55
+ description: "Google's native solution and two third-party call tracking platforms are currently supported. If you use another call tracking provider, please contact support.",
56
+ icon: Phone,
57
+ variant: "highlighted",
58
+ items: [{
59
+ title: "Google's Native Call Reporting",
60
+ description: "Google Ads provides its own call tracking through Google Forwarding Numbers — phone numbers Google supplies that temporarily replace your number in your ads and on your website. When a caller dials the forwarding number, Google records the call as a conversion and routes it to your real number. This is built directly into Google Ads and requires no third-party subscription. However, it only tracks calls that originate from Google Ads and does not track calls from other sources like Meta ads, organic search, or direct traffic."
61
+ }, {
62
+ title: "CallRail",
63
+ description: "CallRail is a dedicated call tracking platform that supports DNI across all traffic sources — not just Google. It assigns a pool of tracking numbers to your website and uses a lightweight JavaScript snippet to swap numbers based on the visitor's source. Each call is logged with the source, medium, campaign, keyword, landing page, and caller details. CallRail also integrates natively with Google Ads, allowing it to pass call conversions directly into your Google Ads account for bidding and optimization."
64
+ }, {
65
+ title: "Call Tracking Metrics (CTM)",
66
+ description: "Call Tracking Metrics is a similar platform to CallRail with DNI, multi-source attribution, and Google Ads integration. CTM focuses on businesses that need detailed call routing and call center features alongside attribution, and is popular in agencies managing multiple clients. Like CallRail, it tracks calls from any source and can pass conversion data into Google Ads."
67
+ }]
68
+ }), "\n", jsx(InfoCard, {
69
+ title: "How These Integrate With Your Dashboard",
70
+ description: "How call data flows from CallRail and CTM into Measure",
71
+ icon: Link,
72
+ variant: "highlighted",
73
+ children: jsxs("div", {
74
+ className: "space-y-3 text-sm",
75
+ children: [jsx("p", {
76
+ className: "text-muted-foreground",
77
+ children: jsx(_components.p, {
78
+ children: "Google's native call reporting connects automatically when you link your Google Ads account — no additional setup is needed."
79
+ })
80
+ }), jsx("p", {
81
+ className: "text-muted-foreground",
82
+ children: jsx(_components.p, {
83
+ children: "For CallRail and CTM, the integration works through a webhook. When a call ends, CallRail or CTM sends the call details — including the source, campaign, keyword, and caller information — to a Reach-provided endpoint. Reach validates the request, records the call as a conversion event, and attributes it to the appropriate campaign in your dashboard."
84
+ })
85
+ }), jsx("p", {
86
+ className: "text-muted-foreground",
87
+ children: jsx(_components.p, {
88
+ children: "You will also need to configure your Google Ads account to send call data to your chosen provider. This is a one-time setting in Google Ads under Account Settings → Call Reporting, where you select CallRail or CTM as your call analytics provider. This allows call conversion data to flow back into your Google Ads campaigns for optimization."
89
+ })
90
+ }), jsx("p", {
91
+ className: "text-muted-foreground",
92
+ children: jsx(_components.p, {
93
+ children: "To set up either integration, open your dashboard settings and look for the CallRail or CTM option under Quick Links & Integrations."
94
+ })
95
+ })]
96
+ })
97
+ }), "\n", jsx(KeyPointsList, {
98
+ title: "Key things to know",
99
+ points: [{
100
+ text: "Google's native solution only tracks calls from Google Ads. If you run Meta ads or care about organic and direct call attribution, you need CallRail or CTM."
101
+ }, {
102
+ text: "DNI requires a JavaScript snippet on your website in addition to the webhook integration. Your call tracking provider will give you this snippet separately from the Reach setup."
103
+ }, {
104
+ text: "Call tracking numbers are temporary tracking numbers — they forward to your real number. Callers will always reach you; the tracking happens transparently in the background."
105
+ }, {
106
+ text: "You do not need to use all three options. Most businesses pick one: Google native if they only run Google Ads, or CallRail or CTM if they run ads across multiple platforms."
107
+ }],
108
+ variant: "highlighted"
109
+ })]
110
+ });
111
+ }
112
+ function MDXContent(props = {}) {
113
+ const { wrapper: MDXLayout } = props.components || {};
114
+ return MDXLayout ? jsx(MDXLayout, {
115
+ ...props,
116
+ children: jsx(_createMdxContent, {
117
+ ...props
118
+ })
119
+ }) : _createMdxContent(props);
120
+ }
121
+ export {
122
+ MDXContent as default
123
+ };
@@ -0,0 +1,71 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { g as ChartNoAxesColumn, K as KeyPointsList } from "./index.js";
3
+ import "react";
4
+ import { I as InfoCard } from "./index2.js";
5
+ function _createMdxContent(props) {
6
+ return jsxs(Fragment, {
7
+ children: [jsx(InfoCard, {
8
+ title: "Campaign Table Columns Explained",
9
+ description: "What each column in the campaign performance table tells you",
10
+ icon: ChartNoAxesColumn,
11
+ variant: "default",
12
+ items: [{
13
+ title: "Campaign",
14
+ description: "The name of the ad campaign as it appears in Google Ads or Meta. Use this to match what you see here with what you see inside your ad platform."
15
+ }, {
16
+ title: "Cost",
17
+ description: "Total ad spend for this campaign during the selected date range. This is the amount you paid the ad platform, pulled directly from your connected ad account."
18
+ }, {
19
+ title: "Impressions",
20
+ description: "How many times your ad was shown. A high impression count with low clicks suggests your ad is being seen but not compelling people to act."
21
+ }, {
22
+ title: "Clicks",
23
+ description: "How many times people clicked your ad. Clicks represent potential customers who showed enough interest to visit your site."
24
+ }, {
25
+ title: "Revenue",
26
+ description: "Attributed revenue driven by this campaign — the total value of conversions (purchases or leads) that Reach traced back to a click on this campaign's ads."
27
+ }, {
28
+ title: "ROAS",
29
+ description: "Return on Ad Spend: attributed revenue divided by cost for this campaign. A ROAS of 4 means you earned $4 in measured revenue for every $1 spent. Use this to compare efficiency across campaigns."
30
+ }, {
31
+ title: "Orders",
32
+ description: "The number of attributed conversions — purchases or transactions — that originated from this campaign. This counts all customers, regardless of whether they are new or returning."
33
+ }, {
34
+ title: "New Customers",
35
+ description: "The number of attributed conversions where the customer had not previously purchased from this business. This helps you understand how much of your ad spend is reaching people who have never bought from you before."
36
+ }, {
37
+ title: "New Customer Revenue",
38
+ description: "The total revenue attributed to new customers only. Comparing this to total revenue shows you how much of your return is coming from customer acquisition vs. repeat purchases."
39
+ }, {
40
+ title: "NCROAS",
41
+ description: "New Customer Return on Ad Spend: new customer revenue divided by cost. This metric tells you how efficiently a campaign is acquiring new customers. A campaign with a lower overall ROAS but a high NCROAS may still be extremely valuable for growth."
42
+ }]
43
+ }), "\n", jsx(KeyPointsList, {
44
+ title: "How to identify well-performing vs. underperforming campaigns",
45
+ points: [{
46
+ text: 'What counts as "good performance" depends on your goals. If your priority is driving total revenue, focus on ROAS and Revenue. If you are trying to grow your customer base, NCROAS and New Customers are the metrics that matter most. A campaign with modest ROAS but high NCROAS is doing its job if acquisition is your objective.'
47
+ }, {
48
+ text: "High ROAS + high Orders = a campaign worth scaling — consider increasing its budget to capture more of the same audience"
49
+ }, {
50
+ text: "High spend + low ROAS = a campaign that may be draining budget — investigate the targeting, creative, and landing page before cutting it entirely"
51
+ }, {
52
+ text: "Strong NCROAS but low overall ROAS = the campaign is bringing in new customers at a good rate, but those customers may be spending less on average — consider pairing it with a retention campaign to increase lifetime value"
53
+ }, {
54
+ text: "Zero orders after significant spend = the campaign is getting clicks but not driving purchases — check that the tracking snippet is installed on the landing page and review the landing page experience"
55
+ }],
56
+ variant: "highlighted"
57
+ })]
58
+ });
59
+ }
60
+ function MDXContent(props = {}) {
61
+ const { wrapper: MDXLayout } = props.components || {};
62
+ return MDXLayout ? jsx(MDXLayout, {
63
+ ...props,
64
+ children: jsx(_createMdxContent, {
65
+ ...props
66
+ })
67
+ }) : _createMdxContent();
68
+ }
69
+ export {
70
+ MDXContent as default
71
+ };
@@ -0,0 +1,253 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { f as createLucideIcon, F as FeatureHighlights, g as ChartNoAxesColumn, T as TrendingUp, K as KeyPointsList } 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 Globe = createLucideIcon("Globe", [
12
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
13
+ ["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
14
+ ["path", { d: "M2 12h20", key: "9i4pu4" }]
15
+ ]);
16
+ /**
17
+ * @license lucide-react v0.464.0 - ISC
18
+ *
19
+ * This source code is licensed under the ISC license.
20
+ * See the LICENSE file in the root directory of this source tree.
21
+ */
22
+ const Table = createLucideIcon("Table", [
23
+ ["path", { d: "M12 3v18", key: "108xh3" }],
24
+ ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
25
+ ["path", { d: "M3 9h18", key: "1pudct" }],
26
+ ["path", { d: "M3 15h18", key: "5xshup" }]
27
+ ]);
28
+ function _createMdxContent(props) {
29
+ const _components = {
30
+ p: "p",
31
+ ...props.components
32
+ };
33
+ return jsxs(Fragment, {
34
+ children: [jsx(FeatureHighlights, {
35
+ cardTitle: "What Channels Are",
36
+ cardDescription: "A channel is the marketing source that brought a customer to your site. Your Channels tab shows how revenue is distributed across every source we track.",
37
+ cardIcon: Globe,
38
+ columns: 3,
39
+ highlights: [{
40
+ icon: ChartNoAxesColumn,
41
+ title: "Paid Channels",
42
+ description: "Google Ads, Meta Ads"
43
+ }, {
44
+ icon: Globe,
45
+ title: "Organic Channels",
46
+ description: "Organic search, direct visits, social referrals, and other non-paid sources"
47
+ }, {
48
+ icon: TrendingUp,
49
+ title: "Unknown",
50
+ description: "Purchases we couldn't trace back to any marketing touchpoint"
51
+ }]
52
+ }), "\n", jsx(InfoCard, {
53
+ title: "Reading the Channels view",
54
+ description: "How to interpret the pie chart and revenue breakdown table",
55
+ icon: Globe,
56
+ variant: "highlighted",
57
+ children: jsxs("div", {
58
+ className: "space-y-4 text-sm",
59
+ children: [jsxs("div", {
60
+ className: "flex items-start gap-3",
61
+ children: [jsx("div", {
62
+ className: "w-2 h-2 rounded-full bg-blue-500 mt-2 flex-shrink-0"
63
+ }), jsxs("div", {
64
+ children: [jsx("h5", {
65
+ className: "font-medium",
66
+ children: "Pie chart"
67
+ }), jsx("p", {
68
+ className: "text-muted-foreground",
69
+ children: jsx(_components.p, {
70
+ children: "Shows the proportional share of measured revenue by channel. A channel with a large slice\nis generating a large share of your attributable revenue."
71
+ })
72
+ })]
73
+ })]
74
+ }), jsxs("div", {
75
+ className: "flex items-start gap-3",
76
+ children: [jsx("div", {
77
+ className: "w-2 h-2 rounded-full bg-blue-500 mt-2 flex-shrink-0"
78
+ }), jsxs("div", {
79
+ children: [jsx("h5", {
80
+ className: "font-medium",
81
+ children: "Revenue breakdown table"
82
+ }), jsx("p", {
83
+ className: "text-muted-foreground",
84
+ children: jsx(_components.p, {
85
+ children: "Below the pie chart is a sortable table that breaks down measured revenue row by row. Each\nrow represents one source, channel, or campaign depending on how you have grouped the data.\nA totals row at the bottom summarizes all visible rows."
86
+ })
87
+ })]
88
+ })]
89
+ })]
90
+ })
91
+ }), "\n", jsx(InfoCard, {
92
+ title: "Reading the Revenue Breakdown Table",
93
+ description: "What each column means and how to use the Group By selector",
94
+ icon: Table,
95
+ variant: "highlighted",
96
+ children: jsxs("div", {
97
+ className: "space-y-5 text-sm",
98
+ children: [jsxs("div", {
99
+ className: "space-y-3",
100
+ children: [jsx("h5", {
101
+ className: "font-medium",
102
+ children: "Columns"
103
+ }), jsxs("div", {
104
+ className: "space-y-2 pl-1",
105
+ children: [jsxs("div", {
106
+ className: "flex items-start gap-2",
107
+ children: [jsx("div", {
108
+ className: "w-1.5 h-1.5 rounded-full bg-muted-foreground mt-1.5 flex-shrink-0"
109
+ }), jsxs("p", {
110
+ className: "text-muted-foreground",
111
+ children: [jsx("span", {
112
+ className: "font-medium text-foreground",
113
+ children: "Source / Channel / Campaign"
114
+ }), " — The first column label changes to match whichever grouping you have selected. This is what the revenue in that row is attributed to."]
115
+ })]
116
+ }), jsxs("div", {
117
+ className: "flex items-start gap-2",
118
+ children: [jsx("div", {
119
+ className: "w-1.5 h-1.5 rounded-full bg-muted-foreground mt-1.5 flex-shrink-0"
120
+ }), jsxs("p", {
121
+ className: "text-muted-foreground",
122
+ children: [jsx("span", {
123
+ className: "font-medium text-foreground",
124
+ children: "Transactions"
125
+ }), " — The number of purchases attributed to that row. Use this alongside revenue to understand average order value per source."]
126
+ })]
127
+ }), jsxs("div", {
128
+ className: "flex items-start gap-2",
129
+ children: [jsx("div", {
130
+ className: "w-1.5 h-1.5 rounded-full bg-muted-foreground mt-1.5 flex-shrink-0"
131
+ }), jsxs("p", {
132
+ className: "text-muted-foreground",
133
+ children: [jsx("span", {
134
+ className: "font-medium text-foreground",
135
+ children: "Revenue"
136
+ }), " — The total measured revenue attributed to that row for the selected date range."]
137
+ })]
138
+ }), jsxs("div", {
139
+ className: "flex items-start gap-2",
140
+ children: [jsx("div", {
141
+ className: "w-1.5 h-1.5 rounded-full bg-muted-foreground mt-1.5 flex-shrink-0"
142
+ }), jsxs("p", {
143
+ className: "text-muted-foreground",
144
+ children: [jsx("span", {
145
+ className: "font-medium text-foreground",
146
+ children: "Percentage"
147
+ }), " — That row's share of your total measured revenue. A quick way to see which sources are dominating without doing the math yourself."]
148
+ })]
149
+ })]
150
+ })]
151
+ }), jsxs("div", {
152
+ className: "space-y-3",
153
+ children: [jsx("h5", {
154
+ className: "font-medium",
155
+ children: "Group By options"
156
+ }), jsx("p", {
157
+ className: "text-muted-foreground",
158
+ children: "The dropdown in the top-right corner of the table controls how rows are grouped. Each option answers a different question:"
159
+ }), jsxs("div", {
160
+ className: "space-y-2 pl-1",
161
+ children: [jsxs("div", {
162
+ className: "flex items-start gap-2",
163
+ children: [jsx("div", {
164
+ className: "w-1.5 h-1.5 rounded-full bg-muted-foreground mt-1.5 flex-shrink-0"
165
+ }), jsxs("p", {
166
+ className: "text-muted-foreground",
167
+ children: [jsx("span", {
168
+ className: "font-medium text-foreground",
169
+ children: "Source"
170
+ }), " — Groups by the specific platform or tool that brought the customer, such as Google Ads, Facebook, or HubSpot. This is the default and the most granular paid-vs-organic view."]
171
+ })]
172
+ }), jsxs("div", {
173
+ className: "flex items-start gap-2",
174
+ children: [jsx("div", {
175
+ className: "w-1.5 h-1.5 rounded-full bg-muted-foreground mt-1.5 flex-shrink-0"
176
+ }), jsxs("p", {
177
+ className: "text-muted-foreground",
178
+ children: [jsx("span", {
179
+ className: "font-medium text-foreground",
180
+ children: "Channel"
181
+ }), " — Groups by marketing channel type: Paid, Organic, Email, Social, Referral, etc. Use this for a high-level strategy view."]
182
+ })]
183
+ }), jsxs("div", {
184
+ className: "flex items-start gap-2",
185
+ children: [jsx("div", {
186
+ className: "w-1.5 h-1.5 rounded-full bg-muted-foreground mt-1.5 flex-shrink-0"
187
+ }), jsxs("p", {
188
+ className: "text-muted-foreground",
189
+ children: [jsx("span", {
190
+ className: "font-medium text-foreground",
191
+ children: "UTM Campaign"
192
+ }), " — Groups by the ", jsx("code", {
193
+ className: "font-mono bg-muted px-1 rounded text-xs",
194
+ children: "utm_campaign"
195
+ }), ' value in your tracking URLs. Useful if you tag your links with campaign names like "summer-sale" or "brand-awareness".']
196
+ })]
197
+ }), jsxs("div", {
198
+ className: "flex items-start gap-2",
199
+ children: [jsx("div", {
200
+ className: "w-1.5 h-1.5 rounded-full bg-muted-foreground mt-1.5 flex-shrink-0"
201
+ }), jsxs("p", {
202
+ className: "text-muted-foreground",
203
+ children: [jsx("span", {
204
+ className: "font-medium text-foreground",
205
+ children: "UTM Medium"
206
+ }), " — Groups by the ", jsx("code", {
207
+ className: "font-mono bg-muted px-1 rounded text-xs",
208
+ children: "utm_medium"
209
+ }), ' value, such as "email", "cpc", or "social". Helps you compare performance across broad marketing methods.']
210
+ })]
211
+ }), jsxs("div", {
212
+ className: "flex items-start gap-2",
213
+ children: [jsx("div", {
214
+ className: "w-1.5 h-1.5 rounded-full bg-muted-foreground mt-1.5 flex-shrink-0"
215
+ }), jsxs("p", {
216
+ className: "text-muted-foreground",
217
+ children: [jsx("span", {
218
+ className: "font-medium text-foreground",
219
+ children: "Referrer"
220
+ }), " — Groups by the actual domain that sent the visitor, such as google.com or facebook.com. Useful for spotting unexpected traffic sources or measuring the value of partner websites."]
221
+ })]
222
+ })]
223
+ })]
224
+ }), jsx("p", {
225
+ className: "text-muted-foreground",
226
+ children: "All columns are sortable. Click any column header to rank rows by that value. You can also search the table to filter down to a specific source or campaign name."
227
+ })]
228
+ })
229
+ }), "\n", jsx(KeyPointsList, {
230
+ title: "Using channels to understand your customer mix",
231
+ points: [{
232
+ text: "A large organic search share means customers are finding you without paid ads — this lowers your overall cost per acquisition"
233
+ }, {
234
+ text: "A large direct traffic share can mean strong brand awareness, but it can also mean the snippet missed some ad click tracking — verify your setup if this seems unusually high"
235
+ }, {
236
+ text: "Use the Channels tab to decide where to invest: if one source has a high revenue share or high transaction count, it's a candidate for increased budget"
237
+ }],
238
+ variant: "highlighted"
239
+ })]
240
+ });
241
+ }
242
+ function MDXContent(props = {}) {
243
+ const { wrapper: MDXLayout } = props.components || {};
244
+ return MDXLayout ? jsx(MDXLayout, {
245
+ ...props,
246
+ children: jsx(_createMdxContent, {
247
+ ...props
248
+ })
249
+ }) : _createMdxContent(props);
250
+ }
251
+ export {
252
+ MDXContent as default
253
+ };
@@ -0,0 +1,47 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { F as FeatureHighlights, M as MousePointer, K as KeyPointsList } from "./index.js";
3
+ import "react";
4
+ import { S as ShoppingCart } from "./shopping-cart.js";
5
+ function _createMdxContent(props) {
6
+ return jsxs(Fragment, {
7
+ children: [jsx(FeatureHighlights, {
8
+ cardTitle: "Two Ways to View Revenue Timing",
9
+ cardDescription: "The attribution window toggle on the Transactions and Channels tabs lets you choose whether revenue is grouped by when the ad was clicked or when the purchase actually happened.",
10
+ cardIcon: MousePointer,
11
+ columns: 2,
12
+ highlights: [{
13
+ icon: MousePointer,
14
+ title: "Click-Based",
15
+ description: "Revenue is counted in the time period when the ad was clicked"
16
+ }, {
17
+ icon: ShoppingCart,
18
+ title: "Transaction-Based",
19
+ description: "Revenue is counted in the time period when the purchase occurred"
20
+ }]
21
+ }), "\n", jsx(KeyPointsList, {
22
+ title: "When each view is most useful",
23
+ points: [{
24
+ text: "Click-based is best for evaluating campaign performance: it shows how much revenue a campaign generated based on when customers engaged with it, even if they took days or weeks to buy"
25
+ }, {
26
+ text: "Transaction-based is best for financial reporting: it matches revenue to the calendar period it was actually received, regardless of when the original ad click happened"
27
+ }, {
28
+ text: "Click-based totals will differ from transaction-based totals because some purchases made today were driven by ad clicks that happened in a previous date range"
29
+ }, {
30
+ text: "If you're comparing your dashboard revenue to your actual sales records, use transaction-based — it lines up with when money actually changed hands"
31
+ }],
32
+ variant: "highlighted"
33
+ })]
34
+ });
35
+ }
36
+ function MDXContent(props = {}) {
37
+ const { wrapper: MDXLayout } = props.components || {};
38
+ return MDXLayout ? jsx(MDXLayout, {
39
+ ...props,
40
+ children: jsx(_createMdxContent, {
41
+ ...props
42
+ })
43
+ }) : _createMdxContent();
44
+ }
45
+ export {
46
+ MDXContent as default
47
+ };
@@ -0,0 +1,46 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { P as ProcessSteps, L as Link } from "./index.js";
3
+ import "react";
4
+ function _createMdxContent(props) {
5
+ return jsx(ProcessSteps, {
6
+ title: "How to Connect Your Google Ads Account",
7
+ icon: Link,
8
+ steps: [{
9
+ number: 1,
10
+ title: "Open your dashboard settings",
11
+ description: "Click the settings icon in the top right of your dashboard to open the account settings panel."
12
+ }, {
13
+ number: 2,
14
+ title: "Select Google Ads",
15
+ description: 'Find the Ad Accounts section and click "Connect" next to Google Ads.'
16
+ }, {
17
+ number: 3,
18
+ title: "Sign in with Google",
19
+ description: "You'll be redirected to Google's sign-in page. Sign in with the Google account that has access to your Google Ads account."
20
+ }, {
21
+ number: 4,
22
+ title: "Grant permissions",
23
+ description: "Review and approve the requested permissions. We need read access to your campaigns, spend, and click data."
24
+ }, {
25
+ number: 5,
26
+ title: "Select your account",
27
+ description: "If you manage multiple Google Ads accounts, select the one you want to connect to this dashboard."
28
+ }, {
29
+ number: 6,
30
+ title: "Wait for data to sync",
31
+ description: "After connecting, your campaign and spend data will begin syncing. Initial data may take a few hours to appear."
32
+ }]
33
+ });
34
+ }
35
+ function MDXContent(props = {}) {
36
+ const { wrapper: MDXLayout } = props.components || {};
37
+ return MDXLayout ? jsx(MDXLayout, {
38
+ ...props,
39
+ children: jsx(_createMdxContent, {
40
+ ...props
41
+ })
42
+ }) : _createMdxContent();
43
+ }
44
+ export {
45
+ MDXContent as default
46
+ };
@@ -0,0 +1,98 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { f as createLucideIcon, P as ProcessSteps, L as Link, T as TrendingUp } 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 Database = createLucideIcon("Database", [
12
+ ["ellipse", { cx: "12", cy: "5", rx: "9", ry: "3", key: "msslwz" }],
13
+ ["path", { d: "M3 5V19A9 3 0 0 0 21 19V5", key: "1wlel7" }],
14
+ ["path", { d: "M3 12A9 3 0 0 0 21 12", key: "mv7ke4" }]
15
+ ]);
16
+ function _createMdxContent(props) {
17
+ return jsxs(Fragment, {
18
+ children: [jsx(InfoCard, {
19
+ title: "Two things we connect, not one",
20
+ description: "Connecting Meta requires both your ad account and a Meta Dataset",
21
+ icon: Database,
22
+ variant: "highlighted",
23
+ items: [{
24
+ title: "Your Meta Ads account",
25
+ description: "This gives us access to your campaign spend, impressions, and click data — the same numbers you see inside Meta Ads Manager."
26
+ }, {
27
+ title: "A Meta Dataset (formerly called a Pixel)",
28
+ description: "This is how we send your offline conversion data back to Meta. When a tracked visitor makes a purchase on your site, we report that conversion to Meta through the Dataset so Meta can accurately attribute it to the right campaign and use it to optimize your ads."
29
+ }]
30
+ }), "\n", jsx(ProcessSteps, {
31
+ title: "How to Connect Your Meta Ads Account",
32
+ icon: Link,
33
+ steps: [{
34
+ number: 1,
35
+ title: "Open your dashboard settings",
36
+ description: "Click the settings icon in the top right of your dashboard to open the account settings panel."
37
+ }, {
38
+ number: 2,
39
+ title: "Select Meta Ads",
40
+ description: 'Find the Ad Accounts section and click "Connect" next to Meta (Facebook/Instagram) Ads.'
41
+ }, {
42
+ number: 3,
43
+ title: "Sign in with Facebook",
44
+ description: "You will be redirected to Facebook's login page. Sign in with the account that has Admin access to your Business Manager. Admin access is required — advertiser-only roles cannot complete the connection."
45
+ }, {
46
+ number: 4,
47
+ title: "Grant permissions",
48
+ description: "Review and approve the requested permissions. We need access to your ad account spend, campaign data, click events, and your Meta Dataset so we can send conversion data back to Meta."
49
+ }, {
50
+ number: 5,
51
+ title: "Select your Business Manager and ad account",
52
+ description: "Choose the Business Manager and the specific ad account you want to connect. If you manage multiple accounts, select the one running the ads you want to track."
53
+ }, {
54
+ number: 6,
55
+ title: "Select or create a Meta Dataset",
56
+ description: "If your ad account already has a Dataset (formerly called a Pixel), select it from the list. If none exists, we will automatically create one for you in the next step. The Dataset is what allows Meta to receive your conversion data and attribute purchases back to the correct campaigns."
57
+ }, {
58
+ number: 7,
59
+ title: "Wait for data to sync",
60
+ description: "After connecting, your Meta campaign and spend data will begin appearing in the dashboard. Initial sync may take a few hours. Conversion data sent via the Dataset may reflect a 24-hour delay in Meta Ads Manager."
61
+ }]
62
+ }), "\n", jsx(InfoCard, {
63
+ title: "Common connection issues",
64
+ description: "What to do if the connection fails or data is not showing up",
65
+ icon: TrendingUp,
66
+ variant: "warning",
67
+ items: [{
68
+ title: "You do not see the right Business Manager",
69
+ description: "Make sure you are logged into the Facebook account that is an Admin of the Business Manager you want to connect, not just a personal ad account.",
70
+ dotColor: "amber"
71
+ }, {
72
+ title: "Permission denied error",
73
+ description: "Your Facebook account must have Admin role on the Business Manager. Advertiser access is not sufficient. Check your role in Business Manager settings and ask an Admin to complete the connection if needed.",
74
+ dotColor: "amber"
75
+ }, {
76
+ title: "No Dataset found and automatic creation failed",
77
+ description: "If we cannot create a Dataset automatically, you can create one manually in Meta Events Manager (business.facebook.com) and then reconnect. Make sure the Dataset is owned by or shared with the same Business Manager you are connecting.",
78
+ dotColor: "amber"
79
+ }, {
80
+ title: "Data appears but is incomplete",
81
+ description: "Meta data is typically available with a 24-hour delay. If data from the past day is missing, this is normal — check back the following day.",
82
+ dotColor: "amber"
83
+ }]
84
+ })]
85
+ });
86
+ }
87
+ function MDXContent(props = {}) {
88
+ const { wrapper: MDXLayout } = props.components || {};
89
+ return MDXLayout ? jsx(MDXLayout, {
90
+ ...props,
91
+ children: jsx(_createMdxContent, {
92
+ ...props
93
+ })
94
+ }) : _createMdxContent();
95
+ }
96
+ export {
97
+ MDXContent as default
98
+ };