1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6593],{59115:function(e,n,t){"use strict";t.d(n,{Z:function(){return o}});var s=t(11527),c=t(14343),a=t(71135),r=t.n(a);function o(e){let{eyebrow:n,rows:t=[],foot:a,delta:o,compact:l}=e;return l?(0,s.jsxs)("div",{className:r().card,children:[n?(0,s.jsx)("div",{className:r().eyebrow,children:n}):null,(0,s.jsx)("div",{className:r().compactRows,children:t.map(e=>(0,s.jsxs)("div",{className:e.ours?r().compactRowOurs:r().compactRow,children:[(0,s.jsxs)("span",{className:r().compactHead,children:[(0,s.jsx)(c.Z,{vendor:e.vendor,size:"sm"}),(0,s.jsx)("span",{className:r().compactLabel,children:e.label})]}),(0,s.jsxs)("span",{className:r().compactPrice,children:[e.price,e.unit?(0,s.jsx)("span",{className:r().rowUnit,children:e.unit}):null]})]},e.label))}),a?(0,s.jsx)("p",{className:r().foot,children:a}):null]}):(0,s.jsxs)("div",{className:r().card,children:[n?(0,s.jsx)("div",{className:r().eyebrow,children:n}):null,(0,s.jsx)("div",{className:r().rows,children:t.map(e=>(0,s.jsxs)("div",{className:e.ours?r().rowOurs:r().row,children:[(0,s.jsxs)("div",{className:r().rowHead,children:[(0,s.jsx)(c.Z,{vendor:e.vendor,size:"sm"}),(0,s.jsx)("span",{className:r().rowLabel,children:e.label})]}),(0,s.jsxs)("div",{className:r().rowPrice,children:[e.price,e.unit?(0,s.jsx)("span",{className:r().rowUnit,children:e.unit}):null]}),e.sub?(0,s.jsx)("p",{className:r().rowSub,children:e.sub}):null]},e.label))}),o?(0,s.jsx)("div",{className:r().delta,children:o}):null,a?(0,s.jsx)("p",{className:r().foot,children:a}):null]})}},5510:function(e,n,t){"use strict";t.d(n,{Z:function(){return o}});var s=t(11527),c=t(45924),a=t(51169),r=t.n(a);function o(e){let{rows:n,variant:t,paper:a,columns:o=2}=e;if(!n||!n.length)return null;let l=t||"cards";return"numbered"===l?(0,s.jsx)("ol",{className:r().steps,"data-columns":o,children:n.map((e,n)=>(0,s.jsxs)("li",{className:r().step,children:[(0,s.jsx)("span",{className:r().stepNum,"aria-hidden":"true",children:String(n+1).padStart(2,"0")}),(0,s.jsxs)("span",{className:r().stepBody,children:[(0,s.jsx)("span",{className:r().title,children:e.title}),(0,s.jsx)("span",{className:r().desc,children:e.desc})]})]},e.title))}):"chips"===l?(0,s.jsx)("div",{className:r().chipList,children:n.map(e=>(0,s.jsxs)("div",{className:r().chipRow,children:[(0,s.jsx)("span",{className:r().chip,children:e.title}),(0,s.jsx)("span",{className:r().chipDesc,children:e.desc})]},e.title))}):(0,s.jsx)("div",{className:(0,c.Z)(r().grid,"caution"===l&&r().gridCaution),"data-columns":o,children:n.map(e=>(0,s.jsxs)("div",{className:"caution"===l?r().cardCaution:r().card,children:[(0,s.jsx)("span",{className:r().rule,"aria-hidden":"true"}),(0,s.jsxs)("div",{className:r().cardHead,children:[(0,s.jsx)("span",{className:r().title,children:e.title}),e.tag?(0,s.jsx)("span",{className:r().tag,children:e.tag}):null]}),(0,s.jsx)("span",{className:r().desc,children:e.desc})]},e.title))})}},8975:function(e,n,t){"use strict";t.d(n,{Z:function(){return f}});var s=t(11527),c=t(50959),a=t(14343),r=t(79690),o=t(44257),l=t(16293),i=t(19534),d=t.n(i);let h={w:1e3,h:300,padL:58,padR:112,padT:20,padB:40,font:12.5,endLabels:!0,xTicks:6},u={w:390,h:272,padL:46,padR:14,padT:16,padB:34,font:11.5,endLabels:!1,xTicks:3};function _(e){return null==e?null:Math.round(100*e)%100!=0?"$".concat(e.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})):"$".concat(e.toLocaleString("en-US"))}function p(e){return e>=1e3?"".concat(Math.round(e/1e3),"k"):String(e)}function m(e){let{geo:n,frame:t,minContacts:c,maxContacts:a,visible:r,markerContacts:i,idPrefix:h}=e,u=n.w-n.padL-n.padR,m=n.h-n.padT-n.padB,x=e=>n.padL+(e-c)/(a-c)*u,f=e=>n.padT+m-e/t.yMax*m,v=[0,.25,.5,.75,1].map(e=>e*t.yMax),w=[];for(let e=0;e<n.xTicks;e+=1)w.push(Math.round(c+(a-c)*e/(n.xTicks-1)));let j=t.series.filter(e=>r[e.vendor]).map(e=>({...e,...function(e,n,t,s){let c=[],a="",r=null;for(let[s,o]of e){if(null==o){null!=r&&(a+=" L ".concat(n(s)," ").concat(t(r)),c.push(a),a="",r=null);continue}null==r?a="M ".concat(n(s)," ").concat(t(o)):a+=" L ".concat(n(s)," ").concat(t(r)," L ").concat(n(s)," ").concat(t(o)),r=o}return null!=r&&(a+=" L ".concat(n(s)," ").concat(t(r)),c.push(a)),{segments:c,endPrice:r}}(e.steps,x,f,a),accent:(0,o.Bf)(e.vendor).accent})),N=[];n.endLabels&&j.filter(e=>null!=e.endPrice).sort((e,n)=>
1f(e.endPrice)-f(n.endPrice)).forEach(e=>{let n=f(e.endPrice),t=N[N.length-1];t&&n-t.ly<15&&(n=t.ly+15),N.push({...e,ly:n})});let g=null!=i&&i>=c&&i<=a;return(0,s.jsxs)("svg",{className:d().svg,viewBox:"0 0 ".concat(n.w," ").concat(n.h),role:"img","aria-label":"Monthly cost from ".concat(c.toLocaleString("en-US")," to ").concat(a.toLocaleString("en-US")," contacts, 1 line per vendor. The same figures are listed under the chart."),children:[v.map(e=>(0,s.jsxs)("g",{children:[(0,s.jsx)("line",{className:0===e?d().axisLine:d().gridLine,x1:n.padL,x2:n.w-n.padR,y1:f(e),y2:f(e)}),(0,s.jsx)("text",{className:d().tickText,style:{fontSize:n.font},x:n.padL-8,y:f(e)+4,textAnchor:"end",children:0===e?"$0":_(e)})]},"y".concat(e))),w.map(e=>(0,s.jsx)("text",{className:d().tickText,style:{fontSize:n.font},x:x(e),y:n.h-n.padB+n.font+6,textAnchor:"middle",children:p(e)},"x".concat(e))),(0,s.jsx)("text",{className:d().axisTitle,style:{fontSize:n.font},x:n.padL,y:n.h-4,textAnchor:"start",children:"Contacts"}),g?(0,s.jsxs)("g",{children:[(0,s.jsx)("line",{className:d().marker,x1:x(i),x2:x(i),y1:n.padT,y2:n.padT+m}),(0,s.jsx)("text",{className:d().markerText,style:{fontSize:n.font},x:x(i),y:n.padT-6,textAnchor:"middle",children:p(i)})]}):null,j.map(e=>(0,s.jsxs)("g",{children:[e.segments.map(n=>(0,s.jsx)("path",{className:d().line,d:n,style:{stroke:e.accent}},n.slice(0,24))),g&&null!=(0,l.a8)(e,i)?(0,s.jsx)("circle",{className:d().dot,cx:x(i),cy:f((0,l.a8)(e,i)),r:4,style:{fill:e.accent}}):null]},"".concat(h,"-").concat(e.vendor))),N.map(e=>(0,s.jsx)("text",{className:d().endLabel,style:{fontSize:n.font,fill:e.accent},x:n.w-n.padR+8,y:e.ly+4,children:e.label},"lbl-".concat(e.vendor)))]})}let x="not priced here";function f(e){let{curve:n,workload:t,note:o}=e,[i,p]=(0,c.useState)({}),f=t&&t.contacts>0?t.monthlyEmailSends/t.contacts:null,v=null!=f?function(e,n){if(!Number.isFinite(n)||n<=0)return e[0];let t=e.find(e=>e>=n);return null!=t?t:e[e.length-1]}(n.multipliers,f):n.multipliers.includes(2)?2:n.multipliers[0],w=n.frames[v],j=(0,c.useMemo)(()=>{let e={};return w.series.forEach(n=>{e[n.vendor]=!i[n.vendor]}),e},[w,i]),N=w.series.filter(e=>j[e.vendor]).length,g=(0,c.useMemo)(()=>{let e={};Object.values(n.frames).forEach(n=>{n.series.forEach(n=>{let t=e[n.vendor]||"";for(let[,e]of n.steps){if(null==e)continue;let n="".concat(_(e),"/mo");n.length>t.length&&(t=n)}e[n.vendor]=t})});let t={};return Object.keys(e).forEach(n=>{t[n]=[e[n],x].filter(Boolean)}),t},[n]),b=t?t.contacts:1e4,y=null!=b&&(b<n.minContacts||b>n.maxContacts),C=e=>e.toLocaleString("en-US"),P={offRange:null!=b?"Your list of ".concat(C(b)," contacts sits outside the range this chart covers ")+"(".concat(C(n.minContacts)," to ").concat(C(n.maxContacts),"), so no position is marked on it. "):"",marker:null!=b?"The dotted line marks ".concat(C(b)," contacts, and each price beside a vendor ")+"above is that vendor at that point. ":"",basis:"The chart stays on ".concat(n.billingBasis," pricing even while the calculator below is set ")+"to ".concat(t&&t.billingBasis||"annual"," billing, so its lines are not the ")+"figures that table is showing. ",switchBack:"Switch a vendor back on above to compare it again. "},L=(e,t)=>"Lines show the monthly ".concat("annual"===n.billingBasis?"annual-billing":"list"," ")+"price at ".concat(e," email").concat(1===e?"":"s"," per contact a month")+(t?", the closest step the chart holds to the ".concat(t," you set below"):"")+". A line that stops has run past that vendorâs own published ladder; nothing here is extrapolated. ",k=null!=f&&Math.abs(f-v)>.01?String(Math.round(10*f)/10):null,S=L(v,k),R=L(n.multipliers[n.multipliers.length-1],"88.8"),H=!!(t&&t.billingBasis&&t.billingBasis!==n.billingBasis),A={live:"".concat(y?P.offRange:"").concat(null==b||y?"":P.marker)+"".concat(H?P.basis:"").concat(S)+"".concat(N<w.series.length?P.switchBack:"").concat(o||""),reserve:"".concat(P.offRange).concat(P.basis).concat(R).concat(P.switchBack).concat(o||"")};return(0,s.jsxs)("div",{className:d().wrap,children:[(0,s.jsxs)("div",{className:d().plot,children:[(0,s.jsx)("div",{className:d().desktopOnly,children:(0,s.jsx)(m,{geo:h,frame:w,minContacts:n.minContacts,maxContacts:n.maxContacts,visible:j,markerContacts:y?null:b,idPrefix:"d"})}),(0,s.jsx)("div",{className:d().mobileOnly,children:(0,s.jsx)(m,{geo:u,frame:w,minContacts:n.minContacts,maxContacts:n.maxContacts,visible:j,markerContacts:y?null:b,idPrefix:"m"})})]}),(0,s.jsx)("div",{className:d().legend,role:"group","aria-label":"Show or hide a vendor on the chart",children:w.series.map(e=>{let n=j[e.vendor],t=null==b||y?null:(0,l.a8)(e,b);return(0,s.jsxs)("button",{type:"button",className:n?d().chip:d().chipOff,"aria-pressed":n,onClick:()=>{var n;return n=e.vendor,void p(e=>{let t={...e,[n]:!e[n]},s=w.series.filter(e=>!t[e.vendor]).length;return 0===s?e:t})}
1,children:[(0,s.jsx)(a.Z,{vendor:e.vendor,size:"sm"}),(0,s.jsx)("span",{className:d().chipName,children:e.label}),(0,s.jsx)(r.Z,{as:"span",className:d().chipPrice,reserve:g[e.vendor],children:null!=t?"".concat(_(t),"/mo"):x})]},e.vendor)})}),(0,s.jsx)(r.Z,{className:d().caption,reserve:[A.reserve],children:A.live})]})}},71496:function(e,n,t){"use strict";t.d(n,{Z:function(){return l}});var s=t(11527),c=t(73358),a=t(14343),r=t(52316),o=t.n(r);function l(e){let{methodology:n,groups:t=[]}=e;return(0,s.jsxs)("div",{className:o().wrap,children:[n?(0,s.jsx)("p",{className:o().methodology,children:n}):null,(0,s.jsx)("div",{className:o().tableWrap,children:(0,s.jsxs)("table",{className:o().table,children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{scope:"col",children:(0,s.jsx)("span",{children:"Vendor"})}),(0,s.jsx)("th",{scope:"col",children:(0,s.jsx)("span",{children:"Checked"})}),(0,s.jsx)("th",{scope:"col",children:(0,s.jsx)("span",{children:"What was read, and where"})})]})}),(0,s.jsx)("tbody",{children:t.map(e=>{let n=function(e){if(!e)return null;try{return new Date(e).toLocaleDateString("en-US",{year:"numeric",month:"long",day:"numeric"})}catch(e){return null}}(e.verifiedAt),t=e.vendor||String(e.name||"").toLowerCase();return(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{scope:"row",children:(0,s.jsxs)("span",{className:o().name,children:[(0,s.jsx)(a.Z,{vendor:t,size:"sm"}),e.name]})}),(0,s.jsx)("td",{children:n?(0,s.jsx)("span",{className:o().chip,children:n}):(0,s.jsx)("span",{className:o().chipNone,children:"Not dated"})}),(0,s.jsx)("td",{children:e.sources&&e.sources.length?(0,s.jsx)("ul",{className:o().sourceList,children:e.sources.map(e=>(0,s.jsx)("li",{children:e.url?(0,s.jsx)("a",{href:e.url,target:"_blank",rel:(0,c.UK)(e.url),children:e.what}):e.what},e.what))}):(0,s.jsx)("span",{className:o().chipNone,children:"No source recorded"})})]},e.name)})})]})})]})}},16293:function(e,n,t){"use strict";t.d(n,{a8:function(){return o},li:function(){return r}});var s=t(67933),c=t(44257);let a=[1,2,4,8];function r(e){let{multipliers:n=a,billingBasis:t="monthly"}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r={};for(let a of n){let n=e.map(e=>(function(e,n,t){let a=[];for(let c=1e3;c<=5e4;c+=250){let r=(0,s.gD)(e,{contacts:c,monthlyEmailSends:c*n,billingBasis:t});a.push([c,"priced"===r.status?r.price:null])}let r=function(e){let n=[],t="start";for(let[s,c]of e)c!==t&&(n.push([s,c]),t=c);return n}(a),o=r.filter(e=>null!=e[1]);return{vendor:e.vendor,label:(0,c.Bf)(e.vendor).label||e.displayName||e.name||e.vendor,steps:r,endsAtContacts:r.length&&null==r[r.length-1][1]?r[r.length-1][0]:null,maxPrice:o.length?Math.max(...o.map(e=>e[1])):0}})(e,a,t));r[a]={yMax:function(e){if(e<=0)return 100;let n=10**Math.floor(Math.log10(e));for(let t of[1,1.25,1.5,2,2.5,3,4,5,6,8,10]){let s=n*t;if(s>=e)return s}return 10*n}(Math.max(...n.map(e=>e.maxPrice),1)),series:n}}return{minContacts:1e3,maxContacts:5e4,multipliers:n,billingBasis:t,frames:r}}function o(e,n){let t=null;for(let[s,c]of e.steps){if(s>n)break;t=c}return t}},71135:function(e){e.exports={card:"HeroAnchor_card__9bA6D",eyebrow:"HeroAnchor_eyebrow__hhB23",rows:"HeroAnchor_rows__t_DvJ",row:"HeroAnchor_row__DWV4C",rowOurs:"HeroAnchor_rowOurs__WslGj",rowHead:"HeroAnchor_rowHead__eqBg4",rowLabel:"HeroAnchor_rowLabel__MDus6",rowPrice:"HeroAnchor_rowPrice__1Vz09",rowUnit:"HeroAnchor_rowUnit__RQCzo",rowSub:"HeroAnchor_rowSub__nO7P7",compactRows:"HeroAnchor_compactRows__H_VCn",compactRow:"HeroAnchor_compactRow__tokMx",compactRowOurs:"HeroAnchor_compactRowOurs__E2t2B",compactHead:"HeroAnchor_compactHead__5_Gzw",compactLabel:"HeroAnchor_compactLabel__7IBRW",compactPrice:"HeroAnchor_compactPrice__X4wiU",delta:"HeroAnchor_delta__uxeUP",foot:"HeroAnchor_foot__pb7LY"}},51169:function(e){e.exports={grid:"InfoRows_grid__KK7gt",card:"InfoRows_card__LykM4",cardCaution:"InfoRows_cardCaution__pkl7F",rule:"InfoRows_rule__Qyhf8",cardHead:"InfoRows_cardHead__wbta_",title:"InfoRows_title__6P1hE",tag:"InfoRows_tag__DW20P",desc:"InfoRows_de
1sc__o_gNl",steps:"InfoRows_steps__tJbFf",step:"InfoRows_step__iJbnP",stepNum:"InfoRows_stepNum___zuZM",stepBody:"InfoRows_stepBody__QgDDn",chipList:"InfoRows_chipList__eDPQv",chipRow:"InfoRows_chipRow__elTOt",chip:"InfoRows_chip__DQgFc",chipDesc:"InfoRows_chipDesc__SeRB_"}},19534:function(e){e.exports={wrap:"PriceCurve_wrap__I7tAQ",plot:"PriceCurve_plot__6heXj",svg:"PriceCurve_svg__YMG_J",desktopOnly:"PriceCurve_desktopOnly__Nn7QB",mobileOnly:"PriceCurve_mobileOnly__UH98G",gridLine:"PriceCurve_gridLine__tHazC",axisLine:"PriceCurve_axisLine__SIW1n",tickText:"PriceCurve_tickText__M4843",axisTitle:"PriceCurve_axisTitle__d7Fr_",line:"PriceCurve_line__C8KoD",dot:"PriceCurve_dot__ow7x8",marker:"PriceCurve_marker__5QOSn",markerText:"PriceCurve_markerText__7CnUJ",endLabel:"PriceCurve_endLabel__b3req",legend:"PriceCurve_legend__fCKwW",chip:"PriceCurve_chip__A760z",chipOff:"PriceCurve_chipOff__rxoaQ",chipName:"PriceCurve_chipName__XPrJI",chipPrice:"PriceCurve_chipPrice__Ok32R",caption:"PriceCurve_caption__6Zy_E"}},52316:function(e){e.exports={wrap:"SourcesFooter_wrap__vYF9y",methodology:"SourcesFooter_methodology__7BvWZ",tableWrap:"SourcesFooter_tableWrap__DGEu3",table:"SourcesFooter_table__z_8jC",name:"SourcesFooter_name__fzvPI",chip:"SourcesFooter_chip__xsF5P",chipNone:"SourcesFooter_chipNone__NN_Jb",sourceList:"SourcesFooter_sourceList__SGhy5"}}}]);
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.