PageSourceSearch

https://www.getstanley.ai/assets/_hq.hq.front-door-C3BwPxfT.js

js getstanley.ai collected 2026-09-29 05:53:46 UTC 31,627 bytes, 2 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/echart-BfvpeFVb.js","assets/index-DHupFTLc.js","assets/index-fCKHKw07.css"])))=>i.map(i=>d[i]);
2import{p as V,dC as U,j as e,L as K,r as f,a4 as B}from"./index-DHupFTLc.js";import{s as T,f as d}from"./pricing-readout-shared-oQl0PVmS.js";import{a as G,T as Q}from"./tooltip-BoswWmh-.js";import"./usePositioner-DastbNOU.js";const N={DROP_PTS:2,OFFER_ACCEPT_DROP_REL:.2,OFFER_ACCEPT_MIN_N:150,OFFER_ACCEPT_MIN_ACCEPTS:10},h=14,m=7,x=7,O={imessage:"iMessage",telegram:"Telegram"},Z="trial_day_14_offer_created",u=3,C=400;function M(t){const a=[...new Set(t)].sort(),n=a[0],r=a.at(-1);if(n==null||r==null)return[];const l=[];let s=n;for(;s<=r&&l.length<C;)l.push(s),s=T(s,1);return l.length<C?l:a}function L(t,a){if(a==null)return null;const n=t.findIndex(r=>r>=a);return n<=0||n>=t.length-1?null:n}function q(t){return{day:t,ratePct:null,numerator:null,denominator:null,windowDays:null,settling:!1,partial:!1}}function X(t){const a=t.series.filter(r=>r.rolling.length>0),n=M(a.flatMap(r=>r.rolling.map(l=>l.day)));return{days:n,series:a.map(r=>{const l=new Map(r.rolling.map(s=>[s.day,s]));return{channel:r.key,label:r.label,role:r.role,points:n.map(s=>{const i=l.get(s);return i==null?q(s):{day:s,ratePct:i.ratePct,numerator:i.converted,denominator:i.cohort,windowDays:i.days,settling:!1,partial:i.days<x}})}}),changeIndex:L(n,ee(t.changeDay)),postIndex:J(n,t.changeDay)}}function J(t,a){if(a==null)return null;const n=t.findIndex(r=>r>=a);return n===-1?t.length:n}function ee(t,a){return t==null?null:T(t,-14)}function te(t){const a=M(t.series.flatMap(n=>n.days.map(r=>r.day)));return{days:a,series:t.series.map(n=>{const r=new Map(n.days.map(l=>[l.day,l]));return{channel:n.channel,label:O[n.channel],role:n.role,points:a.map(l=>{const s=r.get(l);return s==null?q(l):{day:l,ratePct:s.complete?s.ratePct:null,numerator:s.accepts,denominator:s.offers,windowDays:null,settling:!s.complete,partial:!1}})}}),changeIndex:L(a,t.changeDay),postIndex:null}}function ae(t){return t.series.some(a=>a.points.some(n=>n.ratePct!=null||(n.denominator??0)>0))}function ne(t){const a=t.at(-1);if(a==null||a.ratePct==null)return null;const n=T(a.day,-x),r=T(n,-3),l=t.findLast(s=>s.day<=n&&s.day>=r&&s.ratePct!=null);return l==null||l.ratePct==null||l.ratePct<=0?null:{pct:Math.round((a.ratePct-l.ratePct)/l.ratePct*1e3)/10,spanDays:Math.round((Date.parse(`${a.day}T00:00:00Z`)-Date.parse(`${l.day}T00:00:00Z`))/864e5)}}function re(t){let a=null;for(const n of t.series){const r=n.days[0]?.day;r!=null&&(a===null||r<a)&&(a=r)}return a}const w='ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',E="#fbf8f0",S="#d8d0c3",k="#0a0a0a",v="#737373";function le({chart:t,countNoun:a,changeMarkLabel:n}){const r=t.days.map(i=>i.slice(5)),l=t.changeIndex,s=t.series.find(i=>i.role==="rule")?.channel??t.series[0]?.channel??null;return{grid:{left:0,right:10,top:38,bottom:0,containLabel:!0},legend:{top:0,left:0,type:"scroll",itemGap:16,textStyle:{color:k,fontFamily:w,fontSize:10}},tooltip:{trigger:"axis",backgroundColor:E,borderColor:S,padding:[6,10],textStyle:{color:k,fontFamily:w,fontSize:11},formatter:i=>{const c=i[0]?.dataIndex;if(c==null)return"";const $=t.days[c];if($==null)return"";const g=t.postIndex??l,y=l==null?"":g!=null&&c>=g?" · post-change":c>=l?" · spans the change":" · pre-change",b=t.series.map(_=>{const o=_.points[c],R=`${_.label} (${_.role})`;if(o==null||o.denominator==null)return`${R}: no data`;const A=`${o.numerator}/${o.denominator} ${a}`;if(o.settling)return`${R}: settling · ${A}`;const Y=o.windowDays==null?"":` over ${o.windowDays}d`,W=o.partial&&o.windowDays!=null?` · short window (${o.windowDays} of ${x}d)`:"";return`${R}: ${d(o.ratePct)} · ${A}${Y}${W}`});return[`${$}${y}`,...b].join("<br/>")}},xAxis:{type:"category",boundaryGap:!1,data:r,axisLine:{lineStyle:{color:S}},axisTick:{show:!1},axisLabel:{color:v,fontFamily:w,fontSize:10,interval:"auto",hideOverlap:!0}},yAxis:{type:"value",min:0,splitNumber:3,axisLabel:{color:v,fontFamily:w,fontSize:10,formatter:i=>`${i}%`},splitLine:{lineStyle:{color:S,type:"dotted"}}},series:t.series.map(i=>{const c=i.role==="rule",$=i.channel===s,g=i.role==="control",y=g?v:k;return{name:`${i.label} — ${i.role}`,type:"line",z:c?4:g?2:3,connectNulls:!1,showSymbol:!0,symbol:"circle",symbolSize:0,lineStyle:c?{color:y,width:2}:{color:y,width:g?2:1.5,type:"dashed"},itemStyle:{color:y},data:i.points.map(b=>b.partial&&b.ratePct!=null?{value:b.ratePct,symbolSize:8,itemStyle:{color:E,borderColor:y,borderWidth:2}}:b.ratePct),...$&&l!=null?{markLine:{silent:!0,symbol:"none",lineStyle:{color:v,width:1,type:"dashed"},label:{formatter:n,position:"end",rotate:0,distance:4,color:v,fontFamily:w,fontSize:10},data:[{xAxis:l}]}}:{}}})}}const se=f.lazy(()=>B(()=>import("./echart-BfvpeFVb.js"),__vite__mapDeps([0,1,2]))),ie="wrangler kv key delete --binding SAHASRA_KV billing:imessage_floor_cents";function Te(){const t=V(U()).data;return e.jsx(G,{children:e.jsx("div",{className:"h-screen overflow-y-auto bg-hq-paper text-neutral-950",children:e.jsxs("main",{className:"mx-auto flex min-h-full max-w-6xl flex-col gap-8 px-5 py-8 lg:px-8",children:[e.jsx(de,{report:t}),e.jsx(ce,{report:t}),t.errors.length>0&&e.jsx(he,{errors:t.errors}),e.jsx(ue,{report:t}),e.jsx(oe,{exposure:t.exposure}),e.jsx(fe,{offerAccept:t.offerAccept}),e.jsx(be,{trialPaid:t.trialPaid})]})})})}function oe({exposure:t}){return e.jsxs("section",{className:"rounded-xs border border-hq-line bg-hq-paper p-5 font-mono md:p-6",children:[e.jsxs("div",{className:"flex flex-wrap items-baseline justify-between gap-3",children:[e.jsx("div",{className:"text-caption leading-normal font-semibold uppercase tracking-[0.16em] text-neutral-500",children:"Offered under the new floor"}),e.jsx("div",{className:"text-xs leading-normal text-neutral-600",children:t.changeAt==null?t.changeAtSource:`since ${t.changeAt.slice(0,16).replace("T"," ")}Z · ${t.changeAtSource}`})]}),e.jsxs("div",{className:"mt-4 flex flex-wrap gap-x-10 gap-y-4",children:[e.jsx(j,{label:"offers made",value:t.degraded?"—":String(t.offers)}),e.jsx(j,{label:`settled (${u}d window closed)`,value:t.degraded?"—":String(t.settledOffers)}),e.jsx(j,{label:"accept rate, settled",value:d(t.settledRatePct)}),e.jsx(j,{label:"accepts in hand",value:t.degraded?"—":`${t.acceptsSoFar}${t.settledOffers<t.offers?"+":""}`}),e.jsx(j,{label:"of those, settled at the floor",value:t.degraded?"—":String(t.acceptsAtFloor)}),e.jsx(j,{label:t.degraded?"prior-floor baseline":`prior-floor baseline (${t.baselineAccepts}/${t.baselineOffers})`,value:d(t.baselineRatePct)})]}),e.jsx("p",{className:"mt-4 max-w-3xl text-xs leading-relaxed text-neutral-600",children:t.note}),e.jsxs(P,{children:[e.jsx("p",{children:"Cohorted on the OFFER, not the trial start: an offer is the moment a price was quoted, so membership here is a fact rather than an inference from a signup date. iMessage only — no other channel's floor moved."}),e.jsxs("p",{children:[e.jsx("span",{className:"text-neutral-950",children:"These are not all $29 quotes."})," ","The offer event records that a payment link was minted, never the number on it, and the floor is a minimum: a negotiation that would have settled at $49 settles at $49 either side of the change. So this population is everyone who met the new rules, most of whom the floor never bound."," ",e.jsx("span",{className:"text-neutral-950",children:"settled at the floor"})," is the subset where the amount is known — an accept that cleared at exactly $",(2900/100).toFixed(0),' — and is the closest thing here to "the minimum did the work".']}),e.jsxs("p",{children:[e.jsx("span",{className:"text-neutral-950",children:"accepts in hand"})," counts every accept already recorded, including offers whose ",u,"-day window is still open, and carries a + while any remain. It is a floor on the eventual number and never a rate. The rate above it is computed only over offers whose window has closed, against a baseline computed the same way, so the two are comparable."]}),e.jsxs("p",{children:["Measured 2026-09-25 over 30 days of settled offers, 96% of accepts land within ",u," days of the quote — the window truncates little."]})]})]})}function j({label:t,value:a}){return e.jsxs("div",{children:[e.jsx("div",{className:"text-caption uppercase tracking-[0.12em] text-neutral-500",children:t}),e.jsx("div",{className:"mt-1 text-xl font-semibold text-neutral-950",children:a})]})}function de({report:t}){return e.jsxs("header",{className:"flex flex-wrap items-end justify-between gap-4",children:[e.jsxs("div",{children:[e.jsx("div",{className:"font-mono text-caption leading-normal font-semibold uppercase tracking-[0.16em] text-neutral-500",children:"HQ / Front door"}),e.jsx("h1",{className:"mt-2 font-mono text-[28px] font-semibold tracking-normal text-neutral-950 md:text-[34px]",children:"Front door"}),e.jsxs("p",{className:"mt-2 max-w-2xl font-mono text-xs leading-relaxed text-neutral-600",children:["The iMessage negotiation floor is"," ",e.jsx("span",{className:"text-neutral-950",children:"$29"})," for every new subscription on the Linq signup rail, up from $9.99. Two rules guard it — the offer accept rate at expiry/negotiation and weekly trial→paid cohorts — and both have the same remedy: put the floor back. Trial length differs per tenant, so trial→paid is cohorted by rail and the rule reads the ",h,"-day one."]})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3 font-mono text-xs leading-normal text-neutral-600",children:[e.jsxs("div",{children:["as of ",t.at.slice(0,19)]}),e.jsx(K,{to:"/hq/lite-migration",className:"text-neutral-950 underline decoration-hq-line-strong underline-offset-4 hover:
2decoration-neutral-950",children:"Lite migration ->"})]})]})}function p({term:t,children:a}){return e.jsx(Q,{content:e.jsx("div",{className:"max-w-xs",children:a}),children:e.jsx("button",{type:"button",className:"cursor-help border-b border-dotted border-hq-line-strong text-neutral-950",children:t})})}function P({children:t}){return e.jsxs("details",{className:"group mt-4",children:[e.jsxs("summary",{className:"flex w-fit cursor-pointer list-none items-center gap-1.5 text-caption uppercase tracking-[0.12em] text-neutral-500 hover:text-neutral-950 [&::-webkit-details-marker]:hidden",children:[e.jsx("span",{className:"inline-block text-micro leading-normal text-neutral-400 transition-transform group-open:rotate-90",children:"▶"}),"How this is measured"]}),e.jsx("div",{className:"mt-2 flex max-w-3xl flex-col gap-2 text-caption leading-relaxed text-neutral-500",children:t})]})}function ce({report:t}){if(!t.configured)return e.jsxs("section",{className:"rounded-xs border border-hq-line bg-hq-paper p-5 font-mono md:p-6",children:[e.jsx("div",{className:"text-caption leading-normal font-semibold uppercase tracking-[0.16em] text-neutral-500",children:"Stop rules"}),e.jsx("div",{className:"mt-3 text-2xl font-semibold text-neutral-950",children:"Not configured"}),e.jsx("p",{className:"mt-3 max-w-3xl text-xs leading-relaxed text-neutral-600",children:"No change date is recorded, so neither rule has a split to read against and neither can trip. Everything below is pre-change baseline. Record the day the floor moved:"}),e.jsx("div",{className:"mt-2 text-xs leading-relaxed text-neutral-950",children:"wrangler kv key put --binding SAHASRA_KV hq:front_door:change_day YYYY-MM-DD"})]});const a=t.stopRules.any,n=[];return t.stopRules.offerAcceptTripped&&n.push("offer accept rate at expiry/negotiation (iMessage) fell past the registered relative drop"),t.stopRules.trialPaidTripped&&n.push(`trial→paid fell past the registered drop on two post-change iMessage weekly cohorts on the ${h}-day rail`),e.jsxs("section",{className:`rounded-xs border p-5 font-mono md:p-6 ${a?"border-rose-700 bg-rose-50":"border-hq-line bg-hq-paper"}`,children:[e.jsx("div",{className:"text-caption leading-normal font-semibold uppercase tracking-[0.16em] text-neutral-500",children:"Stop rules"}),e.jsx("div",{className:`mt-3 text-2xl font-semibold md:text-3xl ${a?"text-rose-700":"text-neutral-950"}`,children:a?"TRIPPED — revert the iMessage floor to $9.99":"No stop rule tripped"}),a?e.jsxs(e.Fragment,{children:[e.jsx("ul",{className:"mt-3 list-disc space-y-1 pl-5 text-xs leading-relaxed text-rose-700",children:n.map(r=>e.jsx("li",{children:r},r))}),e.jsxs("div",{className:"mt-3 rounded-xs border border-rose-700 px-3 py-2 text-xs leading-relaxed text-rose-700",children:[e.jsx("div",{className:"text-caption uppercase tracking-[0.12em]",children:"Revert"}),e.jsx("div",{className:"mt-1 text-neutral-950",children:ie}),e.jsx("div",{className:"mt-1",children:"Deleting the key drops new iMessage subscriptions back to the $9.99 floor on the next request."})]})]}):e.jsxs("p",{className:"mt-3 text-xs leading-relaxed text-neutral-600",children:["The offer accept rate at expiry/negotiation and weekly trial→paid are both inside their registered bounds. Split on"," ",e.jsx("span",{className:"text-neutral-950",children:t.changeDay})," (",t.changeDaySource,")."]})]})}function he({errors:t}){return e.jsxs("section",{className:"rounded-xs border border-amber-600 bg-amber-50 p-4 font-mono",children:[e.jsx("div",{className:"text-caption leading-normal font-semibold uppercase tracking-[0.16em] text-amber-700",children:"Partial read"}),e.jsx("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-xs leading-relaxed text-neutral-950",children:t.map(a=>e.jsx("li",{children:a},a))})]})}function D({title:t,hint:a=null,children:n}){return e.jsxs("section",{className:"rounded-xs border border-hq-line bg-hq-paper px-4 py-4 font-mono md:px-5",children:[e.jsxs("div",{className:"flex flex-wrap items-baseline justify-between gap-3",children:[e.jsx("h2",{className:"text-xs leading-normal font-semibold uppercase tracking-[0.14em] text-neutral-950",children:t}),a&&e.jsx("p",{className:"text-caption leading-normal uppercase tracking-[0.12em] text-neutral-500",children:a})]}),e.jsx("div",{className:"mt-3",children:n})]})}function I({tripped:t,underpowered:a=!1}){return t?e.jsx("span",{className:"rounded-xs bg-rose-700 px-2 py-0.5 text-caption font-semibold uppercase tracking-[0.12em] text-hq-paper",children:"tripped"}):a?e.jsx("span",{className:"rounded-xs border border-hq-line px-2 py-0.5 text-caption uppercase tracking-[0.12em] text-neutral-500",children:"underpowered"}):e.jsx("span",{className:"rounded-xs border border-hq-line px-2 py-0.5 text-caption uppercase tracking-[0.12em] text-neutral-600",children:"clear"})}function H({role:t,labels:a}){return e.jsx("span",{className:`rounded-xs px-1.5 py-0.5 text-caption uppercase tracking-[0.12em] ${t==="rule"?"bg-neutral-900 text-neutral-50":"border border-hq-line text-neutral-500"}`,children:a[t]})}function z({chart:t,ruleNote:a,countNoun:n,changeMarkLabel:r,emptyLabel:l,className:s="h-[220px] w-full"}){const i=f.useMemo(()=>le({chart:t,countNoun:n,changeMarkLabel:r}),[t,n,r]);return ae(t)?e.jsxs("div",{children:[e.jsx(f.Suspense,{fallback:e.jsx("div",{className:s,"aria-hidden":"true"}),children:e.jsx(se,{option:i,className:s})}),e.jsxs("p",{className:"mt-2 text-caption leading-relaxed text-neutral-500",children:["Solid ink is the rule series — ",a,". Dashed grey is the control, which never halts anything; dashed ink, where there is one, is the same channel on another trial-length rail, which halts nothing either. A break in a line is a day with nothing readable; a hollow ring is a reading pooled over a short window. Hover any day for its counts."]})]}):e.jsx("div",{className:"text-xs leading-normal text-neutral-500",children:l})}function xe(t,a){return t===0?`flat ${a}`:`${t>0?"↑":"↓"} ${Math.abs(t)}% ${a}`}function pe(t){return t===null||t===0?"text-neutral-500":t>0?"text-emerald-700":"text-rose-700"}
2function F({label:t,role:a,value:n,trendPct:r,trendLabel:l,trendUnavailableLabel:s,detail:i,as:c}){return e.jsxs("div",{className:"rounded-xs border border-hq-line px-3 py-3",children:[e.jsxs("div",{className:"flex flex-wrap items-baseline gap-2",children:[e.jsx("span",{className:"text-caption uppercase tracking-[0.12em] text-neutral-500",children:t}),e.jsx("span",{className:`text-caption uppercase tracking-[0.12em] ${a==="rule"?"text-neutral-950":"text-neutral-500"}`,children:a})]}),e.jsx("div",{className:"mt-1 text-2xl font-semibold tabular-nums text-neutral-950",children:n}),e.jsx("div",{className:`mt-1 text-caption leading-relaxed tabular-nums ${r===null?"text-neutral-500":pe(r)}`,children:r===null?s:xe(r,l)}),e.jsx("div",{className:"mt-1 text-caption leading-relaxed tabular-nums text-neutral-600",children:i}),e.jsx("div",{className:"mt-0.5 text-caption leading-relaxed text-neutral-500",children:c})]})}function ue({report:t}){return e.jsxs(D,{title:"Today",hint:"newest settled reads",children:[e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:[t.trialPaid.series.map(a=>{const n=a.rolling.at(-1),r=ne(a.rolling);return e.jsx(F,{label:`${a.label} trial→paid`,role:a.role,value:d(n?.ratePct??null),detail:n?e.jsxs(e.Fragment,{children:[n.converted,"/",n.cohort," ",e.jsxs(p,{term:"converted",children:["A Stanley-billed invoice cleared between trial start and trial end plus ",m," days."]})," ","over ",n.days,"d"]}):"no completed cohorts",trendPct:r?.pct??null,trendLabel:`vs ${r?.spanDays??x}d earlier`,trendUnavailableLabel:`no prior ${x}d window`,as:n?`${x}-day rolling to ${n.day} · ${n.phase}-change`:`${x}-day rolling`},`trial-${a.key}`)}),t.offerAccept.series.map(a=>{const n=a.last3;return e.jsx(F,{label:`${O[a.channel]} offer accept`,role:a.role,value:d(n.ratePct),detail:n.days.length>0?e.jsxs(e.Fragment,{children:[n.accepts," ",e.jsxs(p,{term:"accepted",children:["Money started — a Stanley-billed subscription opening or a positive Stanley invoice clearing — within"," ",u," days of the offer."]})," ","/ ",n.offers," ",e.jsx(p,{term:"presented",children:"The day-14 negotiation actually quoted a price. A delivered message with no payment link is not an offer."})]}):"no settled offer days",trendPct:a.relativeDropPct===null?null:-a.relativeDropPct,trendLabel:"vs prev 3d",trendUnavailableLabel:"no prior 3-day window",as:n.days.length>0?`trailing 3 settled days to ${n.days.at(-1)}`:"trailing 3 settled days"},`offer-${a.channel}`)})]}),e.jsxs("p",{className:"mt-4 max-w-3xl text-caption leading-relaxed text-neutral-500",children:["An unfinished cohort reads low, so the newest trial-start days are missing until every trial that started on them has run its course plus"," ",m," settle days — which is"," ",h+m," days on the"," ",h,"-day rail and longer on the others, each rail waiting only for itself. Acceptance is money starting, so it lags an agreed offer by up to ",u," days."]}),e.jsx("div",{className:"mt-5",children:e.jsx(me,{trialPaid:t.trialPaid})}),e.jsxs(P,{children:[e.jsxs("p",{children:["Both trial→paid readings are the ",x,"-day rolling rate at the newest"," ",e.jsxs(p,{term:"complete",children:["Every trial that started that day has finished its trial plus the"," ",m,"-day settle window."]})," ","trial-start day, pooled off the same daily rows the weekly cohorts at the bottom of the page are folded from."]}),e.jsx("p",{children:"Offer readings are the trailing three settled offer days against the three before them, per channel."})]})]})}function me({trialPaid:t}){const a=f.useMemo(()=>X(t),[t]);return e.jsxs("div",{children:[e.jsxs("div",{className:"flex flex-wrap items-baseline gap-2 text-xs leading-normal",children:[e.jsxs("span",{className:"text-neutral-950",children:["Trial→paid, ",x,"-day rolling, daily"]}),e.jsx("span",{className:"text-caption uppercase tracking-[0.12em] text-neutral-500",children:"by trial-length rail · iMessage $9.99 → $29 vs web ladder unchanged"})]}),e.jsx("div",{className:"mt-2",children:e.jsx(z,{chart:a,ruleNote:"the iMessage 14-day rail the floor change acts on",countNoun:"trials",changeMarkLabel:"$29 from here",emptyLabel:"no completed trial cohorts in the window"})})]})}function fe({offerAccept:t}){const a=t.series.find(r=>r.role==="rule"),n=f.useMemo(()=>re(t),[t]);return e.jsxs(D,{title:"Early signal — offer accept rate (expiry/negotiation)",hint:`revert the floor on a >${N.OFFER_ACCEPT_DROP_REL*100}% relative drop over 3 days (min ${N.OFFER_ACCEPT_MIN_N} offers per window, ${N.OFFER_ACCEPT_MIN_ACCEPTS} accepts in the prior one)`,children:[e.jsxs("div",{className:"flex flex-wrap items-baseline gap-3 text-xs leading-normal",children:[e.jsx(I,{tripped:t.tripped,underpowered:a?.underpowered??!0}),e.jsx("span",{className:"text-neutral-600",children:t.note})]}),e.jsx("div",{className:"mt-4",children:e.jsx(ge,{offerAccept:t})}),e.jsx("div",{className:"mt-4 flex flex-col gap-2",children:t.series.map(r=>e.jsx(ye,{series:r},r.channel))}),e.jsxs(P,{children:[e.jsxs("p",{children:[e.jsx("span",{className:"text-neutral-950",children:"Presented"})," is the day-14 negotiation actually quoting a price — the"," ",e.jsx("span",{className:"text-neutral-950",children:Z})," ","funnel step, written when that session calls"," ",e.jsx("span",{className:"text-neutral-950",children:"update_payment_link"}),'. The wider "day-14 text delivered" step is not the denominator: a message with no payment link is not an offer.'," ",e.jsx("span",{className:"text-neutral-950",children:"Accepted"})," is the tenant beginning to pay us — a Stanley-billed subscription opening or a positive Stanley invoice clearing — within ",u," days of the offer."]}),e.jsxs("p",{children:[`Nothing in Postgres records "the user said yes": the negotiation's own accept events are written to the tenant's Durable Object, which this page cannot read. So acceptance is money starting, and an offer agreed but not yet charged reads as a refusal until it settles. A day is scored once it is `,u," days old."]}),e.jsxs("p",{children:["The funnel step is unique per tenant, so a re-offer after a refusal is invisible."," ",n?`Offer days shown from ${n} — the start of the window this page reads.`:"No offer days have been recorded yet."]})]})]})}function ge({offerAccept:t}){const a=f.useMemo(()=>te(t),[t]);return e.jsxs("div",{children:[e.jsxs("div",{className:"flex flex-wrap items-baseline gap-2 text-xs leading-normal",children:[e.jsx("span",{className:"text-neutral-950",children:"Offer accept rate, daily"}),e.jsx("span",{className:"text-caption uppercase tracking-[0.12em] text-neutral-500",children:"iMessage $9.99 → $29 vs Telegram floor unchanged"})]}),e.jsx("div",{className:"mt-2",children:e.jsx(z,{chart:a,ruleNote:"the iMessage floor that moved",countNoun:"offers",changeMarkLabel:"floor $29",emptyLabel:"no offers recorded in the window"})}),e.jsxs("p",{className:"mt-1 text-caption leading-relaxed text-neutral-500",children:["The newest days plot nothing: an offer has ",u," days to be paid before its day is readable. Their counts are still in the tooltip, marked settling."]})]})}function ye({series:t}){return e.jsxs("div",{children:[e.jsxs("div",{className:"flex flex-wrap items-baseline gap-2 text-xs leading-normal",children:[e.jsx("span",{className:"text-neutral-950",children:O[t.channel]}),e.jsx(H,{role:t.role,labels:{rule:"rule — $9.99 → $29",secondary:"not the rule's rail",control:"control — floor unchanged"}}),e.jsx("span",{className:"text-neutral-600",children:t.note})]}),e.jsxs("div",{className:"mt-1 text-xs leading-normal tabular-nums text-neutral-600",children:["last3 ",t.last3.accepts,"/",t.last3.offers," ="," ",d(t.last3.ratePct)," vs prev3 ",t.prev3.accepts,"/",t.prev3.offers," = ",d(t.prev3.ratePct)," → rel drop"," ",d(t.relativeDropPct)]})]})}function be({trialPaid:t}){return e.jsxs(D,{title:"Confirmatory rule — weekly trial→paid cohorts",hint:`revert the floor on a >${N.DROP_PTS}pt drop on two post-change iMessage weekly cohorts, ${h}-day rail`,children:[e.jsxs("div",{className:"flex flex-wrap items-baseline gap-3 text-xs leading-normal",children:[e.jsx(I,{tripped:t.tripped,underpowered:t.series.find(a=>a.role==="rule")?.underpowered??!0}),e.jsx("span",{className:"text-neutral-600",children:t.note})]}),e.jsxs("p",{className:"mt-3 max-w-3xl text-caption leading-relaxed text-neutral-500",children:["Weeks marked ",e.jsx("span",{className:"text-neutral-950",children:"still in trial"})," or"," ",e.jsx("span",{className:"text-neutral-950",children:"settling"})," are shown and never scored — a cohort that has not finished always reads low. They keep their real trial count and withhold the outcome, which is not yet zero but unknown. The two differ in what is missing:"," ",e.jsx("span",{className:"text-neutral-950",children:"still in trial"})," means nobody could have converted yet, ",e.jsx("span",{className:"text-neutral-950",children:"settling"})," ","means the trials are over and the payments have not landed."]}),e.jsx("div",{className:"mt-4 flex flex-col gap-6",children:t.series.map(a=>e.jsx(je,{series:a},a.key))}),e.jsxs(P,{children:[e.jsxs("p",{children:["Cohorted on the day the tenant's"," ",e.jsx("span",{className:"text-neutral-950",children:"trial started"})," — the day they signed up, and therefore the day that decides which price they were shown — and on the"," ",e.jsx(p,{term:"rail",children:"The trial length the tenant was actually given: 14 days on the state-machine mobile onboarding, 30 otherwise, an operator stamp over both. Derived the way the product derives it (`trialEndsAtMs`)."})," ","they were given. Each rail completes on its own schedule and carries its own baseline, so the ",h,"-day majority of a day is readable ",h+m," ","days later rather than waiting on the handful of 30-day signups beside it. The rule is registered on the ",h,"-day rail: it is the bulk of new iMessage signups and the only rail the day-14 negotiation quotes the raised floor on. The other rails are real signups and real conversions, so they are drawn and tabled — and they can neither trip the rule nor hold it up."]}
2),e.jsxs("p",{children:["Web has no ",h,"-day rail to compare against: the 14-day rail IS the mobile onboarding, so every web trial runs 30 days. The control therefore answers whether conversion fell everywhere in the same period, not whether this level is normal for a 14-day trial."]}),e.jsxs("p",{children:[e.jsx("span",{className:"text-neutral-950",children:"Converted"})," means a Stanley-billed invoice cleared between trial start and trial end plus"," ",m," days — the negotiation window, so a conversion the day-14 offer earned is not scored as a failure. A week is ",e.jsx("span",{className:"text-neutral-950",children:"complete"})," once every trial in it has had that whole span."]}),e.jsx("p",{children:"The week the change landed in is excluded from both the baseline and the readings: part of its trials started under the old floor. Tenants carrying an explicit `trial_ends_at` — partner and event perks running months out — are excluded; they are on a different promise. Reaped tenants stay in the denominator, since the lifecycle reaper deletes exactly the non-converters, months later."})]})]})}function je({series:t}){const a=t.role==="rule",n=t.role==="control";return e.jsxs("div",{children:[e.jsxs("div",{className:"flex flex-wrap items-baseline gap-2 text-xs leading-normal",children:[e.jsx("span",{className:"text-neutral-950",children:t.label}),e.jsx(H,{role:t.role,labels:{rule:`rule — $9.99 → $29, ${t.railDays}-day trial`,secondary:`${t.railDays}-day trial — shown, never decisive`,control:"control — ladder unchanged"}}),e.jsx("span",{className:"text-neutral-600",children:t.note})]}),t.baseline.ratePct!=null||t.baselineRecent.ratePct!=null||t.treatmentOnset!=null?e.jsxs("div",{className:"mt-1 text-xs leading-normal text-neutral-600",children:[t.baseline.ratePct!=null?e.jsxs(e.Fragment,{children:["baseline"," ",e.jsx("span",{className:"text-neutral-950",children:d(t.baseline.ratePct)})," ","over ",t.baseline.weeks,"w"]}):e.jsx(e.Fragment,{children:"no complete pre-change week yet"}),t.baselineRecent.ratePct!=null?e.jsxs(e.Fragment,{children:[" · ","last ",t.baselineRecent.weeks,"w"," ",e.jsx("span",{className:"text-neutral-950",children:d(t.baselineRecent.ratePct)})]}):null," ",t.treatmentOnset!=null?e.jsxs(e.Fragment,{children:[" · ",e.jsxs(p,{term:`$29 from ${t.treatmentOnset.slice(5)}`,children:["Cohorts are keyed by trial START, but the floor applies at CONVERSION — ",t.railDays," days later. So the first cohort quoted $29 is the one starting ",t.treatmentOnset,", not the one starting on the change day. Weeks spanning that boundary are neither a clean baseline nor a clean reading and are excluded from both."]}),t.nextPostReadsOn!=null?` · next reading ${t.nextPostReadsOn.slice(5)}`:""]}):null," ",t.baseline.ratePct!=null&&t.baselineRecent.ratePct!=null?e.jsxs(p,{term:"scored on the pooled figure",children:["The rule was registered against the pooled baseline and still scores on it. The recent figure is shown because a series that was already trending makes the pooled one stale: post-change weeks can fall ",N.DROP_PTS,"pt below it without the floor having caused anything. Where the two disagree, a breach is a question rather than an answer — read the control before acting on it."]}):null]}):null,t.weeks.length===0?e.jsx("div",{className:"mt-3 text-xs leading-normal text-neutral-500",children:"no weekly cohorts in the window"}):e.jsxs("table",{className:"mt-3 w-full text-xs leading-normal",children:[e.jsx("thead",{className:"text-caption uppercase tracking-[0.12em] text-neutral-500",children:e.jsxs("tr",{children:[e.jsx("th",{className:"py-1 text-left font-normal",children:"trial-start week"}),e.jsx("th",{className:"py-1 text-left font-normal",children:"phase"}),e.jsx("th",{className:"py-1 text-right font-normal",children:"trials"}),e.jsx("th",{className:"py-1 text-right font-normal",children:e.jsxs(p,{term:"paid",children:["Converted: a Stanley-billed invoice cleared between trial start and trial end plus ",m," days."]})}),e.jsx("th",{className:"py-1 text-right font-normal",children:"rate"}),e.jsx("th",{className:"py-1 text-right font-normal",children:"vs baseline"})]})}),e.jsx("tbody",{className:"tabular-nums",children:t.weeks.map((r,l)=>e.jsxs(f.Fragment,{children:[l>0&&t.weeks[l-1]?.phase==="pre"&&r.phase!=="pre"?e.jsx("tr",{children:e.jsx("td",{colSpan:6,className:"pt-2 text-caption uppercase tracking-[0.12em] text-neutral-500",children:e.jsx("span",{className:"border-t border-dashed border-hq-line block pt-1",children:n?"↑ ended before the iMessage floor moved · below, spans or follows it — this ladder did not change":"↑ every trial ended at $9.99 · below, still running when the floor moved"})})}):null,e.jsxs("tr",{className:"border-t border-hq-line",children:[e.jsx("td",{className:"py-1.5 text-neutral-950",children:r.weekStart}),e.jsxs("td",{className:"py-1.5 text-neutral-500",children:[r.phase,r.pending==="in_trial"?" · still in trial":r.pending==="settling"?" · settling":r.underpowered?" · thin":""]}),e.jsx("td",{className:"py-1.5 text-right text-neutral-600",children:r.cohort}),e.jsx("td",{className:"py-1.5 text-right text-neutral-600",children:r.converted??"—"}),e.jsx("td",{className:"py-1.5 text-right text-neutral-950",children:r.scoreableOn!=null?e.jsxs("span",{className:"text-neutral-500",children:["reads ",r.scoreableOn.slice(5)]}):d(r.ratePct)}),e.jsx("td",{className:`py-1.5 text-right ${r.breached&&a?"text-rose-700":"text-neutral-600"}`,children:r.dropPts==null?"—":`${r.dropPts>0?"-":"+"}${Math.abs(r.dropPts)}pt`})]})]},r.weekStart))})]})]})}export{Te as component};

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.