1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4841],{4841:(e,s,a)=>{"use strict";a.r(s),a.d(s,{default:()=>e4});var t=a(95155),n=a(68822),i=a(84980),l=a(13545),r=a(20986),d=a(90525),c=a.n(d),o=a(11618),h=a.n(o),u=a(82933),p=a(79886),m=a.n(p),_=a(36059),g=a(66669),x=a(41585),j=a(49517),y=a(72384),b=a.n(y);let N=e=>e>0&&e<10;function w({n:e}){return N(e)?(0,t.jsx)("span",{className:m().few,children:"too few to judge"}):null}let k=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}),v=e=>`CA${k.format(e)}`;function f(e,s){return s>0?e/s:e}function A(e){if(null==e||Number.isNaN(e))return"Not reported";let s=100*e;return 0===s?"0%":s<.1?"<0.1%":s<10?`${s.toFixed(1)}%`:`${Math.round(s)}%`}function $(e,s){return s?e[s.toUpperCase()]??function(e){if(!e)return"Not reported";let s=e.toLowerCase().replace(/[_.]+/g," ").trim();return s.charAt(0).toUpperCase()+s.slice(1)}(s):"Not reported"}let S={EXACT:"Exact",NEAR_EXACT:"Close to exact",PHRASE:"Phrase",NEAR_PHRASE:"Close to phrase",BROAD:"Broad"},C={ABOVE_AVERAGE:"Above average",AVERAGE:"Average",BELOW_AVERAGE:"Below average"},E={ENABLED:"Active",PAUSED:"Paused",REMOVED:"Removed"},T={BEST:"Best",GOOD:"Good",LOW:"Low",LEARNING:"Learning",PENDING:"Pending",UNRATED:"Not rated",UNKNOWN:"Not rated",UNSPECIFIED:"Not rated"},R={EXCELLENT:"Excellent",GOOD:"Good",AVERAGE:"Average",POOR:"Poor",PENDING:"Pending",NO_ADS:"No ads",UNKNOWN:"Not rated",UNSPECIFIED:"Not rated"},L={RESPONSIVE_SEARCH_AD:"Responsive search ad",EXPANDED_TEXT_AD:"Expanded text ad",RESPONSIVE_DISPLAY_AD:"Responsive display ad",CALL_AD:"Call ad",TEXT_AD:"Text ad"},G={MOBILE:"Mobile",DESKTOP:"Desktop",TABLET:"Tablet",CONNECTED_TV:"TV screens",OTHER:"Other",UNKNOWN:"Unknown"},M={GOOGLE_ADS_WEB_CLIENT:"Google Ads website",GOOGLE_ADS_MOBILE_APP:"Google Ads app",GOOGLE_ADS_EDITOR:"Google Ads Editor",GOOGLE_ADS_SCRIPTS:"A Google Ads script",GOOGLE_ADS_API:"The Google Ads API",GOOGLE_ADS_BULK_UPLOAD:"A bulk upload",GOOGLE_ADS_AUTOMATED_RULE:"An automated rule",GOOGLE_ADS_RECOMMENDATIONS:"An applied recommendation",GOOGLE_ADS_RECOMMENDATIONS_SUBSCRIPTION:"Auto-applied recommendation",SEARCH_ADS_360_SYNC:"Search Ads 360",SEARCH_ADS_360_POST:"Search Ads 360",INTERNAL_TOOL:"Google, internally",OTHER:"Other",UNKNOWN:"Unknown"},D={AD:"Ad",AD_GROUP_AD:"Ad",AD_GROUP:"Ad group",AD_GROUP_CRITERION:"Keyword or targeting",AD_GROUP_BID_MODIFIER:"Ad group bid adjustment",AD_GROUP_ASSET:"Ad group asset",CAMPAIGN:"Campaign",CAMPAIGN_BUDGET:"Budget",CAMPAIGN_CRITERION:"Campaign targeting",CAMPAIGN_ASSET:"Campaign asset",CAMPAIGN_ASSET_SET:"Campaign asset set",CUSTOMER_ASSET:"Account asset",ASSET:"Asset",ASSET_SET:"Asset set",ASSET_SET_ASSET:"Asset set item",FEED:"Feed",FEED_ITEM:"Feed item",CAMPAIGN_FEED:"Campaign feed",AD_GROUP_FEED:"Ad group feed"},O={CREATE:"Added",UPDATE:"Changed",REMOVE:"Removed"},I={cpc_bid_micros:"max CPC",effective_cpc_bid_micros:"max CPC",cpc_bid_ceiling_micros:"max CPC limit",amount_micros:"budget",status:"status",name:"name",text:"keyword text",match_type:"match type",negative:"negative keyword",final_urls:"final URL",final_url_suffix:"final URL suffix",tracking_url_template:"tracking template",url_custom_parameters:"custom URL parameters",headlines:"headlines",descriptions:"descriptions",path1:"display path",path2:"display path",bid_modifier:"bid adjustment",ad_schedule:"ad schedule",day_of_week:"ad schedule",start_hour:"ad schedule",end_hour:"ad schedule",start_minute:"ad schedule",end_minute:"ad schedule",location:"location",geo_target_constant:"location",proximity:"location radius",device:"device",language:"language",language_constant:"language",keyword:"keyword",target_spend:"bid strategy",maximize_clicks:"bid strategy",manual_cpc:"bid strategy",bidding_strategy_type:"bid strategy",network_settings:"networks",target_search_network:"search partners",target_content_network:"display network",geo_target_type_setting:"location options",positive_geo_target_type:"location options",negative_geo_target_type:"location options",start_date:"start date",end_date:"end date",resource_name:"setup",ad:"ad",asset:"asset"},P=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").toLowerCase();function B(e){if(!e)return null;let s=new Date(e.trim().replace(" ","T").replace(/(T[\d:.]+[+-]\d{2})$/,"$1:00"));return Number.isNaN(s.getTime())?null:s}async function U(e){try{if(navigator.clipboard&&window.isSecureContext)return await navigator.clipboard.writeText(e),!0}catch{}let s=document.activeElement,a=document.createElement("textarea");a.value=e,a.setAttribute("readonly",""),a.style.position="fixed",a.style.top="0",a.style.opacity="0",document.body.appendChild(a),a.select();let t=!1;try{t=document.execCommand("copy")}catch{t=!1}
1return document.body.removeChild(a),s?.focus(),t}function F({what:e,why:s,shows:a}){return(0,t.jsx)(_.E$,{what:e,why:s,shows:a,when:"Fills in after the updated Google Ads script runs for the first time."})}function H(e,s,a){return e.error&&!e.a?(0,t.jsx)(_.bc,{onRetry:e.retry}):e.a?a&&!e.a.has_v2?a:null:(0,t.jsx)(_.Xk,{rows:s,lead:!0})}function W({label:e,value:s,hint:a,quiet:n=!1}){return(0,t.jsxs)("div",{className:h().statBox,children:[(0,t.jsx)("dt",{className:h().label,children:e}),(0,t.jsxs)("dd",{className:"m-0",children:[(0,t.jsx)("p",{className:m().statValue,"data-quiet":n||void 0,children:s}),a?(0,t.jsx)("p",{className:m().statHint,children:a}):null]})]})}function V(e){let s,a=e.a,n=a?.totals,i=B(a?.last_pull),l=i?(0,j.fF)(i.toISOString(),e.now):null,r=!!i&&e.now-i.getTime()>1296e5,d=a?(0,t.jsxs)("span",{className:b().asideText,children:[a.data_through?`Data through ${(0,_.XV)(a.data_through)}`:"No data yet",l?` \xb7 imported ${l}`:""]}):null;return(0,t.jsx)(_.vm,{icon:g.A,title:"Google Ads, judged by our signups",sub:`Spend from Google, signups and buyers from our own records, not Google's Conversions column \xb7 ${e.rangeText}`,aside:d,className:e.className,children:e.error&&!a?(0,t.jsx)(_.bc,{onRetry:e.retry}):a&&n?(0,t.jsxs)(t.Fragment,{children:[r&&l?(0,t.jsxs)("p",{className:`${h().callout} mb-4`,"data-tone":"amber",children:[(0,t.jsx)(x.A,{"aria-hidden":!0,className:"h-4 w-4"}),(0,t.jsxs)("span",{children:["The last import from Google Ads was ",l,". The script runs once a day, so check it in Google Ads under Tools, Bulk actions, Scripts."]})]}):null,(0,t.jsxs)("dl",{className:b().stats,children:[(0,t.jsx)(W,{label:"Spend",value:(0,j.dR)(n.cost_usd),hint:`${(0,j.$O)(n.cost_cad)} in the account's currency`}),(0,t.jsx)(W,{label:"Clicks",value:(0,j.bu)(n.clicks),hint:null===n.ctr?`${(0,j.bu)(n.impressions)} impressions`:`${A(n.ctr)} of ${(0,j.bu)(n.impressions)} impressions`}),(0,t.jsx)(W,{label:"Average cost per click",value:null===n.cpc_usd?"No clicks":(s=n.cpc_usd,k.format(s)),quiet:null===n.cpc_usd,hint:null===n.cpc_usd?void 0:v(f(n.cpc_usd,a.usd_per_cad))}),(0,t.jsx)(W,{label:"Signups",value:(0,j.bu)(n.signups),hint:n.signups?`${(0,j.dR)(n.cost_usd/n.signups)} of spend per signup`:"None from Google Ads in this range"}),(0,t.jsx)(W,{label:"Right-audience signups",value:(0,j.bu)(n.fit_signups),hint:n.signups?`${j.vv.fit}: ${Math.round(n.fit_signups/n.signups*100)}% of signups`:j.vv.fit}),(0,t.jsx)(W,{label:"Purchases",value:(0,j.bu)(n.purchases),hint:n.purchases?`About ${(0,j.dR)(n.purchases*a.values.gp_per_purchase)} gross profit`:"First purchases by these signups"})]}),(0,t.jsx)(K,{t:n}),(0,t.jsx)(q,{d:a})]}):(0,t.jsx)("div",{className:b().stats,"aria-hidden":!0,children:Array.from({length:6}).map((e,s)=>(0,t.jsx)(j.EA,{className:"h-[88px]"},s))})})}function K({t:e}){if(!e.signups)return(0,t.jsx)("p",{className:h().note,children:"No Google Ads signups in this range, so there is nothing to trace to a keyword yet. Each one is matched to its keyword and ad as it arrives."});let s=[];return e.traced_by_click&&s.push(`${(0,j.bu)(e.traced_by_click)} by the click itself`),e.traced_by_url&&s.push(`${(0,j.bu)(e.traced_by_url)} by the keyword id in the ad link`),(0,t.jsxs)("div",{className:b().trace,children:[(0,t.jsxs)("div",{className:b().traceTop,children:[(0,t.jsxs)("span",{className:h().strong,children:["Traced ",(0,j.bu)(e.traced_signups)," of ",(0,j.bu)(e.signups)," ",(0,_.LS)(e.signups,"signup","signups")," to a keyword"]}),(0,t.jsx)("span",{className:h().muted,children:s.length?s.join(", "):"none traced yet"})]}),(0,t.jsx)(j.yP,{value:e.traced_signups/e.signups,tone:"teal",height:6}),0===e.traced_signups?(0,t.jsx)("p",{className:b().traceNote,children:"None can be traced yet. Tracing to a keyword starts once the ad links carry the keyword id and the updated Google Ads script imports clicks. Until then every signup counts in the totals above only."}):e.untraced_signups?(0,t.jsxs)("p",{className:b().traceNote,children:[(0,j.bu)(e.untraced_signups)," ",(0,_.LS)(e.untraced_signups,"signup came","signups came")," from Google Ads without a keyword we
1can match. They count in the totals above but not in the keyword rows below."]}):null]})}function q({d:e}){let s=e.totals,a=e.values,n=s.fit_signups*a.fit_signup_usd+(s.signups-s.fit_signups)*a.other_signup_usd;return(0,t.jsxs)("p",{className:h().note,children:["Our growth model values a right-audience signup at ",(0,j.dR)(a.fit_signup_usd)," and any other signup at ",(0,j.dR)(a.other_signup_usd),"."," ",s.signups?`On that basis these ${(0,j.bu)(s.signups)} ${(0,_.LS)(s.signups,"signup is","signups are")} worth about ${(0,j.dR)(n)}, against ${(0,j.dR)(s.cost_usd)} spent.`:`Nothing to set against the ${(0,j.dR)(s.cost_usd)} spent yet.`,s.signups>0&&s.signups<10?` That is ${(0,j.bu)(s.signups)} ${(0,_.LS)(s.signups,"person","people")}, too few to judge.`:""]})}var z=a(12115),X=a(66088),Y=a(35756);let Q=[{key:"spend",label:"Spend"},{key:"clicks",label:"Clicks"},{key:"value",label:"Value"}],Z={cut:{label:"Cut",tone:"red"},scale:{label:"Raise limit",tone:"teal"},hold:{label:"Hold",tone:"accent"},learning:{label:"Learning",tone:"neutral"}},J=e=>`${e.ad_group_id}:${e.criterion_id}`,ee=e=>`ads-kw-${e.ad_group_id}-${e.criterion_id}`.replace(/[^\w-]/g,"");function es(e){return[["Expected click rate",e.qs_ctr],["Ad relevance",e.qs_ad_relevance],["Landing page",e.qs_landing]]}function ea(e){return null===e.quality_score?"Not rated":`${e.quality_score}/10`}function et(e,s){return`${k.format(e)} (${v(f(e,s))})`}function en(e,s){return null===e?"no limit set":`limit ${v(f(e,s))} (${k.format(e)})`}let ei=e=>["PAUSED","REMOVED"].includes((e.status??"").toUpperCase());function el({k:e,open:s,controls:a,onToggle:n}){let i=Z[e.verdict]??Z.learning;return(0,t.jsxs)("button",{type:"button",className:b().verdictBtn,"aria-expanded":s,"aria-controls":a,title:e.verdict_reason,onClick:n,children:[(0,t.jsx)(j.vu,{tone:i.tone,children:i.label}),(0,t.jsx)("span",{className:"sr-only",children:s?", hide why":", show why"}),(0,t.jsx)(X.A,{"aria-hidden":!0,className:b().chevron,"data-open":s||void 0})]})}function er({k:e,usdPerCad:s}){let a,n=(a=[],null!==e.search_is&&a.push(`Shown on ${A(e.search_is)} of the searches it was eligible for${null!==e.search_rank_lost_is?`, and missed ${A(e.search_rank_lost_is)} because of ad rank (cap or quality)`:""}.`),null!==e.top_impr_pct&&a.push(`Above the search results ${A(e.top_impr_pct)} of the time${null!==e.abs_top_impr_pct?`, first ad ${A(e.abs_top_impr_pct)}`:""}.`),a.length?a.join(" "):null);return(0,t.jsxs)("dl",{className:b().detail,children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Why"}),(0,t.jsx)("dd",{children:e.verdict_reason})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"What to do in Google Ads"}),(0,t.jsx)("dd",{children:function(e,s){let a=e.value_per_click_usd,t=e.cpc_bid_usd;if(ei(e)){let s="REMOVED"===(e.status??"").toUpperCase();return"cut"===e.verdict?s?"Already removed in Google Ads. Nothing to change.":"Already paused in Google Ads. Leave it off.":s?"It was removed in Google Ads, so there is nothing to change here.":"It is paused in Google Ads, so nothing changes here unless you turn it back on."}switch(e.verdict){case"cut":return null!==a&&a>=.05?`Pause it in Google Ads. To keep a trickle of these searches instead, it needs a max CPC limit of ${et(a,s)} or less, which under Maximize clicks means a campaign of its own.`:"Pause it in Google Ads. Nothing it brought in so far pays for its clicks.";case"scale":if(null!==t&&null!==a&&t>=a)return`Leave its limit alone. The max CPC limit it runs under, ${et(t,s)}, is already at or above what a click is worth to us, ${et(a,s)}, so a higher limit is not what it needs.`;return`Raise the max CPC limit it runs under toward ${null!==a?et(a,s):"what a click is worth"}${null!==t?`, up from ${et(t,s)}`:""}. Under Maximize clicks that limit is set on the campaign and covers every keyword in it, so if other keywords share the campaign, move this one to a campaign of its own first. It lost ${A(e.search_rank_lost_is)} of the searches it could have shown on to ad rank, so a higher limit wins more of the same searches.`;case"hold":return null!==t&&null!==a&&t>a?`Leave it running, but the max CPC limit it runs under, ${et(t,s)}, is above what a click is worth to us, ${et(a,s)}. Lower the campaign's limit toward that if its other keywords can take it.`:"Leave it as it is and read it again next week.";default:return`Leave it running. A keyword needs 30 clicks before we judge it, and this one has ${(0,j.bu)(e.clicks)}.`}}(e,s)})]}),(0,t.jsxs)("div",{children:[(0,t.jsxs)("dt",{children:["Quality score ",ea(e)]}),(0,t.jsxs)("dd",{children:[es(e).map(([e,s])=>`${e}: ${(s?$(C,s):"Not rated").toLowerCase()}`).join(". "),"."]})]}),n?(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Where it shows"}),(0,t.jsx)("dd",{children:n})]}):null,(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Campaign and ad group"}),(0,t.jsxs)("dd",{children:[e.campaign," \xb7 ",e.ad_group,e.status&&"ENABLED"!==e.status?` \xb7 ${$(E,e.status)}`:""]})]}),e.signups>0&&e.signups<10?(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Sample size"}),(0,t.jsxs)("dd",{children:[(0,j.bu)(e.signups)," ",(0,_.LS)(e.signups,"signup","signups"),", too few to judge how many are the right audience."]})]}):null]})}function ed({clicks:e}){return e<30?(0,t.jsx)("span",{className:m().few,children:"too few to judge"}):null}function ec(e){let s,a,n,i,l,r,d,o,u,p,[g,x]=(0,z.useState)("spend"),[y,N]=(0,z.useState)(!1),[w,A]=(0,z.useState)(()=>new Set),C=H(e,8,(0,t.jsx)(F,{what:"Every keyword with its clicks, spend, signups and what a click is worth to us.",why:"Says which keywords to pause, which deserve a higher max CPC limit and which to leave alone, judged by our signups and buyers.",shows:["Keyword","Quality score","Cost per click and limit","Signups","Right audience","Value","Verdict"]})),T=(0,z.useMemo)(()=>{var s;let a;return s=e.a?.keywords??[],a=e=>"spend"===g?e.cost_usd:"clicks"===g?e.clicks:e.value_usd,[...s].sort((e,s)=>a(s)-a(e)||s.cost_usd-e.cost_usd)},[e.a,g]),R=y?T:T.slice(0,15),L=e.a?.usd_per_cad??1,G=e=>A(s=>{let a=new Set(s),t=J(e);return a.has(t)?a.delete(t):a.add(t),a}),M=e=>g===e?"descending":void 0;return(0,t.jsx)(_.vm,{icon:Y.A,title:"Keywords: keep, pause or raise the limit",sub:`Google Ads levers: pausing a keyword, or the max CPC limit it runs under \xb7 ${e.rangeText}`,aside:e.a?.has_v2&&T.length>1?(0,t.jsx)(j.$q,{id:"ads-kw-sort",label:"Sort keywords by",value:g,onChange:x,options:Q}):null,className:e.className,children:C??(0===T.length?(0,t.jsx)("p",{className:m().empty,children:"No keyword had impressions in this range. Keywords show here once their ads are shown."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("p",{className:`${m().lead} mb-4`,children:(s=e=>T.filter(s=>s.verdict===e).length,a=[],i=(n=T.filter(e=>"cut"===e.verdict&&!ei(e))).length,l=s("cut")-i,r=s("scale"),d=s("hold"),o=s("learning"),i&&a.push(`${i} to cut`),l&&a.push(`${l} that would be cut but ${1===l?"is":"are"} already paused`),r&&a.push(`${r} worth a higher limit`),d&&a.push(`${d} to hold`),o&&a.push(`${o} still learning`),u=n.reduce((e,s)=>e+s.cost_usd,0),p=`${(0,j.bu)(T.length)} ${(0,_.LS)(T.length,"keyword","keywords")}: ${a.join(", ")}.`,i?`${p} ${1===i?"The one":`The ${i}`} to cut cost ${(0,j.dR)(u)} in this range.`:p)}),(0,t.jsx)("div",{className:`${m().wide} ${h().tableBleed} ${b().kwScroll}`,children:(0,t.jsxs)("table",{className:`${c().table} ${h().table}
1 ${b().kwTable}`,children:[(0,t.jsxs)("caption",{className:"sr-only",children:["Keywords with clicks, spend, signups, value and a verdict, sorted by ",Q.find(e=>e.key===g)?.label.toLowerCase()]}),(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{scope:"col",children:"Keyword"}),(0,t.jsx)("th",{scope:"col",children:"Quality"}),(0,t.jsx)("th",{scope:"col",className:h().right,"aria-sort":M("clicks"),children:"Clicks"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Cost per click"}),(0,t.jsx)("th",{scope:"col",className:h().right,"aria-sort":M("spend"),children:"Spend"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Signups"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Right audience"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Bought"}),(0,t.jsx)("th",{scope:"col",className:h().right,"aria-sort":M("value"),children:"Value"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Can pay per click"}),(0,t.jsx)("th",{scope:"col",children:"Verdict"})]})}),(0,t.jsx)("tbody",{children:R.map(e=>{let s,a,n=w.has(J(e)),i=`${ee(e)}-t`,l=function(e){let s=es(e);if(s.every(([,e])=>!e))return"";let a=s.filter(([,e])=>"BELOW_AVERAGE"===e).map(([e])=>e.toLowerCase());if(!a.length)return"No part below average";let t=a.join(", ");return`${t.charAt(0).toUpperCase()}${t.slice(1)} below average`}(e),r=null!==e.cpc_bid_usd&&null!==e.value_per_click_usd&&e.cpc_bid_usd>e.value_per_click_usd;return(0,t.jsxs)(z.Fragment,{children:[(0,t.jsxs)("tr",{"data-verdict":e.verdict,className:n?b().openRow:void 0,children:[(0,t.jsxs)("td",{className:b().kwCell,children:[(0,t.jsx)("span",{className:b().kwText,children:e.keyword}),(0,t.jsxs)("span",{className:b().kwMeta,children:[$(S,e.match_type)," \xb7 ",e.ad_group,e.status&&"ENABLED"!==e.status?` \xb7 ${$(E,e.status)}`:""]})]}),(0,t.jsxs)("td",{className:b().qsCell,children:[(0,t.jsx)("span",{className:h().ink,children:ea(e)}),l?(0,t.jsx)("span",{className:b().small,children:l}):null]}),(0,t.jsxs)("td",{className:h().right,children:[(0,j.bu)(e.clicks),(0,t.jsx)(ed,{clicks:e.clicks})]}),(0,t.jsxs)("td",{className:h().right,children:[null===e.cpc_usd?"No clicks":(s=e.cpc_usd,k.format(s)),(0,t.jsx)("span",{className:b().small,children:en(e.cpc_bid_usd,L)})]}),(0,t.jsx)("td",{className:h().right,children:(0,j.dR)(e.cost_usd)}),(0,t.jsx)("td",{className:h().right,children:(0,j.bu)(e.signups)}),(0,t.jsx)("td",{className:h().right,children:(0,j.bu)(e.fit_signups)}),(0,t.jsx)("td",{className:`${h().right} ${e.purchases?h().strong:""}`,children:(0,j.bu)(e.purchases)}),(0,t.jsx)("td",{className:h().right,children:(0,j.dR)(e.value_usd)}),(0,t.jsx)("td",{className:h().right,children:null===e.value_per_click_usd?(0,t.jsx)("span",{className:h().muted,children:"Not yet"}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:r?h().warn:void 0,children:(a=e.value_per_click_usd,k.format(a))}),(0,t.jsx)("span",{className:b().small,children:v(f(e.value_per_click_usd,L))})]})}),(0,t.jsx)("td",{children:(0,t.jsx)(el,{k:e,open:n,controls:i,onToggle:()=>G(e)})})]}),(0,t.jsx)("tr",{id:i,hidden:!n,className:b().detailRow,children:(0,t.jsx)("td",{colSpan:11,children:(0,t.jsx)(er,{k:e,usdPerCad:L})})})]},J(e))})})]})}),(0,t.jsx)("ul",{className:m().stack,children:R.map(e=>{let s,a,n=w.has(J(e)),i=`${ee(e)}-s`;return(0,t.jsxs)("li",{className:m().stackItem,children:[(0,t.jsxs)("div",{className:b().stackHead,children:[(0,t.jsx)("p",{className:m().stackTitle,children:e.keyword}),(0,t.jsx)(el,{k:e,open:n,controls:i,onToggle:()=>G(e)})]}),(0,t.jsxs)("p",{className:m().stackMeta,children:[$(S,e.match_type)," \xb7 ",e.ad_group,e.status&&"ENABLED"!==e.status?` \xb7 ${$(E,e.status)}`:""]}),(0,t.jsxs)("dl",{className:m().pairs,children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Clicks"}),(0,t.jsxs)("dd",{children:[(0,j.bu)(e.clicks),(0,t.jsx)(ed,{clicks:e.clicks})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Cost per click"}),(0,t.jsxs)("dd",{children:[null===e.cpc_usd?"No clicks":(s=e.cpc_usd,k.format(s)),(0,t.jsx)("span",{className:b().small,children:en(e.cpc_bid_usd,L)})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Spend"}),(0,t.jsx)("dd",{children:(0,j.dR)(e.cost_usd)})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Signups, right audience"}),(0,t.jsxs)("dd",{children:[(0,j.bu)(e.signups),", ",(0,j.bu)(e.fit_signups)]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Bought"}),(0,t.jsx)("dd",{children:(0,j.bu)(e.purchases)})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Value"}),(0,t.jsx)("dd",{children:(0,j.dR)(e.value_usd)})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Can pay per
1click"}),(0,t.jsx)("dd",{children:null===e.value_per_click_usd?"Not yet":`${a=e.value_per_click_usd,k.format(a)} (${v(f(e.value_per_click_usd,L))})`})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Quality score"}),(0,t.jsx)("dd",{children:ea(e)})]})]}),(0,t.jsx)("div",{id:i,hidden:!n,className:"mt-3",children:(0,t.jsx)(er,{k:e,usdPerCad:L})})]},J(e))})}),T.length>15?(0,t.jsx)("button",{type:"button",onClick:()=>N(e=>!e),"aria-expanded":y,className:`${h().linkBtn} ${m().more}`,children:y?"Show the top 15":`Show all ${T.length} keywords`}):null,(0,t.jsxs)("p",{className:h().note,children:["Value counts each right-audience signup at ",(0,j.dR)(e.a?.values.fit_signup_usd??0)," and any other signup at"," ",(0,j.dR)(e.a?.values.other_signup_usd??0),". Can pay per click is that value divided by clicks: the most a click on this keyword can cost before it loses money on our numbers. The limit shown is the max CPC that applies, in CA$ as set in Google Ads: under Maximize clicks that is the campaignâs limit, shared by every keyword in it. Keywords are judged from ",30," clicks; below that they stay Learning. Signups are matched to keywords by the click or by the keyword id in the ad link, so untraced signups are not here. Spend and signups both count only from the first day we have Google keyword data and can trace signups to keywords, so they cover the same days. Select a verdict to see why and what to change."]})]}))})}var eo=a(61878),eh=a(94514),eu=a(67635);let ep=[{key:"add_exact",label:"Add as exact",tone:"teal",empty:"No buyer search needs its own exact keyword right now. Buyer searches with a couple of clicks and no exact keyword show here."},{key:"block",label:"Block",tone:"red",empty:"Nothing to block in this range. Searches that are clearly not buyers, or that keep getting clicks without buyer words, show here."},{key:"watch",label:"Watch",tone:"neutral",empty:"No other searches in this range."}];function em(e){let s=new Set,a=[];for(let t of e){let e=t.trim().toLowerCase();e&&!s.has(e)&&(s.add(e),a.push(t.trim()))}return a}function e_({rows:e}){return(0,t.jsx)("ul",{className:b().terms,children:e.map(e=>(0,t.jsxs)("li",{className:b().term,children:[(0,t.jsxs)("div",{className:b().termMain,children:[(0,t.jsxs)("p",{className:b().termText,children:[e.search_term,e.buyer_intent?(0,t.jsx)("span",{className:"ml-2 inline-flex align-middle",children:(0,t.jsx)(j.vu,{tone:"accent",children:"Buyer words"})}):null]}),(0,t.jsxs)("p",{className:b().termMeta,children:[e.keyword?`Matched ${e.keyword} (${$(S,e.match_type).toLowerCase()})`:"Matched keyword not reported"," \xb7 ",e.ad_group]}),(0,t.jsx)("p",{className:b().termReason,children:e.reason})]}),(0,t.jsxs)("dl",{className:b().termNums,children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Clicks"}),(0,t.jsxs)("dd",{children:[(0,j.bu)(e.clicks),e.clicks<30&&e.clicks>0?(0,t.jsx)("span",{className:"sr-only",children:", too few to judge a rate"}):null]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Spend"}),(0,t.jsx)("dd",{children:(0,j.dR)(e.cost_usd)})]})]})]},`${e.search_term}|${e.keyword}|${e.match_type}|${e.ad_group}`))})}function eg(e){let s=(0,z.useMemo)(()=>e.a?.search_terms??[],[e.a]),a=(0,z.useMemo)(()=>{let e={add_exact:[],block:[],watch:[]};for(let a of s)(e[a.suggestion]??e.watch).push(a);return e},[s]),[n,i]=(0,z.useState)(null),l=n??(a.block.length?"block":a.add_exact.length?"add_exact":"watch"),[r,d]=(0,z.useState)(!1),[c,o]=(0,z.useState)(null),[u,p]=(0,z.useState)(null),g=(0,z.useRef)(void 0),x=(0,z.useId)(),y=(0,z.useRef)(null);(0,z.useEffect)(()=>()=>clearTimeout(g.current),[]),(0,z.useEffect)(()=>{null!==u&&(y.current?.focus(),y.current?.select())},[u]);let N=(0,z.useMemo)(()=>em(a.block.map(e=>e.search_term)).map(e=>`[${e}]`),[a]),w=(0,z.useMemo)(()=>em(a.add_exact.map(e=>e.search_term)).map(e=>`[${e}]`),[a]),k=async e=>{let s="block"===e?N:w,a=s.join("\n");clearTimeout(g.current);let t=await U(a);o({list:e,ok:t,n:s.length}),p(t?null:a),t&&(g.current=setTimeout(()=>o(null),4e3))},v=H(e,8),f=a[l],A=r?f:f.slice(0,15),$=ep.find(e=>e.key===l)??ep[2],S=a.block.reduce((e,s)=>e+s.cost_usd,0);return(0,t.jsx)(_.vm,{icon:eo.A,title:"Search terms: add or block",sub:`Google Ads lever: negative keywords and new exact keywords \xb7 ${e.rangeText}`,className:e.className,children:v??(0===s.length?(0,t.jsx)("p",{className:m().empty,children:"No search terms in this range. They arrive with the daily Google Ads import."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("p",{className:`${m().lead} mb-4`,children:[N.length?`${(0,j.bu)(N.length)} ${(0,_.LS)(N.length,"search","searches")} to block, which cost ${(0,j.dR)(S)} in this range.`:"Nothing to block in this range."," ",w.length?`${(0,j.bu)(w.length)} buyer ${(0,_.LS)(w.length,"search","searches")} to add as exact keywords.`:""]}),(0,t.jsxs)("div",{className:b().termControls,children:[(0,t.jsx)(j.$q,{id:"ads-terms-group",label:"Which suggestions to show",value:l,onCh
1ange:e=>{i(e),d(!1)},options:ep.map(e=>({key:e.key,label:`${e.label} \xb7 ${a[e.key].length}`}))}),(0,t.jsxs)("div",{className:b().copyBtns,children:[(0,t.jsxs)("button",{type:"button",className:h().linkBtn,onClick:()=>void k("block"),disabled:!N.length,children:[c?.list==="block"&&c.ok?(0,t.jsx)(eh.A,{"aria-hidden":!0,className:"h-4 w-4"}):(0,t.jsx)(eu.A,{"aria-hidden":!0,className:"h-4 w-4"}),"Copy block list (",N.length,")"]}),(0,t.jsxs)("button",{type:"button",className:h().linkBtn,onClick:()=>void k("add"),disabled:!w.length,children:[c?.list==="add"&&c.ok?(0,t.jsx)(eh.A,{"aria-hidden":!0,className:"h-4 w-4"}):(0,t.jsx)(eu.A,{"aria-hidden":!0,className:"h-4 w-4"}),"Copy add list (",w.length,")"]})]})]}),(0,t.jsx)("p",{className:b().copyStatus,role:"status","aria-live":"polite",children:c?c.ok?`Copied ${(0,j.bu)(c.n)} ${(0,_.LS)(c.n,"line","lines")}. ${"block"===c.list?"Paste them in Google Ads under Keywords, Negative keywords.":"Paste them in Google Ads under Keywords, in the ad group they belong to."}`:"Couldnât copy automatically. The list is selected below: copy it by hand.":""}),null!==u?(0,t.jsxs)("div",{className:"mb-4",children:[(0,t.jsx)("label",{htmlFor:x,className:h().label,children:c?.list==="add"?"Add list":"Block list"}),(0,t.jsx)("textarea",{id:x,readOnly:!0,value:u,rows:Math.min(8,u.split("\n").length),className:b().manual,ref:y})]}):null,(0,t.jsxs)("h3",{className:b().groupHead,children:[(0,t.jsx)(j.vu,{tone:$.tone,children:$.label}),(0,t.jsxs)("span",{className:h().muted,children:[(0,j.bu)(f.length)," ",(0,_.LS)(f.length,"search","searches")]})]}),0===f.length?(0,t.jsx)("p",{className:m().empty,children:$.empty}):(0,t.jsx)(e_,{rows:A}),f.length>15?(0,t.jsx)("button",{type:"button",onClick:()=>d(e=>!e),"aria-expanded":r,className:`${h().linkBtn} ${m().more}`,children:r?"Show the top 15":`Show all ${f.length}`}):null,(0,t.jsx)("p",{className:h().note,children:"Nothing is changed in Google Ads from here. Both lists are in [brackets], which Google reads as exact match: a blocked line stops only that exact search, so a short phrase cannot also block the longer buyer searches that contain it. Buyer words are the phrases peo
1ple use when they are ready to pay. Search terms cannot be tied to signups, so these suggestions come from the words and clicks alone."})]}))})}var ex=a(37618);let ej={BEST:"teal",GOOD:"accent",LOW:"amber"},ey={EXCELLENT:"teal",GOOD:"accent",AVERAGE:"amber",POOR:"red"},eb=e=>e.enabled&&"LOW"===(e.performance_label??"").toUpperCase();function eN({title:e,rows:s}){return s.length?(0,t.jsxs)("div",{className:b().assetCol,children:[(0,t.jsxs)("h4",{className:b().assetHead,children:[e," ",(0,t.jsxs)("span",{className:h().muted,children:["\xb7 ",(0,j.bu)(s.length)]})]}),(0,t.jsx)("ul",{className:b().assets,children:s.map((e,s)=>{let a=(e.performance_label??"").toUpperCase(),n=function(e){if(!e)return null;let s=/^(HEADLINE|DESCRIPTION)_(\d+)$/i.exec(e);return s?`Pinned to ${s[1].toLowerCase()} ${s[2]}`:null}(e.pinned_field),i=eb(e);return(0,t.jsxs)("li",{className:b().asset,"data-low":i||void 0,children:[(0,t.jsx)("p",{className:b().assetText,children:e.text}),(0,t.jsxs)("div",{className:b().assetMeta,children:[(0,t.jsx)(j.vu,{tone:ej[a]??"neutral",children:$(T,e.performance_label)}),n?(0,t.jsx)(j.vu,{children:n}):null,(0,t.jsxs)("span",{className:b().assetNums,children:[(0,j.bu)(e.impressions)," ",(0,_.LS)(e.impressions,"impression","impressions"),null!==e.ctr&&e.impressions>0?` \xb7 ${A(e.ctr)} click rate`:""]})]}),i?(0,t.jsx)("p",{className:b().assetTip,children:"Google shows this one less than the others. Replace it with a line that repeats what people search for."}):null]},`${e.field_type}|${s}|${e.text}`)})})]}):null}function ew({ad:e,assets:s,open:a,onToggle:n}){let i,l=s.filter(e=>e.enabled).sort((e,s)=>s.impressions-e.impressions),r=s.length-l.length,d=l.filter(e=>"HEADLINE"===e.field_type),c=l.filter(e=>"DESCRIPTION"===e.field_type),o=l.filter(eb).length,u=(e.ad_strength??"").toUpperCase(),p=`ads-ad-${e.ad_id}`.replace(/[^\w-]/g,"");return(0,t.jsxs)("li",{className:b().ad,children:[(0,t.jsxs)("button",{type:"button",className:b().adToggle,"aria-expanded":a,"aria-controls":p,onClick:n,children:[(0,t.jsxs)("span",{className:b().adTitle,children:[(0,t.jsx)("span",{className:h().ink,children:$(L,e.type)}),(0,t.jsxs)("span",{className:h().muted,children:[" to ",function(e){if(!e)return"No final URL";try{let s=new URL(e);return"/"===s.pathname?"Home":s.pathname}catch{let s=e.split("?")[0];return"/"===s?"Home":s}}(e.final_url)]})]}),(0,t.jsxs)("span",{className:b().adChips,children:[(0,t.jsxs)(j.vu,{tone:ey[u]??"neutral",children:["Ad strength: ",((i=e.ad_strength)?$(R,i):"Not rated").toLowerCase()]}),e.status&&"ENABLED"!==e.status.toUpperCase()?(0,t.jsx)(j.vu,{children:$(E,e.status)}):null,o?(0,t.jsxs)(j.vu,{tone:"amber",children:[(0,j.bu)(o)," rated low"]}):null]}),(0,t.jsx)(X.A,{"aria-hidden":!0,className:b().chevron,"data-open":a||void 0})]}),(0,t.jsxs)("dl",{className:b().adNums,children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Impressions"}),(0,t.jsx)("dd",{children:(0,j.bu)(e.impressions)})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Clicks"}),(0,t.jsxs)("dd",{children:[(0,j.bu)(e.clicks),e.clicks<30?(0,t.jsx)("span",{className:m().few,children:"too few to judge"}):null]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Click rate"}),(0,t.jsx)("dd",{children:null===e.ctr?"No impressions":A(e.ctr)})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Spend"}),(0,t.jsx)("dd",{children:(0,j.dR)(e.cost_usd)})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Signups"}),(0,t.jsxs)("dd",{children:[(0,j.bu)(e.signups),(0,t.jsx)(w,{n:e.signups})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Right audience"}),(0,t.jsx)("dd",{children:(0,j.bu)(e.fit_signups)})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Bought"}),(0,t.jsx)("dd",{children:(0,j.bu)(e.purchases)})]})]}),(0,t.jsxs)("div",{id:p,hidden:!a,className:b().adBody,children:[l.length?(0,t.jsxs)("div",{className:b().assetCols,children:[(0,t.jsx)(eN,{title:"Headlines",rows:d}),(0,t.jsx)(eN,{title:"Descriptions",rows:c})]}):(0,t.jsx)("p",{className:m().empty,children:"Google reported no headline or description ratings for this ad."}),r?(0,t.jsxs)("p",{className:h().note,children:[(0,j.bu)(r)," removed ",(0,_.LS)(r,"line is","lines are")," left out."]}):null]})]})}function ek(e){let s,a=(0,z.useMemo)(()=>e.a?.ads??[],[e.a]),n=(0,z.useMemo)(()=>e.a?.assets??[],[e.a]),i=(0,z.useMemo)(()=>(function(e){let s=new Map;for(let a of e){let e=`${a.campaign}|${a.ad_group}`,t=s.get(e)??{name:a.ad_group,campaign:a.campaign,cost:0,ads:[]};t.cost+=a.cost_usd,t.ads.push(a),s.set(e,t)}let a=[...s.values()].sort((e,s)=>s.cost-e.cost);
1return a.forEach(e=>e.ads.sort((e,s)=>s.cost_usd-e.cost_usd||s.impressions-e.impressions)),a})(a),[a]),l=(0,z.useMemo)(()=>{let e=new Map;for(let s of n)e.set(s.ad_id,[...e.get(s.ad_id)??[],s]);return e},[n]),r=i[0]?.ads[0]?.ad_id??null,[d,c]=(0,z.useState)(()=>new Map),o=H(e,6,(0,t.jsx)(F,{what:"Every headline and description with Google's rating, next to the signups each ad brought in.",why:"Low-rated lines are the ones to replace first. Signups per ad show which copy brings the right people, not just clicks.",shows:["Ad strength","Headline","Rating","Impressions","Click rate","Signups","Right audience"]})),u=n.filter(e=>eb(e)&&"HEADLINE"===e.field_type).length,p=n.filter(e=>eb(e)&&"DESCRIPTION"===e.field_type).length,g=a.filter(e=>["POOR","AVERAGE"].includes((e.ad_strength??"").toUpperCase())&&e.status?.toUpperCase()==="ENABLED").length,x=(s=[],u&&s.push(`${(0,j.bu)(u)} ${(0,_.LS)(u,"headline","headlines")}`),p&&s.push(`${(0,j.bu)(p)} ${(0,_.LS)(p,"description","descriptions")}`),(s.length?`${s.join(" and ")} rated low by Google. Replace those first.`:"No headline or description is rated low by Google.")+(g?` ${(0,j.bu)(g)} active ${(0,_.LS)(g,"ad has","ads have")} average or poor ad strength.`:""));return(0,t.jsx)(_.vm,{icon:ex.A,title:"Ad copy",sub:"Google Ads lever: headlines and descriptions \xb7 Last 30 days, not tied to the date range above",className:e.className,children:o??(0===a.length?(0,t.jsx)("p",{className:m().empty,children:"No ads in the latest import. Ads show here once they have been live for a day."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("p",{className:`${m().lead} mb-4`,children:x}),(0,t.jsx)("div",{className:b().adGroups,children:i.map(e=>(0,t.jsxs)("section",{className:b().adGroup,"aria-label":`Ad group ${e.name}`,children:[(0,t.jsxs)("h3",{className:b().adGroupHead,children:[e.name,(0,t.jsxs)("span",{className:h().muted,children:[" ","\xb7 ",e.campaign," \xb7 ",(0,j.dR)(e.cost)," spent"]})]}),(0,t.jsx)("ul",{className:b().adList,children:e.ads.map(e=>{let s;return(0,t.jsx)(ew,{ad:e,assets:l.get(e.ad_id)??[],open:(s=e.ad_id,d.get(s)??s===r),onToggle:()=>{let s;return s=e.ad_id,c(e=>new Map(e).set(s,!(e.get(s)??s===r)))}},e.ad_id)})})]},`${e.campaign}|${e.name}`))}),(0,t.jsxs)("p",{className:h().note,children:["Ratings are Googleâs: Best, Good and Low compare each line with the others in the same ad; Learning means it has not been shown enough yet. Signups per ad count people traced to the ad by their click or by the ad id in the link, over the same 30 days. Ads with fewer than ",30," ","clicks are too new to compare."]})]}))})}let ev=(0,a(78340).A)("panels-top-left",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M9 21V9",key:"1oto5p"}]]);function ef(e){return null===e.signup_rate?"No clicks":A(e.signup_rate)}function eA({clicks:e}){return e<30?(0,t.jsx)("span",{className:m().few,children:"too few to judge"}):null}function e$(e){let[s,a]=(0,z.useState)(!1),n=H(e,5,(0,t.jsx)(F,{what:"Each page the ads send people to, with the signups and buyers it turned clicks into.",why:"Shows which final URL to point each ad at.",shows:["Page","Clicks","Spend","Signups","Signup rate","Right audience","Bought"]})),i=e.a?.landing??[],l=s?i:i.slice(0,10);return(0,t.jsx)(_.vm,{icon:ev,title:"Landing pages",sub:`Google Ads lever: the final URL of each ad \xb7 ${e.rangeText}`,className:e.className,children:n??(0===i.length?(0,t.jsx)("p",{className:m().empty,children:"No ad clicks landed on a page in this range."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("p",{className:`${m().lead} mb-4`,children:function(e){let s=e.filter(e=>e.clicks>=30&&null!==e.signup_rate);if(!s.length)return"No landing page has 30 clicks yet, so no signup rate is solid enough to compare.";let a=s.reduce((e,s)=>(s.signup_rate??0)>(e.signup_rate??0)?s:e,s[0]);if(!a.signups)return"None of the pages with 30 or more clicks has a signup yet.";let t=`${(0,_.$p)(a.landing_path)} turns the most ad clicks into signups: ${A(a.signup_rate)} of ${(0,j.bu)(a.clicks)} clicks.`;return a.signups<10?`${t} That rests on ${(0,j.bu)(a.signups)} ${(0,_.LS)(a.signups,"signup","signups")}, too few to judge.`:t}(i)}),(0,t.jsx)("div",{className:`${m().wide} ${h().tableBleed} ${m().tableScroll}`,children:(0,t.jsxs)("table",{className:`${c().table} ${h().table}`,children:[(0,t.jsx)("caption",{className:"sr-only",children:"Landing pages from Google Ads with clicks, spend, signups and buyers"}),(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{scope:"col",children:"Page"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Clicks"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Spend"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Signups"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Signup rate"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Right audience"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Bought"})]})}),(0,t.jsx)("tbody",{children:l.map(e=>(0,t.jsxs)("tr",{children:[(0,t.jsx)("td",{className:m().cellPage,children:(0,t.jsx)("span",{className:h().ink,children:(0,_.$p)(e.landing_path)})}),(0,t.jsxs)("td",{className:h().right,children:[(0,j.bu)(e.clicks),(0,t.jsx)(eA,{clicks:e.clicks})]}),(0,t.jsx)("td",{className:h().right,children:(0,j.dR)(e.cost_usd)}),(0,t.jsxs)("td",{className:h().right,children:[(0,j.bu)(e.signups),(0,t.jsx)(w,{n:e.signups})]}),(0,t.jsx)("td",{className:h().right,children:ef(e)}),(0,t.jsx)("td",{className:h().right,children:(0,j.bu)(e.fit_signups)}),(0,t.jsx)("td",{className:`${h().right} ${e.purchases?h().strong:""}`,children:(0,j.bu)(e.purchases)})]},e.landing_path))})]})}),(0,t.jsx)("ul",{className:m().stack,children:l.map(e=>(0,t.jsxs)("li",{className:m().stackItem,children:[(0,t.jsx)("p",{className:m().stackTitle,children:(0,_.$p)(e.landing_path)}),(0,t.jsxs)("dl",{className:m().pairs,children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Clicks"}),(0,t.jsxs)("dd",{children:[(0,j.bu)(e.clicks),(0,t.jsx)(eA,{clicks:e.clicks})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Spend"}),(0,t.jsx)("dd",{children:(0,j.dR)(e.cost_usd)})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Signups, rate"}),(0,t.jsxs)("dd",{children:[(0,j.bu)(e.signups),", ",ef(e),(0,t.jsx)(w,{n:e.signups})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Right audience, bought"}),(0,t.jsxs)("dd",{children:[(0,j.bu)(e.fit_signups),", ",(0,j.bu)(e.purchases)]})]})]})]},e.landing_path))}),i.length>10?(0,t.jsx)("button",{type:"button",onClick:()=>a(e=>!e),"aria-expanded":s,className:`${h().linkBtn} ${m().more}`,children:s?"Show the top 10":`Show all ${i.length} pages`}):null,(0,t.jsxs)("p",{className:h().note,children:["Clicks and spend come from Google; signups and buyers are the Google Ads signups whose first page was this one. A signup rate on fewer than ",30," clicks can swing a lot on one person."]})]}))})}var eS=a(50538);function eC(e){let[s,a]=(0,z.useState)(!1),n=H(e,6,(0,t.jsx)(F,{what:"The latest edits made in Google Ads: what changed, where, when and from which tool.",why:"When a number jumps, this says whether someone changed a cap, a keyword, an ad or a budget just before."})),i=(0,z.useMemo)(()=>e.a?.changes??[],[e.a]),l=s?i:i.slice(0,12),r=B(i[0]?.changed_at),d=(0,z.useMemo)(()=>{let e=[];for(let s of l){let a=function(e){let s=B(e);return s?new Intl.DateTimeFormat("en-US",{weekday:"short",month:"short",day:"numeric",timeZone:"America/Ne
1w_York"}).format(s):e.slice(0,10)}(s.changed_at),t=e[e.length-1];t&&t.day===a?t.items.push(s):e.push({day:a,items:[s]})}return e},[l]);return(0,t.jsx)(_.vm,{icon:eS.A,title:"Changes in Google Ads",sub:`Most recent first, Eastern time \xb7 ${e.rangeText}`,className:e.className,children:n??(0===i.length?(0,t.jsx)("p",{className:m().empty,children:"No changes in Google Ads in this range. Edits show here the day after they are made."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("p",{className:`${m().lead} mb-4`,children:[(0,j.bu)(i.length)," ",(0,_.LS)(i.length,"change","changes"),r?`, the latest ${(0,j.fF)(r.toISOString(),e.now)}`:"","."]}),(0,t.jsx)("ol",{className:b().timeline,children:d.map(e=>(0,t.jsxs)("li",{className:b().day,children:[(0,t.jsx)("p",{className:b().dayHead,children:e.day}),(0,t.jsx)("ol",{className:b().dayItems,children:e.items.map((e,s)=>{var a,n;let i,l,r,d;return(0,t.jsxs)("li",{className:b().change,children:[(0,t.jsx)("span",{"aria-hidden":!0,className:b().dot,"data-op":(e.operation??"").toLowerCase()}),(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:b().changeWhat,children:(l=$(O,(n=e).operation),r=$(D,n.resource_type).toLowerCase(),(d="UPDATE"===(n.operation??"").toUpperCase()?function(e){if(!e)return"";let s=[];for(let a of e.split(/[,\s]+/)){let e=a.split(".").filter(Boolean).map(P);if(!e.length)continue;let t=[...e].reverse().find(e=>I[e]),n=t?I[t]:e[e.length-1].replace(/_micros$/,"").replace(/_/g," ");n&&!s.includes(n)&&s.push(n)}return s.join(", ")}(n.changed_fields):"")&&d!==r?`${l} ${r}: ${d}`:`${l} ${r}`)}),(0,t.jsxs)("p",{className:b().changeMeta,children:[e.campaign&&e.ad_group?`${e.campaign} \xb7 ${e.ad_group}`:e.campaign||e.ad_group||"Whole account"," \xb7 ",(i=B(a=e.changed_at))?new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",hour:"numeric",minute:"2-digit",timeZone:"America/New_York"}).format(i):a," \xb7 ",$(M,e.client_type)]})]})]},`${e.changed_at}|${s}|${e.resource_type}`)})})]},e.day))}),i.length>12?(0,t.jsx)("button",{type:"button",onClick:()=>a(e=>!e),"aria-expanded":s,className:`${h().linkBtn} ${m().more}`,children:s?"Show the latest 12":`Show all ${i.length} changes`}):null]}))})}var eE=a(25237),eT=a(92972),eR=a(96618),eL=a(69892),eG=a(33940),eM=a(92451);let eD=e=>e.cost_usd>0&&0===e.signups;function eO(){return(0,t.jsx)(j.vu,{tone:"amber",children:"Spend, no signups"})}function eI({rows:e}){let[s,a]=(0,z.useState)(!1),n=(0,z.useId)(),i=s?e:e.slice(0,8),l=e.filter(eD),r=l.reduce((e,s)=>e+s.cost_usd,0);return(0,t.jsxs)("section",{"aria-labelledby":n,className:"min-w-0",children:[(0,t.jsx)("h3",{id:n,className:b().subHead,children:"Countries"}),0===e.length?(0,t.jsx)("p",{className:m().empty,children:"No clicks by country in this range."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("p",{className:`${b().subLead} mb-3`,children:l.length?`${(0,j.bu)(l.length)} ${(0,_.LS)(l.length,"country","countries")} took ${(0,j.dR)(r)} with no signups.`:"Every country that took spend brought at least one signup."}),(0,t.jsx)("div",{className:`${m().wide} ${h().tableBleed} ${m().tableScroll}`,children:(0,t.jsxs)("table",{className:`${c().table} ${h().table}`,children:[(0,t.jsx)("caption",{className:"sr-only",children:"Countries where people who clicked were, with clicks, spend and signups"}),(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{scope:"col",children:"Country"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Clicks"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Spend"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Signups"}),(0,t.jsx)("th",{scope:"col",className:h().right,children:"Right audience"})]})}),(0,t.jsx)("tbody",{children:i.map(e=>(0,t.jsxs)("tr",{children:[(0,t.jsxs)("td",{children:[(0,t.jsx)("span",{className:h().ink,children:e.country||"Unknown"}),eD(e)?(0,t.jsx)("span",{className:"ml-2 inline-flex align-middle",children:(0,t.jsx)(eO,{})}):null]}),(0,t.jsxs)("td",{className:h().right,children:[(0,j.bu)(e.clicks),e.clicks<30?(0,t.jsx)("span",{className:m().few,children:"too few to judge"}):null]}),(0,t.jsx)("td",{className:h().right,children:(0,j.dR)(e.cost_usd)}),(0,t.jsxs)("td",{className:h().right,children:[(0,j.bu)(e.signups),(0,t.jsx)(w,{n:e.signups})]}),(0,t.jsx)("td",{className:h().right,children:(0,j.bu)(e.fit_signups)})]},`${e.country_code??""}|${e.country}`))})]})}),(0,t.jsx)("ul",{className:m().stack,children:i.map(e=>(0,t.jsxs)("li",{className:m().stackItem,children:[(0,t.jsxs)("p",{className:m().stackTitle,children:[e.country||"Unknown",eD(e)?(0,t.jsx)("span",{className:"ml-2 inline-flex align-middle",children:(0,t.jsx)(eO,{})}):null]}),(0,t.jsxs)("dl",{className:m().pairs,children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Clicks"}),(0,t.jsxs)("dd",{children:[(0,j.bu)(e.clicks),e.clicks<30?(0,t.jsx)("span",{className:m().few,children:"too few to judge"}):null]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Spend"}),(0,t.jsx)("dd",{children:(0,j.dR)(e.cost_usd)})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:"Signups, right audience"}),(0,t.jsxs)("dd",{children:[(0,j.bu)(e.signups),", ",(0,j.bu)(e.fit_signups),(0,t.jsx)(w,{n:e.signups})]})]})]})]},`${e.country_code??""}|${e.country}`))}),e.length>8?(0,t.jsx)("button",{type:"button",onClick:()=>a(e=>!e),"aria-expanded":s,className:`${h().linkBtn} ${m().more}`,children:s?"Show the top 8":`Show all ${e.length} countries`}):null]})]})}let eP={MOBILE:eE.A,DESKTOP:eT.A,TABLET:eR.A,CONNECTED_TV:eL.A};function eB({rows:e}){let s=(0,z.useId)(),a=[...e].filter(e=>e.clicks>0||e.cost_usd>0).sort((e,s)=>s.cost_usd-e.cost_usd),n=a.reduce((e,s)=>e+s.cost_usd,0);return(0,t.jsxs)("section",{"aria-labelledby":s,className:"min-w-0",children:[(0,t.jsx)("h3",{id:s,className:b().subHead,children:"Devices"}),a.length?(0,t.jsx)("ul",{className:m().devices,children:a.map(e=>{let s=eP[e.device.toUpperCase()]??eG.A;return(0,t.jsxs)("li",{className:m().device,children:[(0,t.jsx)("span",{className:h().rowIcon,"data-tone":"neutral",children:(0,t.jsx)(s,{"aria-hidden":!0,
1className:"h-4 w-4"})}),(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsxs)("div",{className:m().deviceTop,children:[(0,t.jsx)("span",{className:m().deviceName,children:$(G,e.device)}),(0,t.jsxs)("span",{className:m().deviceFig,children:[(0,t.jsx)("strong",{children:(0,_.uM)(e.cost_usd,n)})," of spend \xb7 ",(0,j.dR)(e.cost_usd)]})]}),(0,t.jsx)(j.yP,{value:n?e.cost_usd/n:0,tone:"accent",height:6}),(0,t.jsxs)("p",{className:b().deviceLine,children:[(0,j.bu)(e.clicks)," ",(0,_.LS)(e.clicks,"click","clicks"),null!==e.ctr?`, ${A(e.ctr)} click rate`:""," \xb7 ",(0,j.bu)(e.signups)," ",(0,_.LS)(e.signups,"signup","signups"),","," ",(0,j.bu)(e.fit_signups)," right audience",e.clicks<30||N(e.signups)?" \xb7 too few to judge":""]})]})]},e.device)})}):(0,t.jsx)("p",{className:m().empty,children:"No clicks by device in this range."})]})}let eU=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],eF=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],eH=[0,3,6,9,12,15,18,21],eW=Math.round(14.285714285714285);function eV(e){let s=(e%24+24)%24;return 0===s?"12am":s<12?`${s}am`:12===s?"12pm":`${s-12}pm`}function eK(e,s){let a=Array.from({length:7},()=>Array(24).fill(0));for(let t of e)t.day_of_week>=1&&t.day_of_week<=7&&t.hour>=0&&t.hour<24&&(a[t.day_of_week-1][t.hour]+=t[s]??0);return a}let eq=e=>e.map(e=>eH.map(s=>e[s]+e[s+1]+e[s+2]));function ez(e,s){let a=0,t=-1;for(let n=0;n<e.length;n++){let i=0;for(let a=0;a<s;a++)i+=e[(n+a)%e.length];i>t&&(a=n,t=i)}return a}function eX({m:e,cost:s,view:a}){var n;let i,{steps:l,level:r}=(n=Math.max(0,...e.flat()),{steps:i=[1,2,3,4].map(e=>({l:e,lo:Math.floor(n*(e-1)/4)+1,hi:Math.floor(n*e/4)})).filter(e=>e.hi>=e.lo),level:e=>e<=0?0:i.find(s=>e>=s.lo&&e<=s.hi)?.l??4}),d="hourly"===a?1:3;return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:m().heat,"data-view":a,"aria-hidden":!0,children:[(0,t.jsx)("span",{}),eH.map(e=>(0,t.jsx)("span",{className:m().heatHead,children:eV(e)},e)),e.map((e,a)=>(0,t.jsxs)(z.Fragment,{children:[(0,t.jsx)("span",{className:m().heatDay,children:eU[a]}),e.map((e,n)=>{let i=n*d;return(0,t.jsx)("span",{className:m().cell,"data-level":r(e),title:`${eF[a]}, ${eV(i)} to ${eV(i+d)}: ${(0,j.bu)(e)} ${(0,_.LS)(e,"click","clicks")}, ${(0,j.dR)(s[a][n])}`,children:e||""},n)})]},a))]}),(0,t.jsxs)("div",{className:m().legendWrap,"data-view":a,"aria-hidden":!0,children:[(0,t.jsx)("span",{children:"hourly"===a?"Clicks per hour":"Clicks per 3 hours"}),(0,t.jsxs)("span",{className:m().legendItem,children:[(0,t.jsx)("span",{className:m().legendSwatch})," None"]}),l.map(e=>(0,t.jsxs)("span",{className:m().legendItem,children:[(0,t.jsx)("span",{className:m().legendSwatch,"data-level":e.l}),e.lo===e.hi?e.lo:`${e.lo} to ${e.hi}`]},e.l))]})]})}function eY({rows:e}){let s,a=(0,z.useId)(),n=(0,z.useMemo)(()=>eK(e,"clicks"),[e]),i=(0,z.useMemo)(()=>eK(e,"cost_usd"),[e]),l=(0,z.useMemo)(()=>eq(n),[n]),r=(0,z.useMemo)(()=>eq(i),[i]),d=n.reduce((e,s)=>e+s.reduce((e,s)=>e+s,0),0),c=i.reduce((e,s)=>e+s.reduce((e,s)=>e+s,0),0);if(d<30)s={lead:`Only ${(0,j.bu)(d)} ${(0,_.LS)(d,"click","clicks")} in this range, too few to call a pattern.`,note:"The grid still shows each one. A pattern worth scheduling around needs a few hundred clicks."};else{let e=n.map(e=>e.reduce((e,s)=>e+s,0)),a=Array.from({length:24},(e,s)=>n.reduce((e,a)=>e+a[s],0)),t=ez(e,3),l=ez(a,8),r=0,o=0;for(let e=0;e<3;e++)for(let s=0;s<8;s++)r+=n[(t+e)%7][(l+s)%24],o+=i[(t+e)%7][(l+s)%24];s={lead:`Clicks cluster ${eF[t]} to ${eF[(t+3-1)%7]}, ${eV(l)} to ${eV(l+8)}.`,note:`${(0,j.bu)(r)} of ${(0,j.bu)(d)} clicks (${(0,_.uM)(r,d)}) and ${(0,j.dR)(o)} of ${(0,j.dR)(c)} fall in that window, which is ${eW}% of the week.${d<300?` Based on ${(0,j.bu)(d)} clicks, so read it as a hint.`:""}`}}return(0,t.jsxs)("section",{"aria-labelledby":a,className:`${h().divider} min-w-0`,children:[(0,t.jsx)("h3",{id:a,className:b().subHead,children:"Day and hour"}),0===d?(0,t.jsx)("p",{className:m().empty,children:"No clicks by hour in this range."}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("p",{className:b().subLead,children:s.lead}),(0,t.jsx)("p",{className:m().leadNote,children:s.note}),(0,t.jsx)(eX,{m:n,cost:i,view:"hourly"}),(0,t.jsx)(eX,{m:l,cost:r,view:"binned"}),(0,t.jsx)("div",{className:"sr-only",children:(0,t.jsxs)("table",{children:[(0,t.jsx)("caption",{children:"Google Ads clicks by day and three-hour block, in the ad accountâs time zone"}),(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{scope:"col",children:"Day"}),eH.map(e=>(0,t.jsxs)("th",{scope:"col",children:[eV(e)," to ",eV(e+3)]},e)),(0,t.jsx)("th",{scope:"col",children:"Total"})]})}),(0,t.jsx)("tbody",{children:l.map((e,s)=>(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{scope:"row",children:eF[s]}),e.map((e,s)=>(0,t.jsx)("td",{children:e},s)),(0,t.jsx)("td",{children:e.reduce((e,s)=>e+s,0)})]},s))})]})})]})]})}function eQ(e){let s=H(e,6,(0,t.jsx)(F,{what:"Where the people who click are, what device they use, and when they click.",why:"Shows countries that take money and never sign up, devices that do not convert, and hours that could come off the ad schedule.",shows:["Country","Device","Day and hour","Clicks","Spend","Signups","Right audience"]})),a=e.a;return(0,t.jsx)(_.vm,{icon:eM.A,title:"Where and when",sub:`Google Ads levers: locations, device bid adjustments and the ad schedule \xb7 ${e.rangeText}`,className:e.className,children:s??(a?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:b().whereGrid,children:[(0,t.jsx)(eI,{rows:a.geo}),(0,t.jsx)(eB,{rows:a.devices})]}),(0,t.jsx)(eY,{rows:a.hours}),(0,t.jsx)("p",{className:h().note,children:"Countries are where the person was, not where they s
1aid they were interested in. Signups by country and device are the ones traced to a click, and spend there counts from the first day clicks were imported, so a country flagged here can still hold a signup we could not trace. Hours are in the ad accountâs time zone."})]}):null)})}let eZ=[],eJ=["7d","28d","90d","since-aug21"];function e0(){return(0,t.jsxs)("div",{className:m().banner,children:[(0,t.jsx)(n.A,{"aria-hidden":!0,className:"h-[18px] w-[18px]"}),(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:m().bannerTitle,children:"The updated Google Ads script is not installed yet."}),(0,t.jsx)("p",{className:m().bannerText,children:"Totals and search terms already work. Keywords, ad copy, landing pages, locations, devices, hours and changes fill in once the new script runs for the first time."})]})]})}let e1=[["Keywords","Which keywords to pause, which deserve a higher max CPC limit and which to leave alone, judged by our signups and buyers."],["Ad copy","Every headline and description with Googleâs rating, and the signups each ad brought in."],["Landing pages","Which page each ad should send people to."],["Where and when","Countries that take money and never sign up, device split, and clicks by day and hour."],["Changes in Google Ads","Recent edits, so a jump in the numbers can be matched to a change."]];function e2({className:e=""}){return(0,t.jsx)(_.vm,{icon:i.A,title:"Waiting for the updated Google Ads script",sub:"Fills in after its first run",className:e,children:(0,t.jsx)("dl",{className:m().waitList,children:e1.map(([e,s])=>(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:e}),(0,t.jsx)("dd",{children:s})]},e))})})}function e4(e){let{data:s,error:a,extra:n,updating:i,refresh:d}=(0,u.ZF)(`/api/admin/growth/ads?range=${e.range}`,{ping:e.ping,on:eZ}),o=eJ.includes(n.range)?n.range:e.range,p=()=>void d(),m=t=>({a:s,error:s?null:a,retry:p,rangeText:_._s[o],now:e.now,className:t});return(0,t.jsxs)("div",{"aria-busy":i,className:`transition-opacity duration-200 ${i&&s?"opacity-70":""}`,children:[a?(0,t.jsxs)("div",{role:"alert",className:`${c().error} mb-5 flex-wrap`,style:{alignItems:"center"},children:[(0,t.jsx)(l.A,{"aria-hidden":!0,className:"h-4 w-4",style:{marginTop:0}}),(0,t.jsx)("span",{className:"min-w-0 flex-1 basis-[14rem]",children:s?`Couldnât refresh Google Ads (${a}). Showing the last numbers that loaded.`:`Couldnât load the Google Ads numbers (${a}).`}),(0,t.jsxs)("button",{type:"button",onClick:p,className:c().secondary,children:[(0,t.jsx)(r.A,{"aria-hidden":!0,className:"h-4 w-4"})," Retry"]})]}):null,s&&!s.has_v2?(0,t.jsx)(e0,{}):null,s&&!s.has_v2?(0,t.jsxs)("div",{className:h().grid,children:[(0,t.jsx)(V,{...m("md:col-span-6 xl:col-span-12")}),(0,t.jsx)(eg,{...m("md:col-span-6 xl:col-span-12")}),(0,t.jsx)(e2,{className:"md:col-span-6 xl:col-span-12"})]}):(0,t.jsxs)("div",{className:h().grid,children:[(0,t.jsx)(V,{...m("md:col-span-6 xl:col-span-12")}),(0,t.jsx)(ec,{...m("md:col-span-6 xl:col-span-12")}),(0,t.jsx)(eg,{...m("md:col-span-6 xl:col-span-12")}),(0,t.jsx)(ek,{...m("md:col-span-6 xl:col-span-12")}),(0,t.jsx)(e$,{...m("md:col-span-6 xl:col-span-7")}),(0,t.jsx)(eC,{...m("md:col-span-6 xl:col-span-5")}),(0,t.jsx)(eQ,{...m("md:col-span-6 xl:col-span-12")})]})]})}},25237:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("smartphone",[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]])},33940:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("monitor-smartphone",[["path",{d:"M18 8V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h8",key:"10dyio"}],["path",{d:"M10 19v-3.96 3.15",key:"1irgej"}],["path",{d:"M7 19h5",key:"qswx4l"}],["rect",{width:"6",height:"10",x:"16",y:"12",rx:"2",key:"1egngj"}]])},35756:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("key-round",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]])},36059:(e,s,a)=>{"use strict";a.d(s,{$p:()=>N,E$:()=>E,Gj:()=>T,Kp:()=>A,LS:()=>x,VB:()=>j,XV:()=>w,Xk:()=>C,YA:()=>b,_s:()=>_,bc:()=>S,uM:()=>y,vm:()=>$,ww:()=>g});var t=a(95155),n=a(12115),i=a(13545),l=a(20986),r=a(84980),d=a(90525),c=a.n(d),o=a(11618),h=a.n(o),u=a(49517),p=a(79886),m=a.n(p);let _={"7d":"Last 7 days","28d":"Last 28 days","90d":"Last 90 days","since-aug21":"Since Aug 21"},g={1:"Residency check",2:"Tax savings",3:"Roadmap and call",4:"Plan and checkout"};function x(e,s,a){return 1===e?s:a}function j(e){return null==e||Number.isNaN(e)?"Not reported":e>0&&e<1?"<1%":`${Math.round(e)}%`}function y(e,s){return s?j(e/s*100):"None yet"}function b(e){if(e<60)return`${Math.round(e)}s`;let s=Math.floor(e/60),a=Math.round(e%60);return a?`${s}m ${a}s`:`${s}m`}function N(e){return"/"===e?"Home":e}function w(e){let s=new Date(/^\d{4}-\d{2}-\d{2}$/.test(e)?`${e}T12:00:00Z`:e);return new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",timeZone:"America/Ne
1w_York"}).format(s)}let k={cta_band:"Closing banner",included_cta:"Whatâs included button",steps_cta:"Steps button",mid_article:"Mid-article",mobilenav:"Mobile menu",feie_calc:"FEIE calculator",expat_calc:"Expat calculator",from_state:"From state"},v={cta:"button",calc:"calculator",feie:"FEIE",consult:"consultation",faq:"FAQ",us:"US"};function f(e){if(k[e])return k[e];if(u.NP[e])return u.NP[e];let s=e.split(/[_-]+/).filter(Boolean).map(e=>v[e]??e).join(" ");return s.charAt(0).toUpperCase()+s.slice(1)}function A(e){return e.startsWith("link:")?`Link to ${N(e.slice(5))}`:e.split(".").filter(Boolean).map(f).join(" \xb7 ")}function $({icon:e,title:s,sub:a,aside:i,className:l="",busy:r=!1,children:d}){let o=(0,n.useId)();return(0,t.jsxs)("section",{"aria-labelledby":o,"aria-busy":r||void 0,className:`${c().panel} ${h().card} ${l}`,children:[(0,t.jsxs)("header",{className:h().cardHead,children:[(0,t.jsx)("span",{"aria-hidden":!0,className:`${c().icon} ${h().cardIcon}`,children:(0,t.jsx)(e,{className:"h-[18px] w-[18px]",strokeWidth:1.75})}),(0,t.jsxs)("div",{className:m().titleBlock,children:[(0,t.jsx)("h2",{id:o,className:h().cardTitle,children:s}),a?(0,t.jsx)("p",{className:m().sub,children:a}):null]}),i?(0,t.jsx)("div",{className:h().cardAside,children:i}):null]}),d]})}function S({onRetry:e}){return(0,t.jsxs)("div",{className:`${c().error} flex-wrap`,style:{alignItems:"center"},children:[(0,t.jsx)(i.A,{"aria-hidden":!0,className:"h-4 w-4",style:{marginTop:0}}),(0,t.jsx)("span",{className:"min-w-0 flex-1 basis-[10rem]",children:"Couldnât load this card."}),(0,t.jsxs)("button",{type:"button",onClick:e,className:c().secondary,children:[(0,t.jsx)(l.A,{"aria-hidden":!0,className:"h-4 w-4"})," Retry"]})]})}function C({rows:e,lead:s=!1}){return(0,t.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,t.jsx)("span",{className:"sr-only",role:"status",children:"Loading"}),s?(0,t.jsx)(u.EA,{className:"mb-1 h-6 w-3/4"}):null,Array.from({length:e}).map((e,s)=>(0,t.jsx)(u.EA,{className:"h-6"},s))]})}function E({what:e,why:s,when:a,shows:n}){return(0,t.jsxs)("div",{className:m().waiting,children:[(0,t.jsx)("p",{className:m().waitingWhat,children:e}),(0,t.jsx)("p",{className:m().waitingWhy,children:s}),n?.length?(0,t.jsx)("ul",{className:m().waitingCols,"aria-label":"Columns it will show",children:n.map(e=>(0,t.jsx)("li",{children:(0,t.jsx)(u.vu,{children:e})},e))}):null,(0,t.jsxs)("p",{className:m().waitingWhen,children:[(0,t.jsx)(r.A,{"aria-hidden":!0,className:"h-4 w-4"}),a]})]})}function T(e,s,a){return e.error&&!e.b?(0,t.jsx)(S,{onRetry:e.retry}):e.b?a&&!e.collecting?a:null:(0,t.jsx)(C,{rows:s,lead:!0})}},37618:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("pen-line",[["path",{d:"M13 21h8",key:"1jsn5i"}],["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}]])},41585:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("triangle-alert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]])},50538:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("history",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]])},61878:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("search",[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]])},66088:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("chevron-down",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]])},66669:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("gauge",[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]])},67635:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]])},68822:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]])},69892:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("tv",[["path",{d:"m17 2-5 5-5-5",key:"16satq"}],["rect",{width:"20",height:"15",x:"2",y:"7",rx:"2",key:"1e6viu"}]])},72384:e=>{e.exports={asideText:"ads_asideText__Jfp9_",small:"ads_small__4jQUR",stats:"ads_stats__R4hnx",trace:"ads_trace__XWmtf",traceTop:"ads_traceTop__FpDt6",traceNote:"ads_traceNote__ZuZb8",kwScroll:"ads_kwScroll__4A5Ba",kwTable:"ads_kwTable__5P_lK",kwCell:"ads_kwCell__utwMU",kwText:"ads_kwText__d5w90",kwMeta:"ads_kwMeta__yYjR5",qsCell:"ads_qsCell__8kCfU",openRow:"ads_o
1penRow__N6Cwu",detailRow:"ads_detailRow__jTL74",verdictBtn:"ads_verdictBtn__uHPRM",adToggle:"ads_adToggle__Exal4",chevron:"ads_chevron__HVeeX",detail:"ads_detail__ulTrF",stackHead:"ads_stackHead__4WTTs",termControls:"ads_termControls__y3w_U",copyBtns:"ads_copyBtns__2zDhx",copyStatus:"ads_copyStatus__jBk1r",manual:"ads_manual__LX_23",groupHead:"ads_groupHead__PBtgs",terms:"ads_terms__8F34J",term:"ads_term__l9hRE",termMain:"ads_termMain__mYNXi",termText:"ads_termText__Bmerr",termMeta:"ads_termMeta__o8jfx",termReason:"ads_termReason__0KpJM",termNums:"ads_termNums__7Lcl_",adGroups:"ads_adGroups__5_ytV",adGroupHead:"ads_adGroupHead__oAO1C",adList:"ads_adList__hhoTA",ad:"ads_ad__vQx31",adTitle:"ads_adTitle__XI44D",adChips:"ads_adChips__OyXBI",adNums:"ads_adNums__RaLng",adBody:"ads_adBody__nzma2",assetCols:"ads_assetCols__XkS6Y",assetCol:"ads_assetCol__WtIjA",assetHead:"ads_assetHead__LfVNz",assets:"ads_assets__irmf5",asset:"ads_asset__SLovs",assetText:"ads_assetText__veLBi",assetMeta:"ads_assetMeta__DMstC",assetNums:"ads_assetNums__QoNJN",assetTip:"ads_assetTip__igsLe",whereGrid:"ads_whereGrid__599Z7",subHead:"ads_subHead__aKYrH",subLead:"ads_subLead__7Fga8",deviceLine:"ads_deviceLine__W3zHn",timeline:"ads_timeline__JyeN3",dayHead:"ads_dayHead__c3o4o",dayItems:"ads_dayItems__fQ3bM",change:"ads_change__RKisi",dot:"ads_dot__FRvmR",changeWhat:"ads_changeWhat__C51Rv",changeMeta:"ads_changeMeta__AY3bP"}},79886:e=>{e.exports={sub:"behavior_sub__bQgml",titleBlock:"behavior_titleBlock__YM_Px",banner:"behavior_banner__R90_V",bannerTitle:"behavior_bannerTitle__qXrks",bannerText:"behavior_bannerText__HjUNf",waiting:"behavior_waiting__0ZgVh",waitingWhat:"behavior_waitingWhat__k82Ym",waitingWhy:"behavior_waitingWhy__Xzmmx",waitingWhen:"behavior_waitingWhen__zDhwM",waitingCols:"behavior_waitingCols__ac75A",empty:"behavior_empty__W7hU_",waitList:"behavior_waitList__H8gwF",stats:"behavior_stats__mscff",statValue:"behavior_statValue__ysU_O",peakValue:"behavior_peakValue__gU5Gz",statHint:"behavior_statHint__E77sw",lead:"behavior_lead__9bivp",leadNote:"behavior_leadNote__Vp3Y5",heat:"behavior_heat__gbX_7",legendWrap:"behavior_legendWrap__fQW97",heatHead:"behavior_heatHead__gdEKn",heatDay:"behavior_heatDay__asPoe",cell:"behavior_cell__WLMw4",legendItem:"behavior_legendItem__dA2Fp",legendSwatch:"behavior_legendSwatch__gXKh8",plans:"behavior_plans__tGiUF",plan:"behavior_plan__JEykY",planHead:"behavior_planHead__sK43I",planName:"behavior_planName__6fpUz",stage:"behavior_stage__KFS7I",stageRate:"behavior_stageRate__Knxsr",stageLabel:"behavior_stageLabel__mM4XJ",stageNum:"behavior_stageNum__P6e1a",hop:"behavior_hop__Gqc4Q",steps:"behavior_steps__8d9Q2",stepRow:"behavior_stepRow__t2LDa",stepNum:"behavior_stepNum__Qjq_6",stepTop:"behavior_stepTop__D7_Qm",stepName:"behavior_stepName__llrlY",stepFig:"behavior_stepFig__1iIyw",tableScroll:"behavior_tableScroll__e4dJx",cellPage:"behavior_cellPage__Gc9rn",cellName:"behavior_cellName__kd_5v",meter:"behavior_meter__5NFFV",meterText:"behavior_meterText__sFsDF",few:"behavior_few__Dh_yM",worstRow:"behavior_worstRow__gtyYT",stack:"behavior_stack__QHDwf",wide:"behavior_wide__2FJE8",stackItem:"behavior_stackItem__RTfKw",stackTitle:"behavior_stackTitle__hACUp",stackMeta:"behavior_stackMeta__ixGii",pairs:"behavior_pairs__ca_Wr",more:"behavior_more__tRkVZ",deadRow:"behavior_deadRow__370cO",deadSeen:"behavior_deadSeen__pwu0W",pathCols:"behavior_pathCols__Y_tvK",pathColHead:"behavior_pathColHead__NOpKm",pathList:"behavior_pathList__tS6b3",pathItem:"behavior_pathItem__q_PSv",pathSteps:"behavior_pathSteps___EczA",pathStep:"behavior_pathStep__yPN6r",pathChip:"behavior_pathChip__96Nq7",pathArrow:"behavior_pathArrow__mvOWh",pathN:"behavior_pathN__qcfpU",defs:"behavior_defs__1KE1D",peak:"behavior_peak__S1C5Q",devices:"behavior_devices__7tm0d",device:"behavior_device__rIk2r",deviceTop:"behavior_deviceTop__Cy8nr",deviceName:"behavior_deviceName__NJ9jS",deviceFig:"behavior_deviceFig__VkmTc"}},84980:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("clock",[["path",{d:"M12 6v6l4 2",key:"mmk7yg"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]])},92451:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]])},92972:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("monitor",[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]])},94514:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]])},96618:(e,s,a)=>{"use strict";a.d(s,{A:()=>t});let t=(0,a(78340).A)("tablet",[["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",ry:"2",key:"76otgf"}],["line",{x1:"12",x2:"12.01",y1:"18",y2:"18",key:"1dp563"}]])}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.