<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[locaihost data]]></title><description><![CDATA[locaihost data]]></description><link>https://locaihost.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6aca41bda327913bac869da3/2f6f5c29-1cdf-4bbe-bc76-1651d95fe5be.png</url><title>locaihost data</title><link>https://locaihost.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 24 Oct 2026 23:09:46 GMT</lastBuildDate><atom:link href="https://locaihost.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[A content signal: 299 transcripts from 6 B2B sales channels for $0.45, and which tools and topics they talk about]]></title><description><![CDATA[What the people who teach B2B sales on YouTube talk about, counted from the captions of their newest 50 videos: the tools and companies they name...]]></description><link>https://locaihost.hashnode.dev/a-content-signal-299-transcripts-from-6-b2b-sales-channels-for-0-45-and-which-tools-and-topics-they-talk-about</link><guid isPermaLink="true">https://locaihost.hashnode.dev/a-content-signal-299-transcripts-from-6-b2b-sales-channels-for-0-45-and-which-tools-and-topics-they-talk-about</guid><category><![CDATA[automation]]></category><category><![CDATA[api]]></category><category><![CDATA[sales]]></category><category><![CDATA[RAG ]]></category><dc:creator><![CDATA[locaihost data]]></dc:creator><pubDate>Thu, 22 Oct 2026 12:28:05 GMT</pubDate><content:encoded><![CDATA[<p><em>Originally published on <a href="https://locaihost.org/blog/content-signal-b2b-sales-youtube/">locaihost.org</a>, where the charts and data files live.</em></p>
<p>The channels a market watches are where its opinions form. Sales leaders tell each other which tools they kept and which they ripped out, founders explain their pricing, trainers decide what next year's sales calls will sound like. Almost none of it is written down. It is spoken, in hour-long episodes, and YouTube keeps a caption track for nearly every one.</p>
<p>If you market a sales tool, plan content for a B2B audience, buy sponsorships, or want to know what your buyers are hearing, that is the signal you want: in the channels your market watches, which companies get named, next to whom, and which topics each channel keeps coming back to.</p>
<p>We built it for six YouTube channels about B2B sales on 15 October 2026 with our <strong><a href="https://apify.com/locaihost/youtube-transcripts">youtube-transcripts</a></strong> Actor on Apify. It reads the captions a logged-out viewer can see, with the video's title, date, length and views, and splits each transcript into chunks with start times. Every number below is from that run. The transcripts are the creators' work, so this post publishes counts and a few short quotes with links, not the text.</p>
<h2>The signal, written as an input</h2>
<p>The six channels: <a href="https://www.youtube.com/@30MPC">30 Minutes to President's Club</a> (a sales podcast), <a href="https://www.youtube.com/@Saastr">SaaStr</a> (SaaS founders and go-to-market talks), <a href="https://www.youtube.com/@salesgravy">Sales Gravy</a> (sales training), <a href="https://www.youtube.com/@JoinPavilion">Pavilion</a> (a community for revenue leaders), <a href="https://www.youtube.com/@WinningByDesign">Winning by Design</a> (sales methodology) and <a href="https://www.youtube.com/@closecrm">Close</a> (a CRM vendor's own channel). We checked each handle first with <code>maxVideosPerChannel: 1</code>.</p>
<pre><code class="language-json">{
  "urls": ["@30MPC", "@Saastr", "@salesgravy", "@JoinPavilion", "@WinningByDesign", "@closecrm"],
  "maxVideosPerChannel": 50,
  "includeShorts": false,
  "languages": ["en"],
  "includeSegments": false,
  "chunkSize": 300,
  "chunkOverlap": 40,
  "onlyNew": true
}
</code></pre>
<p>Four notes on the fields:</p>
<ul>
<li><code>urls</code> takes channel handles or links (the newest videos), playlist links, video links or bare video IDs, mixed in one list.</li>
<li><code>includeShorts: false</code> keeps a channel's regular videos and leaves out Shorts and past live streams.</li>
<li><code>chunkSize</code> and <code>chunkOverlap</code> split each transcript into pieces of about 300 words, each with its start and end second, the next one repeating the last 40 words. That is the RAG export below, and it is also how a mention gets a timestamp.</li>
<li><code>onlyNew</code> remembers which videos it has returned for this input, so a weekly run reads, and charges for, only new uploads.</li>
</ul>
<h2>What came back</h2>
<ul>
<li><strong>299 transcripts from 300 videos in 70 seconds, for $0.45.</strong> One Winning by Design video had no captions at all; it came back as a free row saying so. At $1.50 per 1,000 transcripts plus a $0.00005 start fee, that is the price on the free or Starter plan.</li>
<li><strong>153 hours of video and 1.79 million words.</strong> 295 of the 299 transcripts are YouTube's automatic captions; 4 had captions written by the channel.</li>
<li><strong>6,968 chunks</strong> of about 300 words, each with a start time and a link that opens the video there.</li>
<li><strong>LinkedIn came up in 142 of the 299 videos, Salesforce in 89, Claude or Anthropic in 68, and ChatGPT or OpenAI in 67.</strong> Among sales tools after Salesforce: HubSpot 45, Gong 33, Clay 31.</li>
<li><strong>Ad reads change the count.</strong> Gong was named in 42 videos, but in 16 of them inside a sponsor's ad on Pavilion. Counted on the conversation only, it is 33.</li>
<li><strong>A second run with the same input, a minute later, returned no new transcripts and cost $0.00005.</strong> That is what the weekly version below relies on.</li>
</ul>
<p>The 50 newest videos cover very different periods per channel, because channels post at different rates:</p>
<table>
<thead>
<tr>
<th>Channel</th>
<th align="right">Videos</th>
<th>Oldest</th>
<th>Newest</th>
<th align="right">Median length</th>
<th align="right">Words</th>
</tr>
</thead>
<tbody><tr>
<td>30 Minutes to President's Club</td>
<td align="right">50</td>
<td>2025-12-23</td>
<td>2026-10-13</td>
<td align="right">27 min</td>
<td align="right">296,452</td>
</tr>
<tr>
<td>SaaStr</td>
<td align="right">50</td>
<td>2025-12-24</td>
<td>2026-10-09</td>
<td align="right">46 min</td>
<td align="right">487,788</td>
</tr>
<tr>
<td>Sales Gravy</td>
<td align="right">50</td>
<td>2026-06-22</td>
<td>2026-10-14</td>
<td align="right">11 min</td>
<td align="right">153,565</td>
</tr>
<tr>
<td>Pavilion</td>
<td align="right">50</td>
<td>2025-07-15</td>
<td>2026-10-01</td>
<td align="right">55 min</td>
<td align="right">457,490</td>
</tr>
<tr>
<td>Winning by Design</td>
<td align="right">49</td>
<td>2024-05-23</td>
<td>2026-09-29</td>
<td align="right">39 min</td>
<td align="right">276,878</td>
</tr>
<tr>
<td>Close</td>
<td align="right">50</td>
<td>2025-06-10</td>
<td>2026-10-13</td>
<td align="right">6 min</td>
<td align="right">113,334</td>
</tr>
</tbody></table>
<h2>Which tools and companies come up</h2>
<p>We counted names with plain text matching on the captions, case included: YouTube's captions capitalise names, so <code>Clay</code> finds the company and not the word clay. A few names come out of the captions misspelled, so we added the spellings we found ("Salesoft" for Salesloft, "Raplit" for Replit, "chat GPT"). Names that are also ordinary words or first names too often (Close, Instantly, Harvey) are left out. A video counts once per name however often it is said.</p>
<table>
<thead>
<tr>
<th>Name</th>
<th align="right">Videos (of 299)</th>
<th align="right">Mentions</th>
<th align="right">Channels</th>
<th align="right">Also in ad reads</th>
</tr>
</thead>
<tbody><tr>
<td>LinkedIn</td>
<td align="right">142</td>
<td align="right">543</td>
<td align="right">6</td>
<td align="right">0</td>
</tr>
<tr>
<td>Salesforce</td>
<td align="right">89</td>
<td align="right">902</td>
<td align="right">6</td>
<td align="right">8</td>
</tr>
<tr>
<td>Google</td>
<td align="right">83</td>
<td align="right">224</td>
<td align="right">6</td>
<td align="right">0</td>
</tr>
<tr>
<td>Slack</td>
<td align="right">72</td>
<td align="right">244</td>
<td align="right">6</td>
<td align="right">11</td>
</tr>
<tr>
<td>Claude / Anthropic</td>
<td align="right">68</td>
<td align="right">548</td>
<td align="right">5</td>
<td align="right">0</td>
</tr>
<tr>
<td>ChatGPT / OpenAI</td>
<td align="right">67</td>
<td align="right">227</td>
<td align="right">6</td>
<td align="right">0</td>
</tr>
<tr>
<td>HubSpot</td>
<td align="right">45</td>
<td align="right">177</td>
<td align="right">6</td>
<td align="right">0</td>
</tr>
<tr>
<td>Zoom</td>
<td align="right">45</td>
<td align="right">95</td>
<td align="right">6</td>
<td align="right">0</td>
</tr>
<tr>
<td>Shopify</td>
<td align="right">35</td>
<td align="right">79</td>
<td align="right">4</td>
<td align="right">0</td>
</tr>
<tr>
<td>Gong</td>
<td align="right">33</td>
<td align="right">96</td>
<td align="right">6</td>
<td align="right">16</td>
</tr>
<tr>
<td>Gemini</td>
<td align="right">32</td>
<td align="right">63</td>
<td align="right">4</td>
<td align="right">0</td>
</tr>
<tr>
<td>Clay</td>
<td align="right">31</td>
<td align="right">267</td>
<td align="right">5</td>
<td align="right">0</td>
</tr>
<tr>
<td>Replit</td>
<td align="right">31</td>
<td align="right">319</td>
<td align="right">2</td>
<td align="right">0</td>
</tr>
<tr>
<td>Microsoft</td>
<td align="right">26</td>
<td align="right">51</td>
<td align="right">5</td>
<td align="right">0</td>
</tr>
<tr>
<td>Lovable</td>
<td align="right">20</td>
<td align="right">74</td>
<td align="right">3</td>
<td align="right">0</td>
</tr>
<tr>
<td>ZoomInfo</td>
<td align="right">14</td>
<td align="right">36</td>
<td align="right">5</td>
<td align="right">0</td>
</tr>
<tr>
<td>Intercom</td>
<td align="right">14</td>
<td align="right">53</td>
<td align="right">3</td>
<td align="right">0</td>
</tr>
<tr>
<td>Cursor</td>
<td align="right">12</td>
<td align="right">22</td>
<td align="right">4</td>
<td align="right">6</td>
</tr>
<tr>
<td>Outreach</td>
<td align="right">11</td>
<td align="right">22</td>
<td align="right">4</td>
<td align="right">0</td>
</tr>
<tr>
<td>Salesloft</td>
<td align="right">11</td>
<td align="right">17</td>
<td align="right">2</td>
<td align="right">0</td>
</tr>
<tr>
<td>Apollo</td>
<td align="right">7</td>
<td align="right">16</td>
<td align="right">3</td>
<td align="right">0</td>
</tr>
</tbody></table>
<p><em>Videos and mentions are counted on the conversation, with intros, outros and ad reads taken out (next section). The last column is how many videos name it inside one of those. All 30 names and the per-channel counts are in <a href="https://locaihost.org/blog/content-signal-b2b-sales-youtube/analysis/tool-mentions.csv">tool-mentions.csv</a>.</em></p>
<p>Mentions per video tell you something the video count doesn't. Replit is named 319 times, but in only 31 videos on two channels: SaaStr talks at length about building its own apps with it. Clay is named 267 times in 31 videos, about nine mentions a video, which is what a tool people walk through on screen looks like. Zoom, with 95 mentions in 45 videos, is mostly the meeting tool named in passing.</p>
<h2>Ad reads change the count</h2>
<p>Podcasts read the same sponsor message in every episode for weeks. To keep those from counting as conversation, we set aside any run of 12 words that appears word for word in three or more videos of the same channel. That took out 20,860 words, mostly SaaStr's and Pavilion's sponsor reads and intros, and none of Winning by Design's.</p>
<p>It matters for exactly the names a sales-tool marketer cares about. On Pavilion, Gong was named inside two different sponsors' ads in 16 episodes: from November to December 2025 an ad for a customer-evidence platform listed it among its customers, and from January to April 2026 an ad for a rival call-analysis tool quoted one of its customers: <a href="https://www.youtube.com/watch?v=tG4GV8-bj6Y&amp;t=74s">"we ripped out Gong and went all in on Momentum"</a>. Ramp, listed as a customer in two sponsors' ads, drops from 19 videos to 6 once ads are taken out, and Slack from 76 to 72.</p>
<p>That is a signal of its own. Which channels your competitors sponsor, and whether their ads name you, is one search across the repeated passages.</p>
<h2>Which channel owns which topic</h2>
<p>Topics are phrase lists, matched ignoring case; a video counts for a topic when its phrases come up at least three times, so one passing mention doesn't count.</p>
<table>
<thead>
<tr>
<th>Topic</th>
<th align="right">Videos (of 299)</th>
<th>Channel where it comes up most</th>
</tr>
</thead>
<tbody><tr>
<td>Pipeline and forecasting</td>
<td align="right">81</td>
<td>Sales Gravy (19)</td>
</tr>
<tr>
<td>AI agents</td>
<td align="right">77</td>
<td>SaaStr (44)</td>
</tr>
<tr>
<td>Hiring and ramping reps</td>
<td align="right">74</td>
<td>Pavilion (25)</td>
</tr>
<tr>
<td>LinkedIn prospecting</td>
<td align="right">63</td>
<td>30 Minutes to President's Club (20)</td>
</tr>
<tr>
<td>Churn, retention and expansion</td>
<td align="right">56</td>
<td>Winning by Design (27)</td>
</tr>
<tr>
<td>Cold calling</td>
<td align="right">44</td>
<td>30 Minutes to President's Club (22)</td>
</tr>
<tr>
<td>Pricing</td>
<td align="right">39</td>
<td>SaaStr (14)</td>
</tr>
<tr>
<td>Discovery</td>
<td align="right">34</td>
<td>30 Minutes to President's Club (18)</td>
</tr>
<tr>
<td>Quota and compensation</td>
<td align="right">25</td>
<td>Pavilion (11)</td>
</tr>
<tr>
<td>Objection handling</td>
<td align="right">22</td>
<td>30 Minutes to President's Club (12)</td>
</tr>
<tr>
<td>Fundraising and valuations</td>
<td align="right">20</td>
<td>Pavilion (10)</td>
</tr>
<tr>
<td>Product-led growth</td>
<td align="right">18</td>
<td>Winning by Design (10)</td>
</tr>
<tr>
<td>Cold email</td>
<td align="right">14</td>
<td>30 Minutes to President's Club (11)</td>
</tr>
</tbody></table>
<p><em>Phrase lists are in <a href="https://locaihost.org/blog/content-signal-b2b-sales-youtube/analysis/recipe-4-analysis.py">recipe-4-analysis.py</a> and per-channel counts in <a href="https://locaihost.org/blog/content-signal-b2b-sales-youtube/analysis/topic-mentions.csv">topic-mentions.csv</a>. "AI agents" includes the word "agents", which in this niche almost always means software.</em></p>
<p>Each channel has a clear lane. 30 Minutes to President's Club is the prospecting channel: cold calling, discovery, objections and cold email all peak there. SaaStr talks about AI agents in 44 of its 50 videos. Pavilion is about running a revenue team: hiring, compensation, fundraising. Winning by Design is about what happens after the sale, with retention and expansion in 27 of its 49 videos. If you plan content or sponsorships, that table says where a topic already has an audience and where it has none.</p>
<h2>Head to head, by channel</h2>
<p>The same counts, split by channel, for the pairs people ask about:</p>
<table>
<thead>
<tr>
<th>Channel</th>
<th align="right">Claude / Anthropic</th>
<th align="right">ChatGPT / OpenAI</th>
<th align="right">Salesforce</th>
<th align="right">HubSpot</th>
<th align="right">Gong</th>
<th align="right">Clay</th>
</tr>
</thead>
<tbody><tr>
<td>30 Minutes to President's Club</td>
<td align="right">4</td>
<td align="right">2</td>
<td align="right">4</td>
<td align="right">3</td>
<td align="right">13</td>
<td align="right">2</td>
</tr>
<tr>
<td>SaaStr</td>
<td align="right">37</td>
<td align="right">29</td>
<td align="right">40</td>
<td align="right">19</td>
<td align="right">4</td>
<td align="right">15</td>
</tr>
<tr>
<td>Sales Gravy</td>
<td align="right">0</td>
<td align="right">2</td>
<td align="right">3</td>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">0</td>
</tr>
<tr>
<td>Pavilion</td>
<td align="right">15</td>
<td align="right">20</td>
<td align="right">24</td>
<td align="right">10</td>
<td align="right">10</td>
<td align="right">10</td>
</tr>
<tr>
<td>Winning by Design</td>
<td align="right">8</td>
<td align="right">12</td>
<td align="right">15</td>
<td align="right">8</td>
<td align="right">4</td>
<td align="right">3</td>
</tr>
<tr>
<td>Close</td>
<td align="right">4</td>
<td align="right">2</td>
<td align="right">3</td>
<td align="right">4</td>
<td align="right">1</td>
<td align="right">1</td>
</tr>
</tbody></table>
<p><em>Videos per channel that name each one, ad reads excluded.</em></p>
<p>Gong is a 30 Minutes to President's Club name (13 of its 50 videos); Clay is a SaaStr name (15). Claude leads ChatGPT on SaaStr, ChatGPT leads on Pavilion and Winning by Design. Sales Gravy, a sales-training channel, barely names software at all.</p>
<h2>What people actually say</h2>
<p>Counts tell you where to look; the chunk timestamps take you to the moment. Four examples, each a few words long, each linked to the point in the video:</p>
<ul>
<li>On SaaStr, about which data tool its own sales agents prefer: <a href="https://www.youtube.com/watch?v=_4ArZ5j6tkA&amp;t=2409s">"They slightly prefer Clay."</a> (from <em>We Doubled Revenue with Agents. Here's Exactly How.</em>, 18 September 2026)</li>
<li>On SaaStr, about software vendors that charge extra when an agent uses their product: <a href="https://www.youtube.com/watch?v=DnIp9DUFCBs&amp;t=943s">"Salesforce is just rolling it out."</a> (from <em>Agent Pricing is Chaos</em>, 2 October 2026)</li>
<li>On Winning by Design, against the idea that phone prospecting is over: <a href="https://www.youtube.com/watch?v=itqob5ad1ZY&amp;t=1378s">"I don't think cold calling is dead. I love cold calling."</a> (5 June 2026)</li>
<li>On Pavilion, inside a sponsor's ad: <a href="https://www.youtube.com/watch?v=tG4GV8-bj6Y&amp;t=74s">"we ripped out Gong and went all in on Momentum"</a> (29 April 2026)</li>
</ul>
<p>The links open at the start of the 300-word chunk that holds the quote, so the line itself is within the next two minutes.</p>
<h2>The RAG-ready export</h2>
<p>The same run gives you a search index over everything these channels said. Each chunk becomes one line of JSON, ready for any embedding model and vector store:</p>
<pre><code class="language-json">{"id": "4o8FJRULLi4-0", "videoId": "4o8FJRULLi4", "channel": "30 Minutes to President's Club", "title": "How I Use LinkedIn Sales Navigator to Find Warm Leads (Crash Course)", "publishedAt": "2026-10-13", "start": 0, "end": 85.4, "url": "https://www.youtube.com/watch?v=4o8FJRULLi4&amp;t=0s", "text": "So, we're going to talk about search filters. How do you save them? ..."}
</code></pre>
<p>Our 299 videos made 6,968 chunks and about 2.05 million words with the overlap. The <code>url</code> field opens the video at the chunk's start, so an answer built from a chunk can cite the exact moment. The <a href="https://locaihost.org/blog/content-signal-b2b-sales-youtube/analysis/recipe-4-analysis.py">analysis script</a> writes this file (<code>chunks.jsonl</code>) from the Actor's output in a few lines; we don't publish ours, because the text belongs to the channels.</p>
<p>For internal research that is a good use of captions: ask "what do revenue leaders say about replacing call-recording tools?" and get answers with links to the moments they said it. Republishing the transcripts is not.</p>
<h2>If you work from Claude Code or another MCP client</h2>
<p>With the Apify MCP server connected, this prompt builds the same counts for your own niche and keeps the chunks for questions later:</p>
<pre><code class="language-text">Use the Apify Actor locaihost/youtube-transcripts on these channels: [your 5 to 10 channel handles].
maxVideosPerChannel 50, includeShorts false, languages ["en"], includeSegments false, chunkSize 300,
chunkOverlap 40. The price is $1.50 per 1,000 transcripts; tell me how many videos you expect first.
Save every chunk to chunks.jsonl with videoId, channel, title, publishedAt, start, end, a url with
&amp;t=&lt;start&gt;s, and the text. Then, for these names: [your company and competitors], count how many
videos per channel mention each one, matching case. Before counting, remove any 12-word passage
that appears in three or more videos of the same channel (ad reads and intros) and tell me which
names were in those passages. Quote nothing longer than one sentence.
</code></pre>
<p>After that, questions like "which videos compare us with [competitor], and what did they say?" are answered from <code>chunks.jsonl</code> with timestamped links.</p>
<h2>The weekly version: new mentions, in Slack</h2>
<p>The useful form of this signal is a message every Monday listing each new video, from the channels you follow, that names your company or a competitor, with links that open the video at each mention.</p>
<p>We use an n8n workflow with five nodes for it:</p>
<ol>
<li><strong>Schedule Trigger</strong>, every Monday at 08:00.</li>
<li><strong>Channels and terms</strong> (a Set node): channel handles, one per line, and the names to watch, one per line.</li>
<li><strong>Apify, Run actor and get dataset</strong>: runs youtube-transcripts with <code>onlyNew: true</code>, 120-word chunks for finer timestamps, and a $1 cap on the run.</li>
<li><strong>Code</strong>: finds each term in each new video's chunks, case included, and builds one message: the video, how often each term came up, up to three timestamped links, and a dozen words around the first mention. A week with no mentions sends nothing.</li>
<li><strong>Slack</strong>: posts it to the channel you pick.</li>
</ol>
<p>Download <a href="https://locaihost.org/blog/content-signal-b2b-sales-youtube/files/content-signal-to-slack.json">content-signal-to-slack.json</a>. It comes with this post's six channels and six sales tools as terms; replace them with yours.</p>
<p>Setup takes about five minutes:</p>
<ol>
<li>In n8n, open <strong>Workflows &gt; Import from file</strong> and pick the JSON.</li>
<li>The workflow uses the verified Apify node (<code>@apify/n8n-nodes-apify</code>). n8n Cloud installs it from the canvas; on self-hosted n8n, add it under <strong>Settings &gt; Community nodes</strong>.</li>
<li>In the Apify node, create an <strong>Apify API</strong> credential with your token from the Apify console (<strong>Settings &gt; API &amp; Integrations</strong>).</li>
<li>In <strong>Post to Slack</strong>, pick your Slack credential and the channel.</li>
<li>Edit <strong>Channels and terms</strong>, and run it once by hand. The first run reads up to 10 videos per channel; from the next Monday you only get new uploads.</li>
</ol>
<p>What it costs: the first run over these six channels reads 60 videos ($0.09). After that, they upload about seven regular videos a week between them, so a weekly run is about 1 cent. On Apify's free plan a run reads up to 200 videos; any paid plan removes the cap.</p>
<h2>Read the counts once</h2>
<ul>
<li><strong>Captions mishear names.</strong> 295 of the 299 transcripts are automatic captions. "Replit" also came out as "Rapid" and "Replet", and the second is counted but the first is not. Check a sample of matches for every name you count, and add the misspellings you find.</li>
<li><strong>Case matters both ways.</strong> Matching <code>Clay</code> with a capital keeps out the word clay, but it also misses the few places the captions wrote a name in lower case.</li>
<li><strong>The windows differ.</strong> The 50 newest videos are four months of Sales Gravy and more than two years of Winning by Design. Compare channels on shares, not totals, and don't read a trend across them.</li>
<li><strong>A mention is not an opinion.</strong> "We ripped out Gong" and "we love Gong" count the same. The timestamped links are there so you read the context before you quote anyone.</li>
</ul>
<h2>More ways to use the content signal</h2>
<ul>
<li><strong>Product marketing.</strong> Put your company and three rivals in the terms. Over a quarter you see which channels mention you, next to whom, and whether the mentions are in conversation or in someone's ad.</li>
<li><strong>Sponsorship buying.</strong> The topic table shows which channel already owns your topic. The repeated passages show who else sponsors it, and for how long.</li>
<li><strong>Content planning.</strong> A topic that your buyers' favourite channels cover in half their videos is crowded; one they never cover is open.</li>
<li><strong>Sales enablement.</strong> A searchable library of how practitioners handle an objection, with links to the minute, is a better training resource than another slide.</li>
<li><strong>Other niches.</strong> Nothing here is about sales except the channel list and the names. Developer tools, marketing, finance, design: swap the handles and the terms.</li>
</ul>
<h2>Notes</h2>
<ul>
<li><strong>The sample.</strong> Six YouTube channels about B2B sales and SaaS go-to-market, picked by us, and the newest 50 regular videos of each (49 with captions at Winning by Design). It is not a sample of all sales content.</li>
<li><strong>The runs.</strong> Run <code>jdvjhDvCxYLvyhM7Y</code> on 15 October 2026 at 04:59 UTC, 69.5 seconds, 299 transcripts charged. Then run <code>SD5gX8d64xTSuGidX</code> with the same input, which skipped all 299 as already returned and charged nothing but the start fee.</li>
<li><strong>Matching is evidence you can check.</strong> Every count comes from a regular expression in the analysis script, run on the captions. There is no model and no sentiment scoring.</li>
<li><strong>Copyright.</strong> The transcripts belong to the channels. This post publishes counts, video metadata (title, date, length, views) and four short quotes with links; the chunk text stays in our own files.</li>
<li><strong>Reproduce it.</strong> The <a href="https://locaihost.org/blog/content-signal-b2b-sales-youtube/analysis/recipe-4-channels.txt">channel list</a>, the <a href="https://locaihost.org/blog/content-signal-b2b-sales-youtube/analysis/recipe-4-run.mjs">run script</a> and the <a href="https://locaihost.org/blog/content-signal-b2b-sales-youtube/analysis/recipe-4-analysis.py">analysis script</a> are next to this post, with the <a href="https://locaihost.org/blog/content-signal-b2b-sales-youtube/analysis/results.json">computed results</a> and a <a href="https://locaihost.org/blog/content-signal-b2b-sales-youtube/analysis/videos.csv">list of the 299 videos</a> with the names and topics found in each.</li>
</ul>
<p>If you run this on your own niche, post two numbers in the comments: how many channels you followed, and how many of your competitors' mentions turned out to be in ads. That tells the next reader how much to trust a raw count.</p>
<p><em>Source: the public captions of 299 YouTube videos from six channels, read by locaihost data on 15 October 2026.</em></p>
]]></content:encoded></item><item><title><![CDATA[A review signal: what 1,120 one and two-star reviews say about 30 UK energy suppliers, and who answers them]]></title><description><![CDATA[Recent Trustpilot reviews of 30 UK energy suppliers, read at $0.25 per 1,000 rows: how many are one or two stars once you separate invited reviews...]]></description><link>https://locaihost.hashnode.dev/a-review-signal-what-1-120-one-and-two-star-reviews-say-about-30-uk-energy-suppliers-and-who-answers-them</link><guid isPermaLink="true">https://locaihost.hashnode.dev/a-review-signal-what-1-120-one-and-two-star-reviews-say-about-30-uk-energy-suppliers-and-who-answers-them</guid><category><![CDATA[automation]]></category><category><![CDATA[api]]></category><category><![CDATA[data]]></category><category><![CDATA[marketing]]></category><dc:creator><![CDATA[locaihost data]]></dc:creator><pubDate>Wed, 21 Oct 2026 12:28:06 GMT</pubDate><content:encoded><![CDATA[<p><em>Originally published on <a href="https://locaihost.org/blog/review-signal-uk-energy-suppliers/">locaihost.org</a>, where the charts and data files live.</em></p>
<p>Every unhappy customer who writes a review is telling the market something specific: the phone line that never answers, the estimated bill, the smart meter that stopped sending readings, the refund that takes three months. For the company's competitors that is the most useful data there is. It says where the other side is weak right now, in the customers' own words, with a date on it.</p>
<p>If you run marketing or customer experience at a challenger brand, sell to companies in a crowded consumer market, broker contracts, or advise on service quality, that is the signal you want: across a whole category, how many recent reviews are negative, what they are about, and which companies answer them.</p>
<p>We built it for 30 UK energy suppliers on 15 October 2026 with our <strong><a href="https://apify.com/locaihost/trustpilot-reviews">trustpilot-reviews</a></strong> Actor on Apify. It reads each company's public Trustpilot page the way a logged-out visitor sees it: star rating, title, text, dates, whether the review was invited, and the company's reply with its date. Every number below is from those runs. Reviews are written by members of the public, so this post shows counts only: no reviewer names, and no review text.</p>
<h2>The signal, written as two inputs</h2>
<p>The 30 suppliers: 16 household suppliers in Great Britain, 4 in Northern Ireland and 10 that sell to businesses, from Octopus Energy and British Gas to Crown Gas &amp; Power. Brands that have closed or moved their customers to another supplier (Shell Energy, Bulb, Boost, Rebel Energy) were left out. The list is <a href="https://locaihost.org/blog/review-signal-uk-energy-suppliers/analysis/recipe-3-companies.txt">recipe-3-companies.txt</a>.</p>
<p>The first run is a snapshot: every review from the last 90 days, newest first, up to 100 per company, plus one business row each with the TrustScore and review counts.</p>
<pre><code class="language-json">{
  "companies": ["octopus.energy", "britishgas.co.uk", "edfenergy.com", "eonnext.com", "ovoenergy.com"],
  "maxReviewsPerCompany": 100,
  "dateFrom": "90 days",
  "sort": "recency",
  "includeCompanyInfo": true
}
</code></pre>
<p>The second run is the complaint pull: only one and two-star reviews from the last 30 days, again up to 100 per company.</p>
<pre><code class="language-json">{
  "companies": ["octopus.energy", "britishgas.co.uk", "edfenergy.com", "eonnext.com", "ovoenergy.com"],
  "stars": ["1", "2"],
  "maxReviewsPerCompany": 100,
  "dateFrom": "30 days",
  "sort": "recency",
  "includeCompanyInfo": false,
  "onlyNew": true
}
</code></pre>
<p>Three notes on the fields:</p>
<ul>
<li><code>companies</code> takes the website domain or a Trustpilot review link from any country site. We checked the 30 first with <code>maxReviewsPerCompany: 0</code>, which returns only the business row, so a wrong guess costs next to nothing. 18 of our 72 guessed domains had no Trustpilot page and came back as free rows, and one, <code>eon.co.uk</code>, turned out to be a film production company.</li>
<li><code>dateFrom</code> takes a date or a period like <code>30 days</code>. With newest-first order the Actor stops reading a company at that date, so it only reads the pages it needs.</li>
<li><code>onlyNew</code> remembers which reviews it has already returned for this exact input, in your own Apify account. It is what makes the weekly version below cheap.</li>
</ul>
<h2>What came back</h2>
<ul>
<li><strong>The snapshot: 2,358 reviews and 30 business rows.</strong> At $0.25 per 1,000 rows, a user on the free or Starter plan pays $0.58 for the main run and $0.03 for one retry (E.ON Next's page timed out after 40 reviews, so we ran that company again on its own).</li>
<li><strong>Only 319 of the 2,358 recent reviews (13.5%) are one or two stars. 1,858 (79%) are five stars.</strong></li>
<li><strong>But 1,599 of them (68%) were invited by the company, and invited reviews are a different population.</strong> 4% of invited reviews are one or two stars. Of the 759 organic reviews, written by people who went to Trustpilot on their own, 34% are.</li>
<li><strong>The complaint pull: 1,120 one and two-star reviews from the last 30 days, at 28 of the 30 suppliers, in 3 minutes 53 seconds, for $0.28.</strong> firmus energy and SEFE Energy had none in the period.</li>
<li><strong>43% of the 1,120 are about getting through to someone</strong>: hold times, call-backs that never come, emails with no answer. Billing comes second (30%) and smart meters third (28%).</li>
<li><strong>86% of the one and two-star reviews that were at least three days old had a reply from the company.</strong> 61% of those at least a day old were answered within 24 hours. The median reply came after 15 hours.</li>
</ul>
<h2>Invited and organic reviews are two different signals</h2>
<p>Trustpilot shows how each review arrived. Most of these suppliers send customers an invitation after a call or a meter fitting, and those customers are mostly happy. People who go looking for the review page are mostly not.</p>
<table>
<thead>
<tr>
<th>Reviews in the snapshot</th>
<th>Reviews</th>
<th>Five stars</th>
<th>One or two stars</th>
</tr>
</thead>
<tbody><tr>
<td>Invited by the company</td>
<td>1,599</td>
<td>86.9%</td>
<td>4.0%</td>
</tr>
<tr>
<td>Organic</td>
<td>759</td>
<td>61.8%</td>
<td>33.6%</td>
</tr>
<tr>
<td>All</td>
<td>2,358</td>
<td>78.8%</td>
<td>13.5%</td>
</tr>
</tbody></table>
<p>That is why two suppliers with similar service can show very different scores. British Gas has a TrustScore of 4.4; 86 of its 100 newest reviews were invited. British Gas Lite, a separate brand in the same group, has 1.1; 44 of its 45 reviews in the 90 days were organic, and 44 of the 45 were one or two stars. At the business suppliers that invite few customers, the organic reviews are mostly good: Corona Energy (98 organic reviews of 100) and Pozitive Energy (88 of 100) have 5% and 8% one or two-star reviews.</p>
<p>So for a competitor signal, ignore the TrustScore and read two things: the organic reviews, and the one and two-star reviews whichever way they arrived. 37% of the 1,120 one and two-star reviews in the complaint pull came through an invitation, which means the customer was unhappy enough to say so in the company's own survey.</p>
<h2>What the unhappy customers write about</h2>
<p>We grouped the 1,120 complaint reviews with keyword lists in code: a review counts for a theme when its title or text contains one of the theme's phrases, ignoring case. A review can count for several themes. 146 (13%) matched none, mostly reviews of a line or two that only say the service was bad.</p>
<table>
<thead>
<tr>
<th>Complaint theme</th>
<th>Reviews</th>
<th>Share</th>
<th>Example phrases we match</th>
</tr>
</thead>
<tbody><tr>
<td>Getting through to someone</td>
<td>482</td>
<td>43%</td>
<td>on hold, call back, no response, chase, live chat</td>
</tr>
<tr>
<td>Billing and estimated bills</td>
<td>338</td>
<td>30%</td>
<td>bill, estimated, overcharged, statement</td>
</tr>
<tr>
<td>Smart meters and readings</td>
<td>308</td>
<td>28%</td>
<td>smart meter, meter, readings, in-home display</td>
</tr>
<tr>
<td>Switching, moving and closing accounts</td>
<td>293</td>
<td>26%</td>
<td>switched, moving home, final bill, cancel</td>
</tr>
<tr>
<td>Tariffs and prices</td>
<td>198</td>
<td>18%</td>
<td>tariff, unit rate, standing charge, price</td>
</tr>
<tr>
<td>Engineers and appointments</td>
<td>182</td>
<td>16%</td>
<td>engineer, appointment, installation, no-show</td>
</tr>
<tr>
<td>Refunds and credit balances</td>
<td>179</td>
<td>16%</td>
<td>refund, credit balance, money back, owed</td>
</tr>
<tr>
<td>Rude or unhelpful staff</td>
<td>156</td>
<td>14%</td>
<td>rude, unhelpful, attitude, no idea</td>
</tr>
<tr>
<td>Direct debit and payments</td>
<td>150</td>
<td>13%</td>
<td>direct debit, payment plan, monthly payments</td>
</tr>
<tr>
<td>Formal complaints and the ombudsman</td>
<td>131</td>
<td>12%</td>
<td>ombudsman, formal complaint, escalated</td>
</tr>
<tr>
<td>Contracts and renewals</td>
<td>113</td>
<td>10%</td>
<td>contract, renewal, rolled over, deemed, broker</td>
</tr>
<tr>
<td>Debt collection and court</td>
<td>91</td>
<td>8%</td>
<td>debt, collectors, court, warrant, credit file</td>
</tr>
<tr>
<td>Broadband, phone and other services</td>
<td>85</td>
<td>8%</td>
<td>broadband, home phone, mobile, boiler</td>
</tr>
<tr>
<td>Solar, EV and export</td>
<td>74</td>
<td>7%</td>
<td>solar, export, EV, heat pump, battery</td>
</tr>
<tr>
<td>Prepayment and top-ups</td>
<td>36</td>
<td>3%</td>
<td>prepay, top up, emergency credit</td>
</tr>
</tbody></table>
<p><em>The full phrase lists are in <a href="https://locaihost.org/blog/review-signal-uk-energy-suppliers/analysis/recipe-3-analysis.py">recipe-3-analysis.py</a>. Change them for your own market; the method is the same.</em></p>
<p>The mix changes by customer type, and that is where the signal gets specific:</p>
<ul>
<li><strong>Business suppliers:</strong> billing leads (41% of their 181 complaint reviews), then getting through (40%), contracts and renewals (26%) and formal complaints (21%). A business customer who is unhappy is often in a contract dispute, not just on hold.</li>
<li><strong>Household suppliers:</strong> getting through leads (44% of 924), with smart meters and billing tied at 28%.</li>
<li><strong>One supplier at a time:</strong> British Gas's complaints mention engineers and appointments in 39% of cases, because it also sells boiler cover and repairs. At OVO, direct debits come up in 26%. At Utility Warehouse, which sells broadband and mobile too, 37% are about those other services.</li>
</ul>
<h2>Who answers bad reviews, and how fast</h2>
<p>A reply is public, it has a date, and it shows how a company treats an unhappy customer in front of the next one. We measured it on the complaint pull, and only counted reviews that were old enough to have had a fair chance: at least 24 hours old for "answered within a day", at least three days old for "answered at all".</p>
<table>
<thead>
<tr>
<th>Supplier</th>
<th>One and two-star reviews a day</th>
<th>Answered within 24 hours</th>
<th>Median time to reply</th>
</tr>
</thead>
<tbody><tr>
<td>E.ON Next</td>
<td>35.9</td>
<td>69 of 69</td>
<td>4.7 hours</td>
</tr>
<tr>
<td>Octopus Energy</td>
<td>26.6</td>
<td>21 of 68</td>
<td>23.3 hours</td>
</tr>
<tr>
<td>British Gas</td>
<td>15.6</td>
<td>87 of 87</td>
<td>0.5 hours</td>
</tr>
<tr>
<td>ScottishPower</td>
<td>15.3</td>
<td>47 of 77</td>
<td>22.6 hours</td>
</tr>
<tr>
<td>OVO</td>
<td>10.3</td>
<td>84 of 90</td>
<td>17.5 hours</td>
</tr>
<tr>
<td>Utility Warehouse</td>
<td>10.3</td>
<td>69 of 86</td>
<td>2.6 hours</td>
</tr>
<tr>
<td>EDF</td>
<td>8.0</td>
<td>58 of 86</td>
<td>11.3 hours</td>
</tr>
<tr>
<td>Yü Energy</td>
<td>3.1</td>
<td>13 of 86</td>
<td>21.3 hours</td>
</tr>
<tr>
<td>So Energy</td>
<td>2.2</td>
<td>35 of 60</td>
<td>21.5 hours</td>
</tr>
<tr>
<td>Fuse Energy</td>
<td>1.7</td>
<td>4 of 49</td>
<td>96.0 hours</td>
</tr>
<tr>
<td>SmartestEnergy</td>
<td>1.0</td>
<td>26 of 28</td>
<td>2.9 hours</td>
</tr>
<tr>
<td>Pozitive Energy</td>
<td>0.4</td>
<td>0 of 13</td>
<td>108.6 hours</td>
</tr>
</tbody></table>
<p><em>Reviews a day is over the 30 days, or over the days our 100 reviews covered when a supplier had more than 100 in the month (E.ON Next's 100 covered under three days). The other 18 suppliers and every column are in <a href="https://locaihost.org/blog/review-signal-uk-energy-suppliers/analysis/companies.csv">companies.csv</a>.</em></p>
<p>Three patterns stand out:</p>
<ul>
<li><strong>The big suppliers run reply desks.</strong> British Gas answered all 87 of its one and two-star reviews that were a day old within 24 hours, and its median reply came 30 minutes after the review. E.ON Next and Utility Warehouse also reply within hours.</li>
<li><strong>Some reply to everything, slowly.</strong> Pozitive Energy answered all 11 of its older complaint reviews, but none within a day; the median was four and a half days. Fuse Energy took four days at the median and had answered 33 of 48.</li>
<li><strong>Some don't reply at all.</strong> British Gas Lite answered none of its 13 one and two-star reviews that were three days old or more, and Corona Energy none of 5. Yü Energy, with the lowest TrustScore among the active business suppliers (3.7), had answered 25 of 77.</li>
</ul>
<h2>Read the themes once</h2>
<p>Keyword grouping is fast and you can check every match, but it is crude, so read a sample before you act on it:</p>
<ul>
<li><strong>It finds words, not meaning.</strong> "No issues with the meter" counts for smart meters. That is rare in one-star reviews, but check a few per theme.</li>
<li><strong>Short reviews match nothing.</strong> 13% of the complaint reviews fall in no theme. Add phrases when you see a pattern; don't stretch the lists until everything matches.</li>
<li><strong>Reviews are not a random sample of customers.</strong> They are the people who chose to write, plus the ones a company invited. Compare a supplier with itself over time, or one theme across suppliers, rather than reading a share as a fact about all customers.</li>
<li><strong>A reply date is the date Trustpilot shows</strong> for the reply. Some companies edit their replies, which can move the date.</li>
</ul>
<h2>The weekly version: a competitor's unhappy customers, in Slack</h2>
<p>The useful form of this signal is a message every Monday: for each competitor, how many one and two-star reviews arrived in the last seven days, what they were about, and how many got a reply, with links to the newest few. It is a view of where each competitor is struggling, for your product, marketing and service teams. It is not a list of people to contact: the Actor's terms ask you not to contact or profile reviewers, and the workflow never touches reviewer names.</p>
<p>We use an n8n workflow with five nodes for it:</p>
<ol>
<li><strong>Schedule Trigger</strong>, every Monday at 08:00.</li>
<li><strong>Competitors and filters</strong> (a Set node): the companies' domains, one per line, the stars to keep (<code>1, 2</code>) and the period (<code>7 days</code>).</li>
<li><strong>Apify, Run actor and get dataset</strong>: runs trustpilot-reviews with <code>onlyNew: true</code>, up to 200 reviews per company and 2,000 rows in all, with a $1 cap on the run.</li>
<li><strong>Code</strong>: groups the reviews by company, counts the themes with the same phrase lists as this post, works out the reply share, and builds one message with links to the three newest reviews per company (titles only). A quiet week sends nothing.</li>
<li><strong>Slack</strong>: posts it to the channel you pick.</li>
</ol>
<p>Download <a href="https://locaihost.org/blog/review-signal-uk-energy-suppliers/files/review-signal-to-slack.json">review-signal-to-slack.json</a>. It comes with this post's 30 suppliers filled in; replace them with your own competitors.</p>
<p>Setup takes about five minutes:</p>
<ol>
<li>In n8n, open <strong>Workflows &gt; Import from file</strong> and pick the JSON.</li>
<li>The workflow uses the verified Apify node (<code>@apify/n8n-nodes-apify</code>). n8n Cloud installs it from the canvas; on self-hosted n8n, add it under <strong>Settings &gt; Community nodes</strong>.</li>
<li>In the Apify node, create an <strong>Apify API</strong> credential with your token from the Apify console (<strong>Settings &gt; API &amp; Integrations</strong>).</li>
<li>In <strong>Post to Slack</strong>, pick your Slack credential and the channel.</li>
<li>Edit <strong>Competitors and filters</strong>. Run it once by hand: the first run returns the last seven days, and from then on each Monday brings only the new week.</li>
</ol>
<p>What it costs: across these 30 suppliers, about 136 one and two-star reviews arrive a day, so a weekly run is about 950 rows, or $0.24. A supplier with more than 200 bad reviews a week (E.ON Next had about 250) will hit the per-company limit on a weekly schedule; for those, set the trigger to daily and the period to <code>2 days</code>, and the same message works as a daily digest. On Apify's free plan a run returns up to 1,000 rows; any paid plan removes the cap.</p>
<h2>If you work from Claude Code or another MCP client</h2>
<p>With the Apify MCP server connected, this prompt does the same job for your own category and gives you tables:</p>
<pre><code class="language-text">Use the Apify Actor locaihost/trustpilot-reviews. First run it with maxReviewsPerCompany 0 on these
domains to check each one has a Trustpilot page: [your 10 to 30 competitors]. Then run it on the ones
that exist with stars ["1","2"], dateFrom "30 days", maxReviewsPerCompany 100, includeCompanyInfo false.
The price is $0.25 per 1,000 rows; tell me the expected row count before the second run.
Do not show or store reviewerName. Group the reviews into complaint themes with keyword lists you
show me first, and give me per company: one and two-star reviews a day, the top three themes with
their share, the share of reviews older than 24 hours that got a reply within 24 hours, and the
median hours to reply. List any theme where one company's share is twice the average.
</code></pre>
<h2>More ways to use the review signal</h2>
<ul>
<li><strong>Positioning and ads.</strong> If 43% of a market's complaints are about getting through to someone, "a person answers in two minutes" is a claim worth testing, and the theme counts tell you which competitor to compare yourself with.</li>
<li><strong>Your own service team.</strong> Put your own domain in the list. The themes and reply times sit next to your competitors', in the same format, every week.</li>
<li><strong>Category research.</strong> Any market with busy Trustpilot pages works the same way: banks and fintech apps, broadband, airlines, delivery firms, online retailers, VPNs. Swap the domains and the phrase lists.</li>
<li><strong>Brokers and switching services.</strong> A rise in contract and renewal complaints at one business supplier is a reason to call the customers you placed there before their renewal date.</li>
<li><strong>Investors and analysts.</strong> A sudden jump in one theme (billing after a system migration, say) shows up in reviews within days, long before it shows up in a regulator's complaint figures.</li>
<li><strong>Score tracking.</strong> Keep <code>includeCompanyInfo</code> on with <code>onlyNew</code>, and a business row comes back only when the TrustScore or review count changed.</li>
</ul>
<h2>Notes</h2>
<ul>
<li><strong>The sample.</strong> 30 UK energy suppliers with an active Trustpilot page, picked by us: 16 household suppliers in Great Britain, 4 in Northern Ireland, 10 business suppliers. It is not every supplier in the market.</li>
<li><strong>The runs.</strong> Snapshot run <code>MpDPBn28NabBlLoRS</code> on 15 October 2026 at 04:57 UTC (395 seconds, 2,298 reviews and 30 business rows), then <code>lTXbPzQw9ciFlIYSc</code> for E.ON Next alone (100 reviews), whose rows replace the 40 from the first run. Complaint run <code>2wJfjfHnZ91cXV9M2</code> (233 seconds, 1,120 reviews), then <code>wU4Q8947iivcb8Jgn</code> with the same input, which returned nothing and charged nothing because <code>onlyNew</code> had already sent every review.</li>
<li><strong>What "invited" means here.</strong> Any review whose source is not Trustpilot's "Organic": invitation emails, invitation links and the links a company shares itself.</li>
<li><strong>No personal data in the outputs.</strong> The run script drops reviewer names before saving anything, and the files next to this post hold counts per company only.</li>
<li><strong>Reproduce it.</strong> The <a href="https://locaihost.org/blog/review-signal-uk-energy-suppliers/analysis/recipe-3-companies.txt">company list</a>, the <a href="https://locaihost.org/blog/review-signal-uk-energy-suppliers/analysis/recipe-3-run.mjs">run script</a> and the <a href="https://locaihost.org/blog/review-signal-uk-energy-suppliers/analysis/recipe-3-analysis.py">analysis script</a> are next to this post, with the <a href="https://locaihost.org/blog/review-signal-uk-energy-suppliers/analysis/results.json">computed results</a>.</li>
</ul>
<p>If you run this on your own category, post two numbers in the comments: the share of one and two-star reviews among organic reviews, and among invited ones. If the gap is as wide as it was here, the next reader will know how little a TrustScore says on its own.</p>
<p><em>Source: public Trustpilot pages of 30 UK energy suppliers, read by locaihost data on 15 October 2026.</em></p>
]]></content:encoded></item><item><title><![CDATA[A hiring signal: 227 RevOps and sales-leadership jobs at 59 of 100 SaaS companies, in one 49-second run for $0.34]]></title><description><![CDATA[Which B2B software companies are hiring RevOps, deal desk and sales leaders right now, read straight from their own job boards. The exact Actor...]]></description><link>https://locaihost.hashnode.dev/a-hiring-signal-227-revops-and-sales-leadership-jobs-at-59-of-100-saas-companies-in-one-49-second-run-for-0-34</link><guid isPermaLink="true">https://locaihost.hashnode.dev/a-hiring-signal-227-revops-and-sales-leadership-jobs-at-59-of-100-saas-companies-in-one-49-second-run-for-0-34</guid><category><![CDATA[automation]]></category><category><![CDATA[api]]></category><category><![CDATA[sales]]></category><category><![CDATA[data]]></category><dc:creator><![CDATA[locaihost data]]></dc:creator><pubDate>Tue, 20 Oct 2026 12:31:58 GMT</pubDate><content:encoded><![CDATA[<p><em>Originally published on</em> <a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/"><em>locaihost.org</em></a><em>, where the charts and data files live.</em></p>
<p>A job ad is the most honest buying signal there is. The company wrote it, dated it and put a budget next to it. When a software company posts for a deal desk analyst, it has more quotes and discount requests than its sales team can handle. When it posts for a sales compensation manager, its commission plans have outgrown a spreadsheet. When it posts for a GTM systems lead, its CRM is about to change. And when it posts six regional sales directors at once, it is opening territories.</p>
<p>If you sell to sales teams (CPQ, commissions, forecasting, enablement, data), recruit for them, or want to work in one, that is the list you want: which of your target accounts are hiring for these roles right now, and which ones started this week.</p>
<p>We built it for 100 B2B software companies on 14 October 2026 with our <a href="https://apify.com/locaihost/careers-jobs"><strong>careers-jobs</strong></a> Actor on Apify. It reads each company's own public job board on Greenhouse, Lever, Ashby, Personio or Teamtailor, so the jobs are the employer's own postings, with the employer's own dates and pay ranges. No job aggregator, no login, no people data: the rows are jobs, not candidates or recruiters. Every number below is from that run.</p>
<h2>The signal, written as an input</h2>
<p>Who we wanted: RevOps and sales operations roles (including deal desk, enablement, sales compensation and GTM systems), plus sales leadership from director up, at 100 B2B software companies. The 100 boards are in <a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/analysis/recipe-1-companies.txt">recipe-1-companies.txt</a>; the first five are shown here.</p>
<pre><code class="language-json">{
  "companies": ["ashby:1password", "greenhouse:abnormalsecurity", "greenhouse:airtable", "greenhouse:algolia", "greenhouse:apolloio"],
  "titleKeywords": [
    "revenue operations", "revops", "rev ops", "sales operations", "sales ops",
    "gtm operations", "go-to-market operations", "gtm systems", "sales systems",
    "deal desk", "sales enablement", "revenue enablement", "sales strategy", "sales compensation",
    "head of sales", "vp sales", "vp of sales", "vp, sales", "vice president of sales", "vice president, sales",
    "director of sales", "sales director", "director, sales",
    "regional vice president", "area vice president", "chief revenue", "head of revenue"
  ],
  "includeDescription": false,
  "onlyNew": true
}
</code></pre>
<p>Three notes on the fields:</p>
<ul>
<li><p><code>companies</code> takes a board token with its system (<code>greenhouse:datadog</code>), a careers-board URL, or just a name (<code>figma</code>), which the Actor looks up on the five systems in turn. Tokens are faster and never pick the wrong company.</p>
</li>
<li><p><code>titleKeywords</code> keeps a job if its title contains any of the phrases, ignoring case. Phrases match as text, so <code>sales director</code> also catches "Regional Sales Director" and "Enterprise Sales Director - Majors".</p>
</li>
<li><p><code>includeDescription: false</code> leaves out the job text. You don't need it for a signal, and the rows stay small enough for a spreadsheet.</p>
</li>
</ul>
<p>Our first draft also had <code>sales manager</code> and <code>manager, sales</code>. That run returned 344 jobs instead of 227, and most of the extra 117 were partner, channel and territory sales managers who carry a quota. They are sellers, not sales leadership, so we dropped the two phrases.</p>
<h2>What came back</h2>
<ul>
<li><p><strong>227 open jobs at 59 of the 100 companies.</strong> The run took 48.5 seconds. At $1.50 per 1,000 jobs plus a $0.00005 start fee, a user on the free or Starter plan pays $0.34 for it.</p>
</li>
<li><p><strong>114 RevOps and sales operations jobs at 52 companies, and 113 sales-leadership jobs at 30.</strong> 23 companies are hiring for both, which is the strongest version of the signal.</p>
</li>
<li><p><strong>96 of the 227 were posted in the last 30 days, at 42 companies; 26 in the last seven.</strong> The posting date is the board's own first-published date.</p>
</li>
<li><p><strong>133 jobs (59%) publish a pay range.</strong> In US dollars the median published range was $242,500 to $277,500 for sales leadership (50 postings), $125,000 to $164,500 for revenue and sales operations (28) and $110,820 to $147,500 for deal desk (10). Sales ranges are often on-target earnings, base plus commission; the posting says which.</p>
</li>
<li><p><strong>A second run with the same input, started 66 seconds after the first, returned nothing and cost $0.00005.</strong> That is what <code>onlyNew</code> is for, and it is how the daily version below stays cheap.</p>
</li>
</ul>
<h2>Sample rows</h2>
<p>Ten of the 227, one per company, newest first. These are the employer's own titles and locations, unedited.</p>
<table>
<thead>
<tr>
<th>Company</th>
<th>Title</th>
<th>Location</th>
<th>Posted</th>
<th>Published pay range</th>
</tr>
</thead>
<tbody><tr>
<td>MongoDB</td>
<td>Regional Vice President, Enterprise, Growth, UKI</td>
<td>London</td>
<td>2026-10-14</td>
<td>none</td>
</tr>
<tr>
<td>Temporal</td>
<td>Senior Manager, Global Deal Desk</td>
<td>United States (Remote)</td>
<td>2026-10-14</td>
<td>USD 224,000 to 285,000</td>
</tr>
<tr>
<td>Vercel</td>
<td>Senior Deal Desk Analyst, EMEA</td>
<td>Hybrid - London</td>
<td>2026-10-14</td>
<td>GBP 65,000 to 85,000</td>
</tr>
<tr>
<td>Twilio</td>
<td>Sales Operations Planning Analyst</td>
<td>Remote - US</td>
<td>2026-10-13</td>
<td>USD 128,560 to 160,700</td>
</tr>
<tr>
<td>Sierra</td>
<td>Sales Compensation Systems</td>
<td>San Francisco, CA</td>
<td>2026-10-13</td>
<td>USD 170,000 to 220,000</td>
</tr>
<tr>
<td>LaunchDarkly</td>
<td>Senior Director, GTM Systems</td>
<td>Remote - US</td>
<td>2026-10-12</td>
<td>USD 240,600 to 330,700</td>
</tr>
<tr>
<td>Abnormal Security</td>
<td>Regional Sales Director, US SLED West</td>
<td>Remote - USA</td>
<td>2026-10-12</td>
<td>USD 197,650 to 232,500</td>
</tr>
<tr>
<td>Starburst</td>
<td>Director of Sales Enablement</td>
<td>Boston, MA</td>
<td>2026-10-08</td>
<td>USD 185,000 to 225,000</td>
</tr>
<tr>
<td>Webflow</td>
<td>Senior Manager, Sales Compensation</td>
<td>U.S. Remote</td>
<td>2026-09-01</td>
<td>USD 188,000 to 235,000</td>
</tr>
<tr>
<td>Klaviyo</td>
<td>Head of Sales, ANZ</td>
<td>Sydney, AU</td>
<td>2026-09-17</td>
<td>AUD 280,000 to 420,000</td>
</tr>
</tbody></table>
<p>Each row also carries <code>department</code>, <code>team</code>, every listed location, a <code>country</code> code, <code>workplaceType</code> (remote, hybrid or onsite when the board says), <code>employmentType</code>, <code>postedAt</code>, <code>updatedAt</code> on Greenhouse boards, the pay fields split into <code>salaryMin</code>, <code>salaryMax</code>, <code>salaryCurrency</code> and <code>salaryPeriod</code>, and the job and apply URLs.</p>
<h2>Reading it as an account list</h2>
<p>Grouped by company, the 227 jobs become a ranked account list. These are the twelve with the most matching openings.</p>
<table>
<thead>
<tr>
<th>Company</th>
<th>RevOps and sales ops</th>
<th>Sales leadership</th>
<th>Newest posting</th>
</tr>
</thead>
<tbody><tr>
<td>Sierra</td>
<td>4</td>
<td>33</td>
<td>2026-10-13</td>
</tr>
<tr>
<td>Elastic</td>
<td>3</td>
<td>12</td>
<td>2026-09-30</td>
</tr>
<tr>
<td>Cato Networks</td>
<td>1</td>
<td>13</td>
<td>2026-10-13</td>
</tr>
<tr>
<td>Braze</td>
<td>4</td>
<td>7</td>
<td>2026-10-09</td>
</tr>
<tr>
<td>GitLab</td>
<td>5</td>
<td>4</td>
<td>2026-10-13</td>
</tr>
<tr>
<td>MongoDB</td>
<td>7</td>
<td>2</td>
<td>2026-10-14</td>
</tr>
<tr>
<td>Verkada</td>
<td>8</td>
<td>1</td>
<td>2026-09-02</td>
</tr>
<tr>
<td>Airwallex</td>
<td>4</td>
<td>4</td>
<td>2026-09-17</td>
</tr>
<tr>
<td>Datadog</td>
<td>4</td>
<td>2</td>
<td>2026-09-29</td>
</tr>
<tr>
<td>JFrog</td>
<td>3</td>
<td>3</td>
<td>2026-10-05</td>
</tr>
<tr>
<td>Navan</td>
<td>6</td>
<td>0</td>
<td>2026-10-07</td>
</tr>
<tr>
<td>Fivetran</td>
<td>0</td>
<td>6</td>
<td>2026-10-09</td>
</tr>
</tbody></table>
<p><em>The full list of 59 companies, with the ATS board and how many jobs publish pay, is</em> <a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/analysis/accounts.csv"><em>accounts.csv</em></a><em>.</em></p>
<p>The two columns mean different things, so read them separately:</p>
<ul>
<li><p><strong>Sales leadership, many at once</strong> means territories are opening. Sierra had 33 such postings, and 27 of them were "Enterprise Sales Director" roles split by industry (financial services, healthcare, retail, public sector) and region. That is a company building an enterprise sales team from close to nothing, and it will need everything a new team needs.</p>
</li>
<li><p><strong>RevOps and sales ops</strong> is the machinery behind the team. Of the 114, 53 were general revenue or sales operations roles, 23 deal desk, 19 enablement, 10 sales compensation and 9 GTM systems. Each one points at a different purchase: deal desk at quoting and contract tools, compensation at commissions software, GTM systems at CRM work and data tools, enablement at training and call-coaching tools.</p>
</li>
<li><p><strong>Both columns at once</strong> (23 companies, including Datadog, GitLab, MongoDB, Okta and Braze) means the sales team is growing and the company is paying to make it run better at the same time.</p>
</li>
</ul>
<h2>Read the titles once</h2>
<p>Text matching is simple, so look at the titles before you load them anywhere. In this run 3 of the 227 were not what we meant: <code>head of sales</code> matched Notion's "Head of Sales Recruiting", <code>director, sales</code> matched "Director, Sales Engineering" at Datadog, and <code>regional vice president</code> matched a solutions-engineering leader at JFrog. A filter step in n8n, or a glance in the sheet, removes them.</p>
<p>Two more things to know. The <code>country</code> field was empty on 27 jobs, mostly postings that list several countries; the full location text is always there. And <code>workplaceType</code> is only filled in when the board has the field (Ashby does, Greenhouse mostly doesn't), so 119 jobs (112 of them from Greenhouse) say nothing about remote work.</p>
<h2>The daily version: only new jobs, posted to Slack</h2>
<p>The useful form of this signal is a message every morning with the jobs that appeared since yesterday. <code>onlyNew: true</code> makes that cheap: the Actor remembers which jobs it has already returned for this exact list of companies and keywords, in your own Apify account, and returns only the rest. Our second run returned zero rows. In the seven days before our run, these 100 companies first published 26 matching jobs, about four a day, so a daily run costs about a cent. Change the companies or the keywords and the memory starts fresh.</p>
<p>We use an n8n workflow with five nodes for it:</p>
<ol>
<li><p><strong>Schedule Trigger</strong>, every day at 09:00.</p>
</li>
<li><p><strong>Companies and filters</strong> (a Set node): your boards, one per line, and your title keywords.</p>
</li>
<li><p><strong>Apify, Run actor and get dataset</strong>: runs careers-jobs with <code>onlyNew: true</code>, <code>includeDescription: false</code> and <code>maxResults: 500</code>, with a $1 cap on the run.</p>
</li>
<li><p><strong>Code</strong>: groups the new jobs by company into one message, with location and pay range when the posting has one. A quiet day sends nothing.</p>
</li>
<li><p><strong>Slack</strong>: posts it to the channel you pick.</p>
</li>
</ol>
<p>Download <a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/files/hiring-signal-to-slack.json">hiring-signal-to-slack.json</a>. It is our standard new-jobs workflow with this article's 100 companies and 27 keywords already filled in, one keyword per line (several of them contain commas). The plain version, for your own list, is <a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/files/new-company-jobs-to-slack.json">new-company-jobs-to-slack.json</a>.</p>
<p>Setup takes about five minutes:</p>
<ol>
<li><p>In n8n, open <strong>Workflows &gt; Import from file</strong> and pick the JSON.</p>
</li>
<li><p>The workflow uses the verified Apify node (<code>@apify/n8n-nodes-apify</code>). n8n Cloud installs it from the canvas; on self-hosted n8n, add it under <strong>Settings &gt; Community nodes</strong>.</p>
</li>
<li><p>In the Apify node, create an <strong>Apify API</strong> credential with your token from the Apify console (<strong>Settings &gt; API &amp; Integrations</strong>).</p>
</li>
<li><p>In <strong>Post to Slack</strong>, pick your Slack credential and the channel.</p>
</li>
<li><p>Edit <strong>Companies and filters</strong> for your own accounts. Run it once by hand: the first run returns every open job that matches and posts the first 40 (the rest are in the run's dataset on Apify). From the next morning you only see new ones.</p>
</li>
</ol>
<p>For a list instead of a feed, swap the Slack node for <strong>Google Sheets &gt; Append row</strong> and map <code>company</code>, <code>title</code>, <code>location</code>, <code>postedAt</code>, <code>salaryMin</code>, <code>salaryMax</code>, <code>salaryCurrency</code> and <code>url</code>.</p>
<p>One limit to know: on Apify's free plan a run returns up to 100 jobs, and any paid Apify plan removes the cap. On the free plan the first run of this list would stop at 100 of the 227; the rest arrive with the next runs, because <code>onlyNew</code> only remembers jobs it has actually returned. After that, a daily run is far below 100.</p>
<h2>If you work from Claude Code or another MCP client</h2>
<p>With the Apify MCP server connected, this prompt does the same job and gives you a table:</p>
<pre><code class="language-text">Use the Apify Actor locaihost/careers-jobs. Companies: the boards in recipe-1-companies.txt.
titleKeywords: revenue operations, revops, sales operations, deal desk, sales enablement,
sales compensation, gtm systems, head of sales, vp of sales, sales director, regional vice president,
chief revenue. includeDescription false, onlyNew false. Before running, tell me how many companies
you are sending; the price is $1.50 per 1,000 jobs. After the run, group the jobs by company into two
counts (RevOps and sales ops vs sales leadership), list any title that is clearly not a sales or
revenue role, and give me the 15 companies with the most matching jobs and their newest posting date.
</code></pre>
<h2>More ways to use the hiring signal</h2>
<ul>
<li><p><strong>Your own customers.</strong> Put your customer list in <code>companies</code>. A new sales compensation or GTM systems hire at a customer means a tool review is coming; be in it.</p>
</li>
<li><p><strong>Competitor displacement.</strong> Add <code>keywords: ["salesforce cpq"]</code> or the name of a competitor's product. <code>keywords</code> searches the job text as well as the title (turn <code>includeDescription</code> back on to see the line), so you learn which accounts run the tool you replace.</p>
</li>
<li><p><strong>Region launches.</strong> <code>locations: ["Japan", "Tokyo"]</code> or <code>["Germany", "DACH"]</code> on the leadership keywords shows who is opening a country, before the press release.</p>
</li>
<li><p><strong>Recruiting.</strong> Agencies: the leadership column is a list of hiring managers about to need a team. Swap the keywords to <code>account executive</code> and <code>sales development</code> to see the volume roles.</p>
</li>
<li><p><strong>Job seekers.</strong> Drop the company list down to the twenty places you would join, set <code>withSalaryOnly: true</code>, and run it daily. You get the posting the morning it appears, with the pay range.</p>
</li>
<li><p><strong>Other functions.</strong> The method is one field. <code>titleKeywords: ["data engineer", "analytics engineer"]</code> is a list for data tooling, <code>["payroll", "people operations"]</code> for HR software, <code>["procurement", "sourcing"]</code> for spend management.</p>
</li>
</ul>
<h2>Notes</h2>
<ul>
<li><p><strong>The sample.</strong> 100 B2B software companies we picked by hand from the 300 tech employers whose job boards we confirmed for an <a href="https://locaihost.org/blog/careers-pages-oct-2026/">earlier analysis</a>. Big platforms, developer tools, data and security software, HR and finance software. It is not a random sample of SaaS.</p>
</li>
<li><p><strong>The run.</strong> Run <code>wLJP9qnbf3BdkJf3r</code> on 14 October 2026 at 16:53 UTC, then run <code>shW3oBZWh8Txc6rru</code> with the same input. Boards answered: Greenhouse 151 jobs, Ashby 74, Lever 1, Teamtailor 1.</p>
</li>
<li><p><strong>A posting is not a hire.</strong> One ad can cover several openings, some ads stay up for months, and a few are internships. A Mirakl sales enablement internship first published in October 2025 was still open.</p>
</li>
<li><p><strong>Reproduce it.</strong> The <a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/analysis/recipe-1-companies.txt">company list</a>, the <a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/analysis/recipe-1-run.mjs">run script</a> and the <a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/analysis/recipe-1-analysis.py">analysis script</a> are next to this post, with the <a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/analysis/results.json">computed results</a>.</p>
</li>
</ul>
<p>If you run this on your own account list, post two numbers in the comments: how many of your accounts had at least one matching job, and how many matches were new after a week. That tells the next reader how often to run it.</p>
<p><em>Source: the public job boards of 100 employers on Greenhouse, Ashby, Lever and Teamtailor, read by locaihost data on 14 October 2026.</em></p>
]]></content:encoded></item><item><title><![CDATA[Which UK public bodies pay their suppliers late? What 675 official payment reports say (2026)]]></title><description><![CDATA[Under the Procurement Act 2023, UK public bodies now publish how fast they pay suppliers. We read all 675 current reports from 620 authorities....]]></description><link>https://locaihost.hashnode.dev/which-uk-public-bodies-pay-their-suppliers-late-what-675-official-payment-reports-say-2026</link><guid isPermaLink="true">https://locaihost.hashnode.dev/which-uk-public-bodies-pay-their-suppliers-late-what-675-official-payment-reports-say-2026</guid><category><![CDATA[#OpenData]]></category><category><![CDATA[UK]]></category><category><![CDATA[government]]></category><category><![CDATA[data]]></category><dc:creator><![CDATA[locaihost data]]></dc:creator><pubDate>Mon, 19 Oct 2026 12:28:07 GMT</pubDate><content:encoded><![CDATA[<p><em>Originally published on <a href="https://locaihost.org/blog/uk-late-payers-2026/">locaihost.org</a>, where the charts and data files live.</em></p>
<p>The Procurement Act 2023 came into force in England, Wales and Northern Ireland on 24 February 2025. One of its quieter rules (section 69) says a contracting authority must publish a <em>payments compliance notice</em> for every six-month period. The notice says what share of invoices it paid within 30 days, within 31 to 60 days and after 60 days, its average days to pay, and how much of what fell due it had not paid. The first notices appeared on the government's Find a Tender service in April 2026. By 14 October 2026 there were 714, from 620 authorities. 39 of them were later corrected, which leaves 675 current reports.</p>
<p>These are the authorities' own figures, published as official notices. We have not audited them, and the notes below explain where they are hard to compare. What follows is what each body reported.</p>
<p>Five findings:</p>
<ul>
<li><strong>The typical public body reported paying 94% of invoices within 30 days.</strong> Across the 514 reports for October 2025 to March 2026 that give the figure, the median authority paid 94.1% within 30 days and took 17 days on average. 236 (45.9%) reported 95% or more, and 50 reported 100%.</li>
<li><strong>One in six paid less than 80% on time.</strong> 85 of the 514 (16.5%) reported paying fewer than 80% of invoices within 30 days, and 10 reported fewer than half.</li>
<li><strong>Universities and housing associations reported the slowest payment.</strong> Universities and colleges had a median of 81.5% within 30 days and 26 days on average, and 8 of their 20 reports were below 80%. Housing associations and council housing companies had a median of 87.4% and 24 days, with 27 of 83 below 80%. Central government and national bodies (96.5%, 10 days) and councils (96.0%, 14 days) reported the fastest.</li>
<li><strong>London's councils reported paying more slowly than councils elsewhere in England.</strong> The median London council paid 92.8% within 30 days. In the East of England the figure was 97.6%.</li>
<li><strong>Of the 41 bodies that have now reported twice, 14 got worse and 9 got better.</strong> The largest falls were at Newlon Housing Trust (down 15 points), Connexus Homes (down 14.3) and the Victoria and Albert Museum (down 10.3). The April to September 2026 reports are due by about 30 October, so most authorities will have a second report within weeks.</li>
</ul>


<h2>How the reports are spread</h2>
<table>
<thead>
<tr>
<th>Paid within 30 days</th>
<th>Reports</th>
<th>Share</th>
</tr>
</thead>
<tbody><tr>
<td>100%</td>
<td>50</td>
<td>9.7%</td>
</tr>
<tr>
<td>95% to 99.9%</td>
<td>186</td>
<td>36.2%</td>
</tr>
<tr>
<td>90% to 94.9%</td>
<td>102</td>
<td>19.8%</td>
</tr>
<tr>
<td>80% to 89.9%</td>
<td>91</td>
<td>17.7%</td>
</tr>
<tr>
<td>50% to 79.9%</td>
<td>75</td>
<td>14.6%</td>
</tr>
<tr>
<td>Under 50%</td>
<td>10</td>
<td>1.9%</td>
</tr>
</tbody></table>
<p><em>October 2025 to March 2026, 514 reports that give a within-30-days figure. Every contract scope.</em></p>
<p>Most of what is paid late is paid within two months. The median report put 1.0% of invoices at more than 60 days, and the median share of payments that fell due but were not made was 0.8%.</p>
<h2>How much gets paid late</h2>
<p>We can't put a pound figure on it. A payments compliance notice gives percentages of invoices, and no notice gives the number of invoices or their value, so there is no way to weight a council paying a few thousand invoices against a department paying hundreds of thousands. What the reports do allow is a simple average. Across the 514 reports, an average of 10.8% of invoices were paid after 30 days (the mean on-time share is 89.2%). That treats every authority equally, so it describes the typical public body, not the typical pound.</p>
<h2>By type of authority</h2>
<p>Find a Tender only sorts authorities into three broad types (central government, sub-central government and public undertakings), so we grouped them by name: councils, NHS bodies, housing associations and so on. The groups and the method are in the notes at the end.</p>
<table>
<thead>
<tr>
<th>Type of authority</th>
<th>Reports</th>
<th>Median paid within 30 days</th>
<th>Median average days</th>
<th>Below 80%</th>
</tr>
</thead>
<tbody><tr>
<td>Central government and national bodies</td>
<td>105</td>
<td>96.5%</td>
<td>10</td>
<td>9 (8.6%)</td>
</tr>
<tr>
<td>Councils</td>
<td>160</td>
<td>96.0%</td>
<td>14</td>
<td>10 (6.2%)</td>
</tr>
<tr>
<td>Combined authorities and other local bodies</td>
<td>22</td>
<td>94.6%</td>
<td>17</td>
<td>4 (18.2%)</td>
</tr>
<tr>
<td>Police and fire</td>
<td>35</td>
<td>94.0%</td>
<td>20</td>
<td>5 (14.3%)</td>
</tr>
<tr>
<td>NHS bodies</td>
<td>58</td>
<td>91.0%</td>
<td>23</td>
<td>14 (24.1%)</td>
</tr>
<tr>
<td>Council-owned companies and other bodies</td>
<td>12</td>
<td>89.5%</td>
<td>23</td>
<td>5 (41.7%)</td>
</tr>
<tr>
<td>Transport operators</td>
<td>19</td>
<td>89.0%</td>
<td>23</td>
<td>3 (15.8%)</td>
</tr>
<tr>
<td>Housing associations and council housing companies</td>
<td>83</td>
<td>87.4%</td>
<td>24</td>
<td>27 (32.5%)</td>
</tr>
<tr>
<td>Universities and colleges</td>
<td>20</td>
<td>81.5%</td>
<td>26</td>
<td>8 (40.0%)</td>
</tr>
</tbody></table>
<p><em>October 2025 to March 2026, 514 reports. Average days rounded to the nearest day.</em></p>


<p>Housing associations and universities are not government departments. They publish these notices because the Act counts them as contracting authorities, for example where they are mainly publicly funded or under public control. Several of them report only on contracts let under the new Act (see the notes on scope).</p>
<h2>Lowest and highest reported</h2>
<p>These lists use only reports that cover all of an authority's contracts, including those signed before the Act, so that like is compared with like (409 reports for October 2025 to March 2026).</p>
<table>
<thead>
<tr>
<th>#</th>
<th>Authority</th>
<th>Type</th>
<th>Paid within 30 days</th>
<th>Paid after 60 days</th>
<th>Average days</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Newlon Housing Trust</td>
<td>Housing</td>
<td>0%</td>
<td>95%</td>
<td>191</td>
</tr>
<tr>
<td>2</td>
<td>Northern Trains Limited</td>
<td>Transport</td>
<td>32.3%</td>
<td>9.4%</td>
<td>46</td>
</tr>
<tr>
<td>3</td>
<td>University of Leicester</td>
<td>University</td>
<td>35%</td>
<td>10%</td>
<td>39</td>
</tr>
<tr>
<td>4</td>
<td>NPL Management Limited</td>
<td>National body</td>
<td>52%</td>
<td>10%</td>
<td>40</td>
</tr>
<tr>
<td>5</td>
<td>DFT Operator Limited</td>
<td>Transport</td>
<td>55.2%</td>
<td>8.3%</td>
<td>34</td>
</tr>
<tr>
<td>6</td>
<td>South Bank University Enterprises Ltd</td>
<td>University</td>
<td>55.9%</td>
<td>15.4%</td>
<td>41</td>
</tr>
<tr>
<td>7</td>
<td>Havant Borough Council</td>
<td>Council</td>
<td>57.0%</td>
<td>11%</td>
<td>40</td>
</tr>
<tr>
<td>8</td>
<td>Liverpool Experience Campus Ltd</td>
<td>Central government (as listed)</td>
<td>57.9%</td>
<td>2.4%</td>
<td>30</td>
</tr>
<tr>
<td>9</td>
<td>Vico Homes Limited</td>
<td>Housing</td>
<td>61%</td>
<td>18%</td>
<td>46</td>
</tr>
<tr>
<td>10</td>
<td>Supply Chain Coordination Limited</td>
<td>NHS</td>
<td>62%</td>
<td>1%</td>
<td>31</td>
</tr>
<tr>
<td>10</td>
<td>Trydan Gwyrdd Cymru Ltd</td>
<td>National body</td>
<td>62%</td>
<td>1%</td>
<td>29</td>
</tr>
</tbody></table>
<p><em>Lowest share of invoices paid within 30 days, October 2025 to March 2026, reports covering all contracts. Ties are listed together. Newlon Housing Trust's report for this period was corrected twice, and the first version gave 100% within 30 days. Its separate report for January to March 2026 gives 35%, and its April to September 2026 report gives 20%. All three were published on 30 September 2026.</em></p>
<table>
<thead>
<tr>
<th>#</th>
<th>Authority</th>
<th>Type</th>
<th>Paid within 30 days</th>
<th>Average days</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Government Commercial Agency</td>
<td>Central government</td>
<td>100%</td>
<td>3.2</td>
</tr>
<tr>
<td>2</td>
<td>Restoration and Renewal Delivery Authority Ltd</td>
<td>Central government</td>
<td>100%</td>
<td>3.5</td>
</tr>
<tr>
<td>3</td>
<td>HMRC Valuation Office</td>
<td>Central government</td>
<td>100%</td>
<td>3.7</td>
</tr>
<tr>
<td>4</td>
<td>UK Hydrographic Office</td>
<td>Central government</td>
<td>100%</td>
<td>5.0</td>
</tr>
<tr>
<td>5</td>
<td>Mid Sussex District Council</td>
<td>Council</td>
<td>100%</td>
<td>6.0</td>
</tr>
<tr>
<td>6</td>
<td>Lancashire Combined County Authority</td>
<td>Combined authority</td>
<td>100%</td>
<td>7.0</td>
</tr>
<tr>
<td>7</td>
<td>Folkestone and Hythe District Council</td>
<td>Council</td>
<td>100%</td>
<td>9.8</td>
</tr>
<tr>
<td>8</td>
<td>Tunbridge Wells Borough Council</td>
<td>Council</td>
<td>100%</td>
<td>10.4</td>
</tr>
<tr>
<td>9</td>
<td>Transport for Wales Rail Ltd</td>
<td>Transport</td>
<td>100%</td>
<td>23.7</td>
</tr>
<tr>
<td>10</td>
<td>HM Revenue and Customs</td>
<td>Central government</td>
<td>99.99%</td>
<td>3.9</td>
</tr>
</tbody></table>
<p><em>Highest share of invoices paid within 30 days, then fewest average days. October 2025 to March 2026, reports covering all contracts. 41 more reports in this period gave 100%, but they cover only contracts let under the new Act.</em></p>
<p>The longest average waits, among reports covering all contracts, were at Newlon Housing Trust (191 days), Southwark Council (61 days, with 71.5% paid within 30 days), Notting Hill Genesis (49 days), and Golden Lane Housing and the Royal Borough of Windsor and Maidenhead (48 days each). An average can sit well above the 30-day line while most invoices are paid within it, because a few very old invoices pull it up.</p>
<h2>London and the rest of England</h2>
<p>Councils are the one group where an authority's location says something about the area it serves. Each notice carries the authority's own region code, so we grouped councils by English region. We left out other bodies: a national body's head office says little about where it spends.</p>
<table>
<thead>
<tr>
<th>Region</th>
<th>Councils reporting</th>
<th>Median paid within 30 days</th>
<th>Median average days</th>
<th>Below 80%</th>
</tr>
</thead>
<tbody><tr>
<td>East of England</td>
<td>28</td>
<td>97.6%</td>
<td>12</td>
<td>0</td>
</tr>
<tr>
<td>South East</td>
<td>31</td>
<td>97.0%</td>
<td>13</td>
<td>2</td>
</tr>
<tr>
<td>West Midlands</td>
<td>17</td>
<td>97.0%</td>
<td>11</td>
<td>1</td>
</tr>
<tr>
<td>North East</td>
<td>7</td>
<td>96.9%</td>
<td>12</td>
<td>0</td>
</tr>
<tr>
<td>East Midlands</td>
<td>15</td>
<td>95.7%</td>
<td>18</td>
<td>2</td>
</tr>
<tr>
<td>North West</td>
<td>19</td>
<td>95.2%</td>
<td>14</td>
<td>1</td>
</tr>
<tr>
<td>South West</td>
<td>10</td>
<td>95.2%</td>
<td>18</td>
<td>0</td>
</tr>
<tr>
<td>Yorkshire and the Humber</td>
<td>11</td>
<td>94.0%</td>
<td>15</td>
<td>0</td>
</tr>
<tr>
<td>London</td>
<td>22</td>
<td>92.8%</td>
<td>16</td>
<td>4</td>
</tr>
</tbody></table>
<p><em>October 2025 to March 2026, 160 council reports. Some regions have few reports, so small gaps between them mean little. No council in Wales, Scotland or Northern Ireland has published a payments compliance notice so far. Scottish devolved authorities follow their own procurement rules.</em></p>


<h2>Who got better or worse</h2>
<p>41 authorities now have two reports for consecutive periods, almost all October 2025 to March 2026 followed by April to September 2026. On the first figure both reports give, 14 got worse, 9 got better and 18 changed by less than one point.</p>
<table>
<thead>
<tr>
<th>Authority</th>
<th>Before</th>
<th>After</th>
<th>Change</th>
<th>Average days, before → after</th>
</tr>
</thead>
<tbody><tr>
<td>Newlon Housing Trust</td>
<td>35%</td>
<td>20%</td>
<td>−15.0 pts</td>
<td>49 → 63</td>
</tr>
<tr>
<td>Connexus Homes Limited</td>
<td>80.8%</td>
<td>66.5%</td>
<td>−14.3 pts</td>
<td>30 → 51</td>
</tr>
<tr>
<td>Victoria and Albert Museum</td>
<td>87.5%</td>
<td>77.2%</td>
<td>−10.3 pts</td>
<td>15 → 25</td>
</tr>
<tr>
<td>Lee Valley Regional Park Authority</td>
<td>95%</td>
<td>86%</td>
<td>−9.0 pts</td>
<td>20 → 20</td>
</tr>
<tr>
<td>Nottingham City Council</td>
<td>65.9%</td>
<td>59.3%</td>
<td>−6.5 pts</td>
<td>24 → 26</td>
</tr>
<tr>
<td>Police and Crime Commissioner for Durham</td>
<td>95.2%</td>
<td>90.1%</td>
<td>−5.2 pts</td>
<td>16 → 14</td>
</tr>
<tr>
<td>Healthcare Quality Improvement Partnership</td>
<td>95.2%</td>
<td>99.1%</td>
<td>+3.9 pts</td>
<td>21 → 22</td>
</tr>
<tr>
<td>Corporation of Trinity House</td>
<td>92.4%</td>
<td>94.9%</td>
<td>+2.5 pts</td>
<td>12 → 10</td>
</tr>
<tr>
<td>New Forest District Council</td>
<td>94.5%</td>
<td>96.6%</td>
<td>+2.1 pts</td>
<td>15 → 14</td>
</tr>
<tr>
<td>Sandwell and West Birmingham Hospitals NHS Trust</td>
<td>90%</td>
<td>92%</td>
<td>+2.0 pts</td>
<td>24 → 12</td>
</tr>
<tr>
<td>Havebury Homes</td>
<td>95.6%</td>
<td>97.2%</td>
<td>+1.6 pts</td>
<td>16 → 16</td>
</tr>
<tr>
<td>Kirklees Council</td>
<td>92.5%</td>
<td>94.1%</td>
<td>+1.6 pts</td>
<td>19 → 18</td>
</tr>
</tbody></table>
<p><em>Share of invoices paid within 30 days. Newlon Housing Trust's earlier period is January to March 2026; all the others compare October 2025 to March 2026 with April to September 2026.</em></p>
<p>Among the first 48 April to September reports, the lowest were Newlon Housing Trust (20%), Hafod Housing Association (56%), Nottingham City Council (59.3%), WM Trains (66%) and Connexus Homes (66.5%).</p>
<h2>Methodology and caveats</h2>
<ul>
<li><strong>Source.</strong> Every payments compliance notice (form UK17) published on Find a Tender up to 14 October 2026, read through its open organisation release API. That is 714 notices, 39 of them replaced by later corrections, which leaves 675 current reports from 620 authorities. Only the latest version of a corrected report is used. We collected the notices with the uk-procurement-act scraper we maintain on Apify and checked every figure against the raw notices from the API.</li>
<li><strong>Periods.</strong> Most reports (533) cover October 2025 to March 2026. 93 cover only January to March 2026, usually an authority's first, shorter period, and 49 cover April to September 2026. The rankings, the type breakdown and the regional view use October 2025 to March 2026 only, so they compare six-month periods with each other.</li>
<li><strong>Scope.</strong> An authority can report on all its contracts (496 reports), only on contracts let under the Procurement Act 2023 above the threshold (142), or on all Procurement Act contracts (37). Reports limited to new-Act contracts can rest on very few invoices, which is how three of them came to report 0% within 30 days. The lowest and highest tables use only all-contract reports; the overall figures use every scope.</li>
<li><strong>What's left out.</strong> 26 reports contain only zeros, usually because nothing fell due, and 11 give only the on-terms and unpaid figures without a within-30-days share. Neither is ranked. We also don't use the statutory "paid on terms" figure, because 7 current reports give 0% on terms while their own day counts show invoices paid within 30 days.</li>
<li><strong>Types of authority.</strong> Find a Tender lists only three types, so we grouped authorities by keywords in their names (NHS, council, police, fire, university and so on) and a list of known housing associations and national regulators. Anything we couldn't place by name kept Find a Tender's own type. A few judgement calls are unavoidable. For example, arm's-length housing companies owned by councils count as housing, and council-owned service companies count as other bodies.</li>
<li><strong>Regions.</strong> Each notice carries the authority's own ITL (formerly NUTS) region code. We used its first level and only for councils.</li>
<li><strong>Change.</strong> "Before" is the same authority's most recent earlier period that ended before the new one began. A change of under one point counts as unchanged.</li>
<li><strong>People.</strong> The notices name the officer who approved each report. We never collected those names or the free-text narratives, and this article names organisations only.</li>
<li><strong>Not a judgement.</strong> These are figures the authorities published about themselves. A low figure can reflect disputed or wrongly addressed invoices, a changeover in finance systems or a data-entry error, and some authorities explain theirs in the notice's narrative. Each notice is on Find a Tender.</li>
</ul>


<p><em>Contains public sector information licensed under the Open Government Licence v3.0. Source: Find a Tender service (UK Cabinet Office), payments compliance notices read on 14 October 2026.</em></p>
<hr />
]]></content:encoded></item><item><title><![CDATA[A tech-stack signal: 500 Shopify stores checked for $0.48, and the 36 on Klaviyo with no review app]]></title><description><![CDATA[Which online stores use Klaviyo but no review app, Mailchimp but not Klaviyo, or no email tool at all, read from their own homepages and DNS at $1...]]></description><link>https://locaihost.hashnode.dev/a-tech-stack-signal-500-shopify-stores-checked-for-0-48-and-the-36-on-klaviyo-with-no-review-app</link><guid isPermaLink="true">https://locaihost.hashnode.dev/a-tech-stack-signal-500-shopify-stores-checked-for-0-48-and-the-36-on-klaviyo-with-no-review-app</guid><category><![CDATA[automation]]></category><category><![CDATA[api]]></category><category><![CDATA[sales]]></category><category><![CDATA[data]]></category><dc:creator><![CDATA[locaihost data]]></dc:creator><pubDate>Sun, 18 Oct 2026 12:28:10 GMT</pubDate><content:encoded><![CDATA[<p><em>Originally published on <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/">locaihost.org</a>, where the charts and data files live.</em></p>
<p>If you sell a Shopify app, run an e-commerce agency or sell anything that plugs into an online store, the best prospect list is defined by what a store already uses and what it doesn't. A store that pays for Klaviyo already spends on retention, so a review app or an SMS tool is an easy next conversation. A store still on Mailchimp is a migration project for a Klaviyo agency. A store with no email tool at all is a different pitch again.</p>
<p>The usual tool for this is a technology database like BuiltWith, which indexes the whole web. That is the right tool when you need every site that uses something. Its Basic plan is $295 a month for two technologies, with a one-month minimum. If you already have the list of domains (a CRM export, a lead list, a public ranking), you don't need the database. You need each domain checked once, and you can pay for that per domain.</p>
<p>We did that for 500 Shopify stores on 14 October 2026 with our <strong><a href="https://apify.com/locaihost/domain-intel">domain-intel</a></strong> Actor on Apify. It reads each domain's public DNS records and one page, the homepage, and recognises 3,111 technologies. It costs $1 per 1,000 domains, so 0.1 cents a store. Every number below is from that run.</p>
<h2>Step 1: a list of Shopify stores, for free</h2>
<p>You can bring your own list. We wanted one anyone can rebuild, so we started from the <a href="https://tranco-list.eu/">Tranco list</a>, a research ranking of the most visited sites, in its 13 October 2026 edition (<code>N26LW</code>).</p>
<p>Shopify serves stores on custom domains from one address block, <code>23.227.38.0/24</code>, the address its help pages tell merchants to point their domain at. So a DNS lookup sorts a domain list for free: if the domain's A record is in that block, it is a Shopify storefront. We looked up the top 100,000 domains, found 921 on that block (Shopify's own domains left out), and took the 500 highest ranked, from rank 2,175 (barnesandnoble.com) to 75,938.</p>
<p>The method misses stores that put their own CDN in front of Shopify, but it doesn't add wrong ones: of the 470 homepages the Actor could read, 469 showed Shopify. The script is <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-list.mjs">recipe-2-list.mjs</a>; it reads DNS only and visits no website.</p>
<h2>The input</h2>
<pre><code class="language-json">{
  "domains": ["barnesandnoble.com", "nanit.com", "wyze.com", "daisonet.com", "chiikawamarket.jp"]
}
</code></pre>
<p>That is the whole input, with the full 500 in <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-domains.txt">recipe-2-domains.txt</a>. Three notes:</p>
<ul>
<li><code>domains</code> takes bare domains, full URLs or email addresses. Each is cut down to its registrable domain and duplicates are merged, so a column of work emails from a CRM works as it is.</li>
<li><code>checkWebsite</code>, <code>checkSsl</code> and <code>checkRegistration</code> are all on by default. The tech stack needs <code>checkWebsite</code>. Turn the other two off if you only want the stack; the price is the same.</li>
<li>Each website gets one robots.txt request and one homepage request. The Actor runs no JavaScript, so it sees what the page's HTML and headers name, not what a browser loads later.</li>
</ul>
<h2>What came back</h2>
<ul>
<li><strong>484 rows from 500 domains in 7 minutes 12 seconds.</strong> 16 homepages didn't answer within 120 seconds; they return no row and cost nothing. At $1 per 1,000 domains plus a $0.00005 start fee, the run costs $0.48 on Apify's free or Starter plan, $0.36 on Scale and $0.27 on Business.</li>
<li><strong>470 homepages were read.</strong> 10 answered with a bot-protection page and 4 timed out; those rows still have the DNS and email columns, with empty tech columns.</li>
<li><strong>268 of the 470 stores (57%) show an email or SMS marketing tool. Klaviyo alone is on 218 (46%).</strong> Mailchimp is on 34, HubSpot 11, Brevo 10.</li>
<li><strong>140 (30%) show a review app on the homepage</strong>, led by Yotpo (70) and Trustpilot (22).</li>
<li><strong>Email is hosted on Google Workspace at 196 of the 484 domains and Microsoft 365 at 164.</strong> 30 more receive mail through a filtering service such as Proofpoint or Mimecast, which hides the host behind it.</li>
<li><strong>DMARC, the DNS record that tells mailbox providers what to do with mail that fails sender checks: 111 domains reject, 134 quarantine, 215 only monitor (<code>p=none</code>) and 24 publish no record.</strong></li>
</ul>
<p>The stack, by category. Counts are stores out of the 470 homepages read; a store can use several tools in one category.</p>
<table>
<thead>
<tr>
<th>Category</th>
<th>Stores</th>
<th>Most common tools</th>
</tr>
</thead>
<tbody><tr>
<td>Email and SMS marketing</td>
<td>268</td>
<td>Klaviyo 218, Mailchimp 34, HubSpot 11, Brevo 10</td>
</tr>
<tr>
<td>Analytics</td>
<td>257</td>
<td>Microsoft Clarity 156, Google Analytics 73, Hotjar 30, TikTok Pixel 25</td>
</tr>
<tr>
<td>Live chat and support</td>
<td>208</td>
<td>Zendesk 122, Gorgias 47, WhatsApp chat 43, Zendesk Chat 26</td>
</tr>
<tr>
<td>Reviews</td>
<td>140</td>
<td>Yotpo 70, Trustpilot 22, Loox 13, Stamped 10, PowerReviews 9</td>
</tr>
<tr>
<td>Cookie consent</td>
<td>110</td>
<td>OneTrust 52, Cookiebot 23, Osano 11, Usercentrics 10</td>
</tr>
<tr>
<td>Advertising</td>
<td>97</td>
<td>Google Ads 60, Microsoft Advertising 31</td>
</tr>
<tr>
<td>Buy now, pay later</td>
<td>63</td>
<td>Klarna 48, Afterpay 13</td>
</tr>
<tr>
<td>A/B testing</td>
<td>41</td>
<td>VWO 12, Optimizely 9, Yottaa 6</td>
</tr>
</tbody></table>
<h2>Sample rows</h2>
<p>Ten of the 484, by Tranco rank. The review column is what the homepage shows.</p>
<table>
<thead>
<tr>
<th>Store</th>
<th>Tranco rank</th>
<th>Email marketing</th>
<th>Reviews</th>
<th>Support</th>
<th>Email host</th>
<th>DMARC</th>
</tr>
</thead>
<tbody><tr>
<td>nanit.com</td>
<td>4,229</td>
<td>Mailchimp</td>
<td>Yotpo</td>
<td>Zendesk</td>
<td>not identified</td>
<td>quarantine</td>
</tr>
<tr>
<td>wyze.com</td>
<td>6,316</td>
<td>Klaviyo</td>
<td>none seen</td>
<td>Zendesk</td>
<td>Microsoft 365</td>
<td>quarantine</td>
</tr>
<tr>
<td>fashionnova.com</td>
<td>11,897</td>
<td>none seen</td>
<td>none seen</td>
<td>none seen</td>
<td>Google Workspace</td>
<td>quarantine</td>
</tr>
<tr>
<td>indigo.ca</td>
<td>14,296</td>
<td>none seen</td>
<td>Yotpo</td>
<td>none seen</td>
<td>Microsoft 365</td>
<td>reject</td>
</tr>
<tr>
<td>stanley1913.com</td>
<td>14,657</td>
<td>Klaviyo</td>
<td>Yotpo</td>
<td>none seen</td>
<td>Microsoft 365</td>
<td>reject</td>
</tr>
<tr>
<td>withings.com</td>
<td>16,586</td>
<td>none seen</td>
<td>none seen</td>
<td>Zendesk</td>
<td>Google Workspace</td>
<td>reject</td>
</tr>
<tr>
<td>nanoleaf.me</td>
<td>18,586</td>
<td>Klaviyo</td>
<td>Judge.me</td>
<td>Zendesk</td>
<td>Microsoft 365</td>
<td>reject</td>
</tr>
<tr>
<td>gooutdoors.co.uk</td>
<td>18,722</td>
<td>none seen</td>
<td>Trustpilot, Yotpo</td>
<td>none seen</td>
<td>Microsoft 365</td>
<td>none</td>
</tr>
<tr>
<td>society6.com</td>
<td>19,636</td>
<td>Klaviyo, Mailchimp</td>
<td>none seen</td>
<td>Gorgias, Zendesk</td>
<td>Google Workspace</td>
<td>quarantine</td>
</tr>
<tr>
<td>scholl-shoes.com</td>
<td>19,697</td>
<td>Klaviyo</td>
<td>Yotpo</td>
<td>Zendesk</td>
<td>Google Workspace</td>
<td>none</td>
</tr>
</tbody></table>
<p>Each row also carries the DNS host, MX records, SPF record, the full DMARC record (report addresses masked), CDN, hosting, every detected technology with its category and a confidence score, SSL issuer and days to expiry, and the registrar with creation and expiry dates. No registrant or contact details are collected. The flat version of all 484 is <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/stores.csv">stores.csv</a>.</p>
<h2>The segment: Klaviyo, but no review app</h2>
<p>The query is one line: Klaviyo in the email column and nothing in the reviews column. On the homepage data that gives <strong>133 of the 218 Klaviyo stores</strong>. It looks like a great list for a review app. It mostly isn't, and this is the most useful thing we learned from the run.</p>
<p>Review widgets live on product pages. Many stores never show stars on the homepage. So we ran a free second pass: for each of the 133, open one product page and look for review apps there. It is <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-product-check.py">recipe-2-product-check.py</a>, about 140 lines. It uses Shopify's public <code>/products.json</code> to find one product, respects robots.txt and makes three requests per store.</p>
<ul>
<li><strong>125 of the 133 product pages were read. 89 of them had reviews</strong>: Judge.me on 30, REVIEWS.io on 13, Yotpo 10, Okendo 9, Trustpilot 8, Bazaarvoice 7, other review apps or the theme's own reviews block on the rest. Wyze, August and Lockly use Bazaarvoice; NZXT and Society6 use Okendo.</li>
<li><strong>36 stores have Klaviyo and no reviews on either page.</strong> That is the real list, a quarter of the first answer.</li>
<li><strong>Klaviyo itself was on all 125 product pages too.</strong> Site-wide tools like an email platform, a chat widget or a consent banner load on every page, so the homepage read is right for them. Page-specific tools need the second pass.</li>
</ul>
<p>The first ten of the 36, by Tranco rank:</p>
<table>
<thead>
<tr>
<th>Store</th>
<th>Tranco rank</th>
<th>Email marketing</th>
<th>Support</th>
<th>Email host</th>
<th>DMARC</th>
</tr>
</thead>
<tbody><tr>
<td>mova-tech.com</td>
<td>11,216</td>
<td>Klaviyo</td>
<td>Zendesk</td>
<td>Lark Mail</td>
<td>none</td>
</tr>
<tr>
<td>jbhifi.com.au</td>
<td>15,545</td>
<td>Klaviyo, Insider, Mailchimp, Salesforce</td>
<td>none seen</td>
<td>behind Proofpoint</td>
<td>quarantine</td>
</tr>
<tr>
<td>lacrossetechnology.com</td>
<td>27,623</td>
<td>Klaviyo</td>
<td>Zendesk</td>
<td>Microsoft 365</td>
<td>quarantine</td>
</tr>
<tr>
<td>mammotion.com</td>
<td>28,602</td>
<td>Klaviyo</td>
<td>Zendesk</td>
<td>Microsoft 365</td>
<td>none</td>
</tr>
<tr>
<td>vistaexpert.it</td>
<td>28,718</td>
<td>Klaviyo</td>
<td>none seen</td>
<td>own mail server</td>
<td>none</td>
</tr>
<tr>
<td>benetton.com</td>
<td>28,766</td>
<td>Klaviyo</td>
<td>none seen</td>
<td>Microsoft 365</td>
<td>quarantine</td>
</tr>
<tr>
<td>fashionphile.com</td>
<td>29,703</td>
<td>Klaviyo</td>
<td>none seen</td>
<td>Google Workspace</td>
<td>reject</td>
</tr>
<tr>
<td>forever21.com</td>
<td>31,843</td>
<td>Klaviyo</td>
<td>Gorgias</td>
<td>Google Workspace</td>
<td>quarantine</td>
</tr>
<tr>
<td>aldoshoes.com</td>
<td>35,359</td>
<td>Klaviyo</td>
<td>none seen</td>
<td>Microsoft 365</td>
<td>none</td>
</tr>
<tr>
<td>phaidon.com</td>
<td>36,516</td>
<td>Klaviyo, HubSpot</td>
<td>Zendesk</td>
<td>Microsoft 365</td>
<td>none</td>
</tr>
</tbody></table>
<p><em>All 36 are in <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/segment-klaviyo-no-reviews-confirmed.csv">segment-klaviyo-no-reviews-confirmed.csv</a>; the homepage-only 133 are in <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/segment-klaviyo-no-reviews.csv">segment-klaviyo-no-reviews.csv</a>, with the product-page findings for each in <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/product-check-klaviyo-no-reviews.json">product-check-klaviyo-no-reviews.json</a>.</em></p>
<p>Some of the 36 will still have reviews somewhere: a big retailer like JB Hi-Fi may run its own system, and a few stores load widgets in ways a page read can't see. Look at the product page of anyone you plan to contact. The list is short enough for that.</p>
<h2>More segments from the same run</h2>
<p>The same 484 rows answer other questions with a different filter. None of these cost anything beyond the $0.48.</p>
<table>
<thead>
<tr>
<th>Segment</th>
<th>Stores</th>
<th>Who it is for</th>
</tr>
</thead>
<tbody><tr>
<td>No email or SMS tool on the homepage</td>
<td>202</td>
<td>Email platforms and retention agencies. After the product-page check: 131</td>
</tr>
<tr>
<td>Klaviyo, and DMARC missing or at <code>p=none</code></td>
<td>102</td>
<td>Email deliverability consultants</td>
</tr>
<tr>
<td>A review app, but no email tool</td>
<td>42</td>
<td>Email platforms: the store already collects customer feedback</td>
</tr>
<tr>
<td>Mailchimp, not Klaviyo</td>
<td>16</td>
<td>Klaviyo agencies looking for migration projects</td>
</tr>
<tr>
<td>Klaviyo, and no DMARC record at all</td>
<td>6</td>
<td>Deliverability: Gmail and Yahoo require one from bulk senders</td>
</tr>
</tbody></table>
<p><em>The lists are in the analysis folder: <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/segment-no-email-platform.csv">no email tool</a> and <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/segment-no-email-platform-confirmed.csv">confirmed on a product page</a>, <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/segment-klaviyo-no-dmarc-enforcement.csv">Klaviyo with DMARC missing or p=none</a>, <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/segment-mailchimp-not-klaviyo.csv">Mailchimp, not Klaviyo</a>.</em></p>
<p>The DMARC rows come from DNS, so they don't need a second pass. Since 2024, Gmail has required anyone sending more than 5,000 messages a day to Gmail addresses to publish a DMARC record, and Yahoo has the same rule for bulk senders. <code>p=none</code> meets that rule but only asks for reports; it doesn't stop anyone sending mail in the store's name. Of the 218 Klaviyo stores, 96 are at <code>p=none</code> and 6 have no record. For a store whose revenue depends on its emails landing in the inbox, that is a concrete reason to talk.</p>
<p>The "no email tool" segment shrank less than the reviews one, from 202 to 131: 42 of the 173 product pages we could read showed an email tool the homepage didn't (Attentive on 13, Mailchimp 12, Klaviyo 8, Omnisend 8).</p>
<h2>Read the list once</h2>
<p>Three more things to know before you load it anywhere:</p>
<ul>
<li><strong>What a page read can't see.</strong> Tools added through a tag manager or Shopify's customer-events pixels load after the page, so a one-page read misses them. That is most likely why Google Analytics, which Shopify's own Google app loads as a pixel, shows on only 73 stores while Microsoft Clarity shows on 156. Treat "none seen" as "not on the page", not "not used".</li>
<li><strong>The sample is big brands.</strong> Tranco ranks popularity, so these are well-known stores, 360 of them on <code>.com</code>. A list of small stores from a directory or your own CRM will have a different mix of tools.</li>
<li><strong>Some sites block automated requests.</strong> 10 of the 500 answered with a bot-protection page. The DNS and email columns are still right for those; only the tech columns are empty.</li>
</ul>
<h2>The working version: a sheet that fills itself</h2>
<p>For a list you add to over time, we use an n8n workflow with Google Sheets. You paste domains into a tab, and each morning the new ones get their columns.</p>
<ol>
<li><strong>Schedule Trigger</strong>, every day at 10:00 (and a manual trigger for the first run).</li>
<li><strong>Read the Domains tab</strong> in your Google Sheet.</li>
<li><strong>Pick new domains</strong>: keeps the rows whose <code>checkedAt</code> is empty, so a domain is only paid for once.</li>
<li><strong>Apify, Run actor and get dataset</strong>: runs domain-intel on them, with a $2 cap on the run.</li>
<li><strong>Flatten for the sheet</strong>: one row per domain with <code>emailMarketing</code>, <code>reviews</code>, <code>liveChat</code>, <code>bnpl</code>, <code>cookieConsent</code>, <code>analytics</code>, <code>emailProvider</code>, <code>dmarcPolicy</code> and a <code>klaviyoNoReviewApp</code> flag (true or false).</li>
<li><strong>Write results to the sheet</strong>: updates the same row, matched on <code>domain</code>.</li>
</ol>
<p>Download <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/files/tech-stack-signal-to-google-sheets.json">tech-stack-signal-to-google-sheets.json</a>. It is our standard domains-to-Sheets workflow with this article's columns added, and it leaves <code>checkedAt</code> empty for a domain that didn't answer, so it is tried again the next day at no charge. The plain version is <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/files/domain-tech-and-email-setup-to-google-sheets.json">domain-tech-and-email-setup-to-google-sheets.json</a>.</p>
<p>Setup takes about five minutes:</p>
<ol>
<li>Make a Google Sheet with a tab named <strong>Domains</strong> and two header cells: <code>domain</code> and <code>checkedAt</code>. Paste your domains under <code>domain</code>.</li>
<li>In n8n, open <strong>Workflows &gt; Import from file</strong> and pick the JSON.</li>
<li>The workflow uses the verified Apify node (<code>@apify/n8n-nodes-apify</code>). n8n Cloud installs it from the canvas; on self-hosted n8n, add it under <strong>Settings &gt; Community nodes</strong>.</li>
<li>In the Apify node, create an <strong>Apify API</strong> credential with your token from the Apify console (<strong>Settings &gt; API &amp; Integrations</strong>).</li>
<li>Paste the sheet ID into both Google Sheets nodes and pick your Google credential. Run it once by hand.</li>
</ol>
<p>Then filter the sheet: <code>klaviyoNoReviewApp</code> is TRUE gives the homepage segment, and <code>dmarcPolicy</code> is <code>none</code> or <code>missing</code> gives the deliverability one.</p>
<p>Two limits. The $2 cap covers about 2,000 domains per run; for a bigger first batch, raise it in the Apify node ($1 per 1,000). And on Apify's free plan a run checks up to 100 domains, so a 500-row sheet fills over five mornings; any paid plan removes that cap.</p>
<h2>If you work from Claude Code or another MCP client</h2>
<p>With the Apify MCP server connected, this prompt runs the same check on your own list and builds the segments:</p>
<pre><code class="language-text">Use the Apify Actor locaihost/domain-intel on the domains in domains.txt (one per line).
Before running, tell me how many domains you are sending; the price is $1 per 1,000.
When it finishes, make a table with one row per domain: email marketing tools, review apps,
live chat, buy now pay later, email host and DMARC policy, from techCategories and the DMARC
fields. Mark rows where errors.tech is set as "homepage not read". Then list: stores with
Klaviyo and no review app, stores with no email marketing tool, and stores on Mailchimp but
not Klaviyo. Remind me that review apps usually sit on product pages, so the first list
needs a product-page check before I use it.
</code></pre>
<h2>More ways to use the tech-stack signal</h2>
<ul>
<li><strong>Your own CRM.</strong> Export the website column of your accounts and run it. You learn which customers use a tool you integrate with, and which use a competitor's.</li>
<li><strong>Competitor customers.</strong> Gorgias against Zendesk, Yotpo against Okendo, OneTrust against Cookiebot: each is a filter on one column. A list of stores on a competitor's app is a list of switching conversations.</li>
<li><strong>Partner programmes.</strong> If you build a Klaviyo or Gorgias integration, the stores already paying for that tool are the ones who can install yours today.</li>
<li><strong>IT and email services.</strong> The email host column splits any list into Google Workspace and Microsoft 365 shops before the first call.</li>
<li><strong>Agencies.</strong> Run a prospect's domain and its five closest competitors before a pitch, and open with what they have and the others don't.</li>
<li><strong>Beyond Shopify.</strong> Nothing here is Shopify-only except the free list in step 1 and the product-page pass. The Actor works on any domain: WordPress, Webflow, SaaS companies, local businesses.</li>
</ul>
<h2>Notes</h2>
<ul>
<li><strong>The sample.</strong> The 500 highest-ranked domains in the Tranco top 100,000 (list <code>N26LW</code>, 13 October 2026) whose A record is in Shopify's <code>23.227.38.0/24</code> block: 921 matched, ranks 2,175 to 75,938 were used. It is a list of large, popular stores from many countries, not a random sample of Shopify.</li>
<li><strong>The run.</strong> Run <code>fWhZBzHIOYeybUw0d</code> on 14 October 2026 at 16:54 UTC, 1 GB of memory, 431.7 seconds, 484 domains charged. The product-page pass ran on 15 October 2026.</li>
<li><strong>Detection is evidence, not certainty.</strong> A technology counts only when its own script address, header or markup is on the page, never because a word appears in the text. Each item in <code>techStack</code> carries a confidence score.</li>
<li><strong>Reproduce it.</strong> The <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-list.mjs">list script</a>, <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-run.mjs">run script</a>, <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-analysis.py">analysis script</a> and <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-product-check.py">product-page check</a> are next to this post, with the <a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/results.json">computed results</a>.</li>
</ul>
<p>If you run this on your own list, post two numbers in the comments: how many domains you checked, and how much your first segment shrank after you looked at the product pages. That tells the next reader how far to trust a homepage read.</p>
<p><em>Source: public DNS records, homepages and product pages of 500 Shopify storefronts from the Tranco top 100,000, read by locaihost data on 14 and 15 October 2026.</em></p>
]]></content:encoded></item><item><title><![CDATA[What 300 tech companies' career pages say about hiring in October 2026: salaries, remote work and which ATS they use]]></title><description><![CDATA[We read all 29,816 open jobs on the public job boards of 300 tech companies. 55% show a pay range. In the US, 87% of postings in pay-transparency...]]></description><link>https://locaihost.hashnode.dev/what-300-tech-companies-career-pages-say-about-hiring-in-october-2026-salaries-remote-work-and-which-ats-they-use</link><guid isPermaLink="true">https://locaihost.hashnode.dev/what-300-tech-companies-career-pages-say-about-hiring-in-october-2026-salaries-remote-work-and-which-ats-they-use</guid><category><![CDATA[hiring]]></category><category><![CDATA[salary]]></category><category><![CDATA[Remotework]]></category><category><![CDATA[data]]></category><dc:creator><![CDATA[locaihost data]]></dc:creator><pubDate>Sat, 17 Oct 2026 12:28:26 GMT</pubDate><content:encoded><![CDATA[<p><em>Originally published on <a href="https://locaihost.org/blog/careers-pages-oct-2026/">locaihost.org</a>, where the charts and data files live.</em></p>
<p>Colorado has required a pay range in job ads since 2021. California and Washington followed in 2023, and so did New York, and since 2024 nine more states and DC have brought in similar rules, the latest (Virginia and Maine) in July 2026. We wanted to see what that looks like on employers' own career pages, so on 10 October 2026 we downloaded every open posting from the public job boards of 300 well-known tech companies. That came to 29,816 postings. Every company uses one of five applicant tracking systems (ATS): Greenhouse, Lever, Ashby, Personio or Teamtailor.</p>
<p>Five findings:</p>
<ul>
<li><strong>55% of postings show a pay range, and 76% of US postings do.</strong> 16,469 of the 29,816 postings carried a range. Canada was close to the US at 79%, while postings in the EU (24%), the UK (16%) and India (1%) rarely did.</li>
<li><strong>The law shows up inside the same company.</strong> 86.5% of US postings that list a California, New York, Washington or Colorado location show a range. Only 30.7% of postings that list other states, and none of those four, do. SpaceX put a range on 86% of its 1,546 postings in the four states and on 0.4% of its 1,120 postings elsewhere.</li>
<li><strong>The median US software engineering posting offers $165,000 to $235,000.</strong> That figure comes from 4,333 postings. Machine learning and research roles post $213,000 to $300,000, and customer success and support roles $109,000 to $166,000.</li>
<li><strong>On-site is the most common arrangement.</strong> Among the 8,230 postings that state one, 38.3% are on-site, 33.8% hybrid and 27.8% fully remote. US postings are less often remote than the rest (24.4% against 33.5%).</li>
<li><strong>Greenhouse leads, but AI companies pick Ashby.</strong> 158 of the 300 companies use Greenhouse and 103 use Ashby. Among the 37 AI companies in the sample, 28 use Ashby.</li>
</ul>
<h2>Who publishes pay</h2>
<table>
<thead>
<tr>
<th>Where the posting is</th>
<th>Postings</th>
<th>With a pay range</th>
</tr>
</thead>
<tbody><tr>
<td>US: lists a CA, NY, WA or CO location</td>
<td>11,893</td>
<td>86.5%</td>
</tr>
<tr>
<td>US: lists a state with a newer law, none of the four</td>
<td>1,407</td>
<td>83.5%</td>
</tr>
<tr>
<td>US: remote, no state named</td>
<td>1,544</td>
<td>82.3%</td>
</tr>
<tr>
<td>US: other states only</td>
<td>3,212</td>
<td>30.7%</td>
</tr>
<tr>
<td>US: state not identified</td>
<td>286</td>
<td>69.9%</td>
</tr>
<tr>
<td>Canada</td>
<td>866</td>
<td>78.9%</td>
</tr>
<tr>
<td>EU member states</td>
<td>3,292</td>
<td>23.8%</td>
</tr>
<tr>
<td>United Kingdom</td>
<td>1,620</td>
<td>16.0%</td>
</tr>
<tr>
<td>India</td>
<td>968</td>
<td>1.4%</td>
</tr>
<tr>
<td>Elsewhere, or several countries</td>
<td>4,728</td>
<td>17.2%</td>
</tr>
</tbody></table>
<p><em>A posting that lists San Francisco and Austin counts in the first row. "Newer law": Illinois, Massachusetts, New Jersey, Minnesota, Maryland, Hawaii, Vermont, Virginia, Maine or DC.</em></p>
<p>Remote US postings show a range almost as often as postings in the four states. That fits how the laws work: Colorado's rule, for example, covers remote jobs that a Colorado resident could do. It's simpler to publish the range than to exclude the state.</p>
<p>SpaceX matters in the "other states" row. It has more postings than any other company in the sample, and a third of the postings in that row are its jobs outside the four states. Without SpaceX, the row rises from 30.7% to 47.0%, still far below every other US row. The pattern isn't SpaceX's alone. We found 53 companies with at least five US postings in the four states and at least five that list only other states. 16 of them publish ranges at least 10 percentage points less often outside the four states, including Rocket Lab (100% against 0%), xAI (87% against 4%) and Navan (90% against 10%). The other 37 don't.</p>
<p>Most employers treat pay transparency as a company policy, not a per-posting choice. Of the 205 companies with at least five US postings, 134 put a range on 90% or more of them. Eleven put a range on none. Counting each company once, the average company shows a range on 76.9% of its US postings, close to the 75.9% for all US postings pooled.</p>
<p>Outside the US, Canada stands out. British Columbia has required pay in public job postings since November 2023, and Ontario since January 2026. 81.9% of postings in Ontario and 83.3% in British Columbia show a range. The EU's pay-transparency directive was due in national law by June 2026. It lets employers give the range before the interview instead of in the ad, and only 23.8% of the EU postings we saw include one.</p>
<h2>What the ranges say</h2>
<table>
<thead>
<tr>
<th>Role family</th>
<th>Share of postings</th>
<th>US, with range</th>
<th>Median range</th>
</tr>
</thead>
<tbody><tr>
<td>Software engineering</td>
<td>28.6%</td>
<td>4,333</td>
<td>$165–235k</td>
</tr>
<tr>
<td>Sales</td>
<td>12.5%</td>
<td>1,430</td>
<td>$145–205k</td>
</tr>
<tr>
<td>Product management</td>
<td>4.9%</td>
<td>838</td>
<td>$179–240k</td>
</tr>
<tr>
<td>Data science and analytics</td>
<td>4.4%</td>
<td>676</td>
<td>$135–190k</td>
</tr>
<tr>
<td>Marketing and communications</td>
<td>4.0%</td>
<td>620</td>
<td>$146–195k</td>
</tr>
<tr>
<td>Customer success and support</td>
<td>5.0%</td>
<td>507</td>
<td>$109–166k</td>
</tr>
<tr>
<td>Machine learning and research</td>
<td>2.7%</td>
<td>487</td>
<td>$213–300k</td>
</tr>
<tr>
<td>Solutions and sales engineering</td>
<td>4.2%</td>
<td>482</td>
<td>$180–247k</td>
</tr>
<tr>
<td>Engineering management</td>
<td>2.3%</td>
<td>347</td>
<td>$217–299k</td>
</tr>
<tr>
<td>Design</td>
<td>1.7%</td>
<td>254</td>
<td>$167–220k</td>
</tr>
</tbody></table>
<p><em>Role families come from job titles. "Share of postings" is of all 29,816. "Median range" covers annual US-dollar ranges on US postings, internships excluded: the median of the posted minimums and the median of the posted maximums, across all seniority levels.</em></p>
<p>A typical range is wide. The median maximum is 33% above the minimum, and 5% of ranges have a top figure at least double the bottom one. Only 1.2% state a single figure instead of a range.</p>
<p>Location moves the number. For software engineering, the median midpoint is $205,000 for postings that list one of the four states and $151,000 for postings that list only other states. The second group is small (117 postings), so treat that gap as a rough guide.</p>
<p>Software engineering is the largest family by far, at 28.6% of all postings. Recruiting is one of the smallest, at 1.6%. 6.8% of postings are hands-on jobs, such as technicians, warehouse staff and retail crews, and nearly half of those are at SpaceX and Gopuff. They show a range least often of any group (21.8% in the US).</p>
<h2>Remote, hybrid or on-site</h2>
<p>Lever, Ashby and Teamtailor have a structured field for the work arrangement, and 88.8% of their 9,273 postings fill it in. Greenhouse and Personio don't have one. On those boards, we can only see "remote" when the location says so, which 18.3% of their postings do.</p>
<table>
<thead>
<tr>
<th>Arrangement</th>
<th>All stated</th>
<th>US</th>
<th>Outside the US</th>
</tr>
</thead>
<tbody><tr>
<td>On-site</td>
<td>38.3%</td>
<td>42.8%</td>
<td>31.2%</td>
</tr>
<tr>
<td>Hybrid</td>
<td>33.8%</td>
<td>32.9%</td>
<td>35.4%</td>
</tr>
<tr>
<td>Fully remote</td>
<td>27.8%</td>
<td>24.4%</td>
<td>33.5%</td>
</tr>
<tr>
<td>Postings</td>
<td>8,230</td>
<td>5,100</td>
<td>3,130</td>
</tr>
</tbody></table>
<p><em>Lever, Ashby and Teamtailor postings only. Each column adds up to 100%.</em></p>
<p>Remote is a function of the job. 58.2% of customer success and support postings are remote, and so are 41.0% of product management postings. That falls to 24.2% for software engineering and 22.8% for machine learning and research, where hybrid is more common (40.8% and 50.3%). Production, field and retail jobs are almost never remote (2.4%).</p>
<h2>Which ATS, and how much they're hiring</h2>
<table>
<thead>
<tr>
<th>ATS</th>
<th>Companies</th>
<th>Postings</th>
<th>With a pay range</th>
</tr>
</thead>
<tbody><tr>
<td>Greenhouse</td>
<td>158</td>
<td>20,528</td>
<td>57.4%</td>
</tr>
<tr>
<td>Ashby</td>
<td>103</td>
<td>6,480</td>
<td>53.4%</td>
</tr>
<tr>
<td>Lever</td>
<td>23</td>
<td>2,628</td>
<td>46.0%</td>
</tr>
<tr>
<td>Teamtailor</td>
<td>12</td>
<td>165</td>
<td>5.5%</td>
</tr>
<tr>
<td>Personio</td>
<td>4</td>
<td>15</td>
<td>0.0%</td>
</tr>
</tbody></table>
<p><em>Shares of our sample, not of the ATS market: we only chose companies whose boards we could find on these five systems.</em></p>
<p>Ashby is the newer system, and it shows. 28 of the 37 AI companies use it, including OpenAI, Perplexity, Cohere and ElevenLabs. Greenhouse dominates older platforms and developer-tool companies (29 of 40 consumer platforms, 48 of 71 developer-tool and data companies). A few companies had identical boards live on two systems the day we looked, Webflow on Greenhouse and Ashby and Qonto on Lever and Ashby. That looks like a switch in progress, and we counted each company once. Differences in pay disclosure between the systems mostly reflect which companies use them. Lever's lower rate, for example, comes largely from Gopuff's store jobs. Without them, Lever's rate would be 61.1%.</p>
<p>Hiring is concentrated. The median company had 42 open postings, and the middle half had between 17 and 99. Eight companies had 500 or more and held 26.2% of all postings. SpaceX alone had 2,725 (9.1%), followed by Veeva (938), Databricks (892), Gopuff (796), Stripe (728) and Anthropic (645). At the other end, 49 companies (16.3%) had fewer than ten. Postings stay up a while: the median posting was 53 days old, and 16.5% were more than six months old.</p>
<h2>Methodology and caveats</h2>
<ul>
<li><strong>Sample.</strong> We wrote a list of 587 well-known tech companies and startups, then looked each one up on the five ATSs' public job-board APIs. 379 had a board with at least one open job that we could confirm belonged to that company. 20 tokens led to a different organisation's board and were rejected by hand. We then picked 300 of the 379 in a fixed pseudo-random order. This is a convenience sample, so it is not representative of tech or of the job market. It leaves out every company on Workday or an in-house system, which includes most of the largest employers, and it leans towards US venture-backed companies. The <a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026-companies.txt">company list</a>, the <a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026-candidates.txt">candidates</a> and the <a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026-rejected.txt">rejections</a> are published.</li>
<li><strong>Snapshot.</strong> All 300 boards were read on 10 October 2026, 17:13–17:14 UTC. A posting is an open ad, not a hire. One ad can cover several openings or locations, and some are evergreen.</li>
<li><strong>Pay.</strong> We use the ATS's structured pay field when there is one (Ashby, Lever) and otherwise the first pay range in the posting text. Multi-zone postings often list the highest-cost zone first. Sales ranges may be base or on-target earnings. These are posted ranges, not pay. In a hand check of 40 US Greenhouse postings, all 20 extracted ranges matched the posting. 1 of the 20 postings recorded as having no range stated a single salary figure we missed, so disclosure may be slightly understated.</li>
<li><strong>Location and role.</strong> US states come from the location text. Role families come from job-title keywords, and 9.4% of postings fit none. The ATS department field is filled in on 99.8% of postings, but it is free text: "Engineering" next to cost-centre codes and store brands. That is why we classified titles instead.</li>
<li><strong>Weighting.</strong> Figures are per posting unless stated, so big employers count more. Counting each company once, the average company shows a range on 51.2% of its postings (55.2% pooled).</li>
<li><strong>Reproducible.</strong> Node.js scripts <a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026-companies.mjs">find the boards</a>, <a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026-run.mjs">run the collection</a>, <a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026.mjs">compute every figure</a> (<a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/results.json">results.json</a>) and <a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026-check.mjs">run the hand check</a>. The data is company-level only, with no recruiter or other personal names.</li>
</ul>
<p><em>Source: public job boards of 300 employers on Greenhouse, Lever, Ashby, Personio and Teamtailor, read by locaihost data on 10 October 2026.</em></p>
<hr />
]]></content:encoded></item><item><title><![CDATA[How the top 1,000 websites handle email security in 2026: DMARC, SPF, BIMI and who hosts their email]]></title><description><![CDATA[We checked the DNS of the 1,000 most popular websites. 85% publish DMARC, 47% reject spoofed mail, 21% show a BIMI logo, and Google hosts over a...]]></description><link>https://locaihost.hashnode.dev/how-the-top-1-000-websites-handle-email-security-in-2026-dmarc-spf-bimi-and-who-hosts-their-email</link><guid isPermaLink="true">https://locaihost.hashnode.dev/how-the-top-1-000-websites-handle-email-security-in-2026-dmarc-spf-bimi-and-who-hosts-their-email</guid><category><![CDATA[Security]]></category><category><![CDATA[email]]></category><category><![CDATA[dns]]></category><category><![CDATA[data]]></category><dc:creator><![CDATA[locaihost data]]></dc:creator><pubDate>Fri, 16 Oct 2026 12:28:09 GMT</pubDate><content:encoded><![CDATA[<p><em>Originally published on <a href="https://locaihost.org/blog/email-security-top-1000/">locaihost.org</a>, where the charts and data files live.</em></p>
<p>Anyone can put any domain in the From line of an email. Three DNS records decide whether the receiving server believes it. SPF lists the servers allowed to send for a domain. DMARC tells receivers what to do when a message fails those checks: nothing (<code>p=none</code>), send it to spam (<code>p=quarantine</code>) or refuse it (<code>p=reject</code>). BIMI then lets a domain that enforces DMARC show its logo in the inbox.</p>
<p>Since February 2024, Google and Yahoo have required DMARC from anyone sending them bulk mail, so most large senders have published something. We wanted to know what they published. On 10 October 2026 we looked up the email DNS of the 1,000 most popular websites on the Tranco list (list <code>8PX5V</code>) and recorded their policies and their mail hosts.</p>
<p>Five findings:</p>
<ul>
<li><strong>85% publish DMARC, but only 69% enforce it.</strong> 84.5% of the 1,000 domains have a DMARC record. 69.4% set it to quarantine or reject for all mail, and 47.4% reject outright. The other 13.6% publish <code>p=none</code>, which only monitors.</li>
<li><strong>Rank matters a little.</strong> 62% of the top 100 reject spoofed mail, against 46% of domains ranked 101–1,000.</li>
<li><strong>SPF is almost universal and usually strict.</strong> 89.6% publish SPF. Of those, 53.8% end it with <code>-all</code> (hard fail) and 40.4% with <code>~all</code> (soft fail).</li>
<li><strong>BIMI has taken off; MTA-STS hasn't.</strong> 21.3% publish a BIMI record, against only 4.5% for MTA-STS, which forces encrypted delivery.</li>
<li><strong>Google hosts more of this mail than anyone.</strong> Of the 875 domains that accept mail, 37.3% use Google Workspace and 17.4% Microsoft 365. Proofpoint filters 9.0% before the mail reaches the mailbox.</li>
</ul>
<h2>DMARC and SPF by rank</h2>
<table>
<thead>
<tr>
<th>Measure</th>
<th>Top 100</th>
<th>101–1,000</th>
<th>All</th>
</tr>
</thead>
<tbody><tr>
<td>DMARC record</td>
<td>87.0%</td>
<td>84.2%</td>
<td>84.5%</td>
</tr>
<tr>
<td>DMARC enforced</td>
<td>76.0%</td>
<td>68.7%</td>
<td>69.4%</td>
</tr>
<tr>
<td>DMARC <code>p=reject</code></td>
<td>62.0%</td>
<td>45.8%</td>
<td>47.4%</td>
</tr>
<tr>
<td>SPF record</td>
<td>93.0%</td>
<td>89.2%</td>
<td>89.6%</td>
</tr>
<tr>
<td>BIMI record</td>
<td>27.0%</td>
<td>20.7%</td>
<td>21.3%</td>
</tr>
<tr>
<td>MTA-STS policy</td>
<td>11.0%</td>
<td>3.8%</td>
<td>4.5%</td>
</tr>
</tbody></table>
<p><em>"Enforced" means quarantine or reject, applied to 100% of mail. Rank is the position among the 1,000 domains we kept, in Tranco order.</em></p>
<p>Across all 1,000 domains, the DMARC policy split was 474 at reject, 235 at quarantine and 136 at <code>none</code>. 155 had no record. Few hedged: only 15 of the 845 records (1.8%) applied their policy to less than 100% of mail. 24 (2.8%) rejected spoofs of the main domain but used a weaker policy for its subdomains.</p>
<p>A <code>p=none</code> record is usually a first step. A domain watches the reports, finds its legitimate senders, then tightens the policy. Most of the 136 <code>p=none</code> domains are doing that: 85% of them ask for aggregate reports. Some very large names are still there, though, including <code>samsung.com</code> and <code>yandex.ru</code>, and Microsoft's consumer mail domains <code>outlook.com</code>, <code>live.com</code> and <code>msn.com</code>. For consumer mailbox domains, <code>p=none</code> is often deliberate. Mailing lists and forwarding break authentication, and a strict policy would bounce real mail. A company domain doesn't have that excuse.</p>
<p>The SPF split matters less than it looks. Under DMARC, a receiver judges a message by the DMARC result, so <code>-all</code> versus <code>~all</code> mostly matters to receivers that don't check DMARC. 37 domains (4.1% of those with SPF) have no <code>all</code> of their own and hand over to another record with <code>redirect=</code>, and 15 use the neutral <code>?all</code>. None of the 1,000 used <code>+all</code>, which would let any server send as the domain.</p>
<h2>Who hosts the mail</h2>
<p>Of the 1,000 domains, 875 have an MX record, so they accept mail. The rest are mostly link shorteners, download hosts and developer infrastructure.</p>
<table>
<thead>
<tr>
<th>Mailbox host</th>
<th>Domains</th>
<th>Share</th>
</tr>
</thead>
<tbody><tr>
<td>Google Workspace</td>
<td>326</td>
<td>37.3%</td>
</tr>
<tr>
<td>Microsoft 365</td>
<td>152</td>
<td>17.4%</td>
</tr>
<tr>
<td>Own mail servers</td>
<td>147</td>
<td>16.8%</td>
</tr>
<tr>
<td>Unrecognised MX host</td>
<td>105</td>
<td>12.0%</td>
</tr>
<tr>
<td>Gateway, mailbox hidden</td>
<td>81</td>
<td>9.3%</td>
</tr>
<tr>
<td>Amazon WorkMail / SES</td>
<td>13</td>
<td>1.5%</td>
</tr>
<tr>
<td>Tencent Exmail</td>
<td>8</td>
<td>0.9%</td>
</tr>
<tr>
<td>Alibaba Mail, Yandex 360</td>
<td>6 each</td>
<td>0.7% each</td>
</tr>
<tr>
<td>Zoho Mail</td>
<td>5</td>
<td>0.6%</td>
</tr>
<tr>
<td>Other named providers (12)</td>
<td>26</td>
<td>3.0%</td>
</tr>
</tbody></table>
<p><em>Base: the 875 domains that accept mail. "Own mail servers" means MX hosts under the domain's own name. Google's and Microsoft's own domains count under their own services.</em></p>
<p>The rows that are not Google or Microsoft deserve a closer look. "Own mail servers" means the MX host is under the domain's own name, as with <code>apple.com</code> and <code>paypal.com</code>. Most of the "unrecognised" group is the same thing one step removed. <code>imdb.com</code> receives mail on <code>amazon.com</code> servers, <code>webex.com</code> on <code>cisco.com</code> servers and <code>vk.com</code> on <code>mail.ru</code> servers. Together, the two groups make up 28.8% of the domains that accept mail.</p>
<p>In front of the mailbox, 124 domains (14.2% of those accepting mail) use a security gateway that filters inbound mail first:</p>
<table>
<thead>
<tr>
<th>Inbound gateway</th>
<th>Domains</th>
<th>Share of the 875</th>
</tr>
</thead>
<tbody><tr>
<td>Proofpoint</td>
<td>79</td>
<td>9.0%</td>
</tr>
<tr>
<td>Mimecast</td>
<td>24</td>
<td>2.7%</td>
</tr>
<tr>
<td>Cisco Secure Email</td>
<td>11</td>
<td>1.3%</td>
</tr>
<tr>
<td>Five others</td>
<td>10</td>
<td>1.1%</td>
</tr>
<tr>
<td>None detected</td>
<td>751</td>
<td>85.8%</td>
</tr>
</tbody></table>
<p><em>The five others: Broadcom and Trend Micro (3 each), Barracuda (2), Sophos and Hornetsecurity (1 each).</em></p>
<p>Behind those gateways, SPF identifies the mailbox in 43 of the 124 cases: 24 use Microsoft 365 and 19 Google Workspace. The rest list only the gateway or their own servers in SPF, so the mailbox host stays hidden.</p>
<h2>Who enforces DMARC</h2>
<p>Enforcement differs by mail host. Domains on Google Workspace enforce DMARC more often than those on Microsoft 365. Domains behind a gateway enforce it most often. This is a correlation, not a cause: buying Proofpoint and setting <code>p=reject</code> both point to a company with a dedicated email-security team.</p>
<table>
<thead>
<tr>
<th>Mail host</th>
<th>Domains</th>
<th>DMARC enforced</th>
</tr>
</thead>
<tbody><tr>
<td>Gateway, mailbox hidden</td>
<td>81</td>
<td>86.4%</td>
</tr>
<tr>
<td>Google Workspace</td>
<td>326</td>
<td>82.2%</td>
</tr>
<tr>
<td>Microsoft 365</td>
<td>152</td>
<td>72.4%</td>
</tr>
<tr>
<td>Unrecognised MX host</td>
<td>105</td>
<td>67.6%</td>
</tr>
<tr>
<td>Own mail servers</td>
<td>147</td>
<td>66.7%</td>
</tr>
<tr>
<td>No MX (accepts no mail)</td>
<td>125</td>
<td>37.6%</td>
</tr>
</tbody></table>
<p>The last row is the weakest point. A domain that never sends mail can still be forged, and attackers like such domains because nobody watches them. The standard lock-down is two records: <code>v=spf1 -all</code> (no server may send) and DMARC <code>p=reject</code>. Only 31 of the 125 non-mail domains (24.8%) have both. 76 (60.8%) have either no DMARC record or <code>p=none</code>.</p>
<p>By top-level domain, <code>.com</code> led: 75.0% of its 596 domains enforce DMARC and 51.0% reject. Country-code domains followed at 63.5% (159 domains), then government, education and international bodies at 60.0% (35), and <code>.org</code> and <code>.net</code> at 57.0% (128).</p>
<h2>Who reads the reports</h2>
<p>DMARC lets a domain ask receivers for daily aggregate reports (the <code>rua</code> tag). 91.5% of DMARC records ask for them. 63.6% send them to an outside service, usually a vendor that turns the XML into dashboards. Counting each domain once per vendor:</p>
<table>
<thead>
<tr>
<th>Report receiver</th>
<th>Domains</th>
</tr>
</thead>
<tbody><tr>
<td>Valimail (<code>vali.email</code>)</td>
<td>74</td>
</tr>
<tr>
<td>Proofpoint</td>
<td>71</td>
</tr>
<tr>
<td>dmarcian</td>
<td>55</td>
</tr>
<tr>
<td>Agari (Fortra)</td>
<td>29</td>
</tr>
<tr>
<td>Mimecast DMARC Analyzer</td>
<td>28</td>
</tr>
<tr>
<td>Cloudflare</td>
<td>26</td>
</tr>
<tr>
<td>Red Sift OnDMARC</td>
<td>22</td>
</tr>
<tr>
<td>Postmark</td>
<td>22</td>
</tr>
</tbody></table>
<p>13 domains send their reports to <code>dhs.gov</code>, the collection point used by US federal civilian agencies. 11 of them are agencies such as <code>nasa.gov</code> and <code>whitehouse.gov</code>, and the other two are the companies Box and Dynatrace. Another 22 report to <code>google.com</code>, all of them Google properties such as <code>youtube.com</code> and <code>android.com</code>.</p>
<h2>DNS and CDN</h2>
<p>The same lookups show who runs the infrastructure. AWS Route 53 answers DNS for 24.6% of the 1,000 domains. Cloudflare answers for 16.3%, and 15.7% run their own name servers. Akamai answers for 9.4% and NS1 for 4.4%. 31.2% publish a CAA record that limits which certificate authorities may issue for them. Of the 902 domains with a homepage, Cloudflare serves 25.7%, Akamai and Amazon CloudFront 14.1% each, and Fastly 9.0%. We detected no CDN for the other 33.8%.</p>
<h2>Methodology and caveats</h2>
<ul>
<li><strong>Domains.</strong> Tranco list <a href="https://tranco-list.eu/list/8PX5V/1000000"><code>8PX5V</code></a>, generated 9 October 2026 from 30 days (10 September to 9 October) of Chrome UX Report, Farsight, Majestic, Cloudflare Radar and Cisco Umbrella data, as registrable domains. We removed 73 infrastructure host names listed by hand (CDN, API and telemetry domains such as <code>gstatic.com</code> and <code>akamaiedge.net</code>). We then dropped any domain that neither served a homepage nor had an MX record: 197 more, mostly CDN and device-telemetry hosts. A homepage behind a bot wall (HTTP 401, 403 or 429) counts as served. The first 1,000 remaining domains, down to Tranco rank 1,272, are the sample. The script lists every exclusion.</li>
<li><strong>Snapshot.</strong> All lookups ran on 10 October 2026, 14:03–14:40 UTC, from Apify's cloud. DNS records change, so this is one day's picture.</li>
<li><strong>What "detected" means.</strong> A record counts if it exists in public DNS and parses: SPF is a <code>v=spf1</code> TXT record at the domain, DMARC a <code>v=DMARC1</code> record at <code>_dmarc</code>, BIMI a <code>v=BIMI1</code> record at <code>default._bimi</code>, MTA-STS a <code>v=STSv1</code> record at <code>_mta-sts</code>. We didn't check BIMI logos or certificates, and we didn't fetch MTA-STS policy files. Mail hosts and gateways are matched from MX host names, and from SPF includes when a gateway hides the mailbox. A host we have no rule for is reported as unrecognised, not guessed. Domains with a null MX (RFC 7505) count as having no MX.</li>
<li><strong>Cross-check.</strong> About an hour after the run, we re-resolved MX, SPF, DMARC and BIMI for all 1,298 domains through public resolvers. The results disagreed on 7 MX answers (all of them null MX, which the two tools count differently), 2 SPF records, 2 DMARC policies and no BIMI records. One domain, <code>indeed.com</code>, answered our cloud resolver with <code>0.0.0.0</code> and no MX. It was therefore dropped from the sample, though it does accept mail.</li>
<li><strong>Reproducible.</strong> Four Node.js scripts <a href="https://locaihost.org/blog/email-security-top-1000/analysis/email-security-2026-fetch.mjs">fetch the list</a>, <a href="https://locaihost.org/blog/email-security-top-1000/analysis/email-security-2026-run.mjs">run the lookups</a>, <a href="https://locaihost.org/blog/email-security-top-1000/analysis/email-security-2026.mjs">compute every figure</a> (<a href="https://locaihost.org/blog/email-security-top-1000/analysis/results.json">results.json</a>) and <a href="https://locaihost.org/blog/email-security-top-1000/analysis/email-security-2026-check.mjs">run the cross-check</a>. We use only company domains, and we collect no personal data. Report addresses are reduced to the receiving domain.</li>
</ul>
<p><em>Source: Tranco list 8PX5V (tranco-list.eu); DNS, HTTP and TLS lookups by locaihost data, 10 October 2026.</em></p>
<hr />
<p>The data came from our <a href="https://apify.com/locaihost/domain-intel">Domain Intel Actor</a> on Apify, which returns these fields (email host, gateway, SPF, DMARC, BIMI, MTA-STS, DNS, CDN, TLS) for any list of domains. To check your own suppliers, customers or portfolio the same way, it costs $1 per 1,000 domains.</p>
]]></content:encoded></item><item><title><![CDATA[Who actually sponsors H-1B workers in 2026, and what they offer to pay]]></title><description><![CDATA[1.57 million Labor Department filings, FY2024 to June 2026: who files the most H-1B applications, what they offer, and who also sponsors green cards.]]></description><link>https://locaihost.hashnode.dev/who-actually-sponsors-h-1b-workers-in-2026-and-what-they-offer-to-pay</link><guid isPermaLink="true">https://locaihost.hashnode.dev/who-actually-sponsors-h-1b-workers-in-2026-and-what-they-offer-to-pay</guid><category><![CDATA[h1b]]></category><category><![CDATA[data]]></category><category><![CDATA[immigration]]></category><category><![CDATA[Career]]></category><dc:creator><![CDATA[locaihost data]]></dc:creator><pubDate>Thu, 15 Oct 2026 09:13:33 GMT</pubDate><content:encoded><![CDATA[<p><em>Originally published on <a href="https://locaihost.org/blog/h1b-sponsors-2026/">locaihost.org</a>, where the charts and data files live.</em></p>
<p>Every H-1B petition starts with a Labor Condition Application (LCA) filed with the US Department of Labor. On it, the employer gives the job title, the worksite and the wage it will pay. The Labor Department publishes these forms every quarter. We combined all of them from 1 October 2023 to 30 June 2026 (fiscal year 2024 to the third quarter of FY2026), along with the PERM green-card filings for the same period. That comes to 1.57 million LCA cases and 374,000 PERM cases from 153,000 employers.</p>
<p>Five findings stand out:</p>
<ul>
<li><strong>The largest filers are cutting back, and most of the cut comes from outsourcing firms.</strong> Comparing like with like (October to June of each year), certified LCAs fell 8.1% in FY2026. Twenty large IT-services firms filed 31.9% fewer and account for a third of the drop, though they filed only 8.7% of FY2025's applications.</li>
<li><strong>Most sponsors file one application a year.</strong> Of the 63,545 employers with a certified LCA in FY2025, 51.6% had exactly one.</li>
<li><strong>Who you work for affects the wage more than the visa does.</strong> The median offered wage for software-engineer titles was $203,350 at Meta and $112,986 at Tata Consultancy Services.</li>
<li><strong>Green-card sponsorship varies widely.</strong> Intel had 32 PERM certifications for every 100 LCAs. Infosys had fewer than one.</li>
<li><strong>Denials are rare: 0.68%.</strong> That figure says very little, and the reason is explained below.</li>
</ul>
<h2>Who files the most</h2>
<p>In FY2025, the last complete year, the Labor Department certified 541,597 LCAs, 8.2% more than the 500,329 in FY2024. Of these, 529,432 were for H-1B. The rest were for the country-specific versions: 8,858 E-3 (Australia), 1,940 H-1B1 (Chile) and 1,367 H-1B1 (Singapore).</p>
<p>The table ranks employers as they appear on the forms. These are legal entities, not corporate groups, so Amazon's four main filing entities are counted separately. Combined, the four filed 22,914 in FY2025.</p>
<table>
<thead>
<tr>
<th>#</th>
<th>Employer (legal entity)</th>
<th>FY2024</th>
<th>FY2025</th>
<th>Oct–Jun FY25</th>
<th>Oct–Jun FY26</th>
<th>Change</th>
<th>Median offered wage, FY2025</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Amazon.com Services</td>
<td>14,584</td>
<td>15,493</td>
<td>12,630</td>
<td>13,922</td>
<td>+10.2%</td>
<td>$154,600</td>
</tr>
<tr>
<td>2</td>
<td>Cognizant Technology Solutions US</td>
<td>11,226</td>
<td>11,090</td>
<td>8,600</td>
<td>5,774</td>
<td>−32.9%</td>
<td>$109,782</td>
</tr>
<tr>
<td>3</td>
<td>Ernst &amp; Young U.S.</td>
<td>9,828</td>
<td>9,601</td>
<td>8,161</td>
<td>5,168</td>
<td>−36.7%</td>
<td>$143,517</td>
</tr>
<tr>
<td>4</td>
<td>Microsoft</td>
<td>9,491</td>
<td>9,215</td>
<td>7,417</td>
<td>5,159</td>
<td>−30.4%</td>
<td>$170,766</td>
</tr>
<tr>
<td>5</td>
<td>Google</td>
<td>8,815</td>
<td>8,800</td>
<td>7,861</td>
<td>7,423</td>
<td>−5.6%</td>
<td>$184,000</td>
</tr>
<tr>
<td>6</td>
<td>Tata Consultancy Services</td>
<td>9,611</td>
<td>7,796</td>
<td>6,491</td>
<td>2,880</td>
<td>−55.6%</td>
<td>$85,634</td>
</tr>
<tr>
<td>7</td>
<td>Meta Platforms</td>
<td>5,911</td>
<td>6,627</td>
<td>5,717</td>
<td>5,278</td>
<td>−7.7%</td>
<td>$203,350</td>
</tr>
<tr>
<td>8</td>
<td>Apple</td>
<td>3,460</td>
<td>6,283</td>
<td>4,822</td>
<td>4,870</td>
<td>+1.0%</td>
<td>$175,800</td>
</tr>
<tr>
<td>9</td>
<td>Infosys</td>
<td>5,896</td>
<td>5,757</td>
<td>3,876</td>
<td>4,568</td>
<td>+17.9%</td>
<td>$92,581</td>
</tr>
<tr>
<td>10</td>
<td>Deloitte Consulting</td>
<td>2,693</td>
<td>4,255</td>
<td>3,215</td>
<td>2,622</td>
<td>−18.4%</td>
<td>$138,423</td>
</tr>
</tbody></table>
<p><em>Certified LCAs by decision date. "Oct–Jun" compares the same nine months of each fiscal year, because the FY2026 data ends on 30 June 2026.</em></p>
<p>Like-for-like, total certified LCAs fell from 436,875 to 401,397. Most of the drop came early in the year. Compared with a year before, the October–December 2025 quarter was down 22.2%, January–March was down 7.7% and April–June was down 2.3%. A presidential proclamation of 19 September 2025 added a $100,000 payment to certain new H-1B petitions just before that first quarter. (A federal court vacated the guidance implementing that payment on 8 June 2026, and the litigation is ongoing.) The data shows when filings fell but not why, and an LCA is filed before the petition, so these figures can't separate the petitions the payment applied to from those it didn't.</p>
<p>Change wasn't spread evenly. Of the 68 employers with at least 500 certified LCAs in October–June FY2025, 44 filed fewer in the same months of FY2026. The largest falls were IBM (−63.8%), <a href="https://locaihost.org/visa-sponsors/tata-consultancy-services/">Tata Consultancy Services</a> (−55.6%), Qualcomm (−51.8%), LTIMindtree (−47.6%) and HCL America (−44.0%). <a href="https://locaihost.org/visa-sponsors/infosys/">Infosys</a> went the other way, up 17.9%. The largest rise was at <a href="https://locaihost.org/visa-sponsors/nvidia/">Nvidia</a>, up 71.2% to 2,390, making it the 15th-largest filer so far this year. Grandison Management rose 37.4%. More than half of its FY2025 filings (54.2%) were for physical therapists, with a median offered wage of $77,480. The big filers aren't all in tech.</p>
<h2>Most sponsors are small</h2>
<p>The ten largest filers accounted for 15.7% of certified LCAs in FY2025. The top 100 accounted for 34.0%, and the top 1,000 for 55.5%. At the other end, 32,765 employers filed exactly one certified LCA. Including those that filed two, that's 43,454 employers, or 68.4% of all sponsors, together accounting for 10.0% of filings. The median sponsor filed one.</p>
<p>For job seekers, this means a company's absence from the top-100 lists doesn't show it won't sponsor. Most sponsors have never been on those lists.</p>
<h2>Volume and pay by type of employer</h2>
<p>To compare kinds of employer, we sorted them into groups. Four groups are lists of named employers we chose by hand. The other two are matched by name: any employer with "university" or "college" in its name, and any with "hospital", "medical center", "health system", "clinic" or "children's". Both methods are crude, and the full lists are in the analysis script.</p>
<table>
<thead>
<tr>
<th>Group (FY2025)</th>
<th>Employers</th>
<th>Certified LCAs</th>
<th>Share</th>
<th>Median offered wage</th>
<th>Oct–Jun change FY25→FY26</th>
<th>PERM per 100 LCAs</th>
</tr>
</thead>
<tbody><tr>
<td>Big tech (named list)</td>
<td>23</td>
<td>73,351</td>
<td>13.5%</td>
<td>$169,000</td>
<td>−6.3%</td>
<td>17.2</td>
</tr>
<tr>
<td>IT services &amp; outsourcing (named list)</td>
<td>20</td>
<td>47,274</td>
<td>8.7%</td>
<td>$104,728</td>
<td>−31.9%</td>
<td>8.1</td>
</tr>
<tr>
<td>Universities &amp; colleges (by name)</td>
<td>1,325</td>
<td>25,953</td>
<td>4.8%</td>
<td>$81,100</td>
<td>−5.4%</td>
<td>9.9</td>
</tr>
<tr>
<td>Big Four &amp; strategy consulting (named list)</td>
<td>8</td>
<td>18,899</td>
<td>3.5%</td>
<td>$141,000</td>
<td>−27.7%</td>
<td>6.3</td>
</tr>
<tr>
<td>Banks &amp; card issuers (named list)</td>
<td>11</td>
<td>11,949</td>
<td>2.2%</td>
<td>$150,000</td>
<td>−4.3%</td>
<td>15.6</td>
</tr>
<tr>
<td>Hospitals &amp; clinics (by name)</td>
<td>1,152</td>
<td>9,099</td>
<td>1.7%</td>
<td>$86,080</td>
<td>−6.8%</td>
<td>11.8</td>
</tr>
<tr>
<td>Everyone else</td>
<td>61,006</td>
<td>355,072</td>
<td>65.6%</td>
<td>$114,213</td>
<td>−4.7%</td>
<td>28.7</td>
</tr>
</tbody></table>
<p><em>PERM per 100 LCAs uses FY2024 + FY2025 for both counts.</em></p>
<p>Two groups account for most of this year's fall. The 20 IT-services firms filed 11,776 fewer certified LCAs in October–June than a year earlier, 33.2% of the total decline. The Big Four and two strategy firms filed 4,356 fewer, 12.3% of the decline. Both shares are far larger than the groups' share of filings. The 61,006 employers in "everyone else" fell by 4.7%.</p>
<p>Universities filed 18.7% more LCAs in FY2025 than in FY2024. Their median offered wage, $81,100, is the lowest of any group, because their most common titles are assistant professor and postdoctoral researcher. Most universities, and the non-profit research bodies linked to them, are exempt from the annual H-1B cap.</p>
<h2>What the wages say</h2>
<p>These are offered wages: the lower end of the range written on the form, converted to a yearly figure. The job title "Software Engineer" alone had 28,123 certified LCAs from 4,588 employers in FY2025, with a median of \(139,000. Across all software-engineer and software-developer titles, there were 105,098 filings with a median of \)137,500. The median at each large filer varies far more than that single figure suggests:</p>
<table>
<thead>
<tr>
<th>Employer</th>
<th>Software-engineer filings</th>
<th>25th pct</th>
<th>Median</th>
<th>75th pct</th>
</tr>
</thead>
<tbody><tr>
<td>Salesforce</td>
<td>1,082</td>
<td>$178,743</td>
<td>$211,686</td>
<td>$243,862</td>
</tr>
<tr>
<td><a href="https://locaihost.org/visa-sponsors/meta-platforms/">Meta Platforms</a></td>
<td>3,670</td>
<td>$182,000</td>
<td>$203,350</td>
<td>$226,485</td>
</tr>
<tr>
<td><a href="https://locaihost.org/visa-sponsors/google/">Google</a></td>
<td>5,604</td>
<td>$162,000</td>
<td>$186,000</td>
<td>$200,000</td>
</tr>
<tr>
<td><a href="https://locaihost.org/visa-sponsors/microsoft/">Microsoft</a></td>
<td>5,700</td>
<td>$153,700</td>
<td>$171,258</td>
<td>$191,461</td>
</tr>
<tr>
<td>Amazon.com Services</td>
<td>3,632</td>
<td>$137,259</td>
<td>$160,000</td>
<td>$180,710</td>
</tr>
<tr>
<td>JPMorgan Chase</td>
<td>1,886</td>
<td>$140,650</td>
<td>$156,200</td>
<td>$175,000</td>
</tr>
<tr>
<td>Walmart Associates</td>
<td>2,366</td>
<td>$120,000</td>
<td>$141,751</td>
<td>$153,301</td>
</tr>
<tr>
<td>Tata Consultancy Services</td>
<td>320</td>
<td>$105,997</td>
<td>$112,986</td>
<td>$127,504</td>
</tr>
<tr>
<td>UST Global</td>
<td>394</td>
<td>$95,040</td>
<td>$106,866</td>
<td>$121,541</td>
</tr>
</tbody></table>
<p><em>FY2025 certified LCAs whose title contains "software engineer", "software developer", "software development engineer", "software engineering" or "SDE". Employers with at least 300 such filings with a wage; the full list of 38 is in the script output.</em></p>
<p>Titles are less useful than they look at the largest outsourcing firms. At Cognizant, 35.2% of FY2025 filings carry one internal job code, "Manager JC50 - Computer Systems Engineers/Architects". At TCS, 40.9% are simply "Architect", with a median of $84,115. Comparing roles across those firms is close to impossible.</p>
<p>To find the best-paid jobs that many employers sponsor, we kept only titles with at least 500 FY2025 filings from at least 25 different employers. The top title wasn't in tech:</p>
<table>
<thead>
<tr>
<th>Job title</th>
<th>Certified LCAs</th>
<th>Employers</th>
<th>Median offered wage</th>
</tr>
</thead>
<tbody><tr>
<td>Hospitalist</td>
<td>673</td>
<td>216</td>
<td>$275,000</td>
</tr>
<tr>
<td>Senior Manager</td>
<td>814</td>
<td>94</td>
<td>$198,511</td>
</tr>
<tr>
<td>Software Development Engineer III</td>
<td>769</td>
<td>27</td>
<td>$198,000</td>
</tr>
<tr>
<td>Engineering Manager</td>
<td>561</td>
<td>292</td>
<td>$196,888</td>
</tr>
<tr>
<td>Staff Software Engineer</td>
<td>1,901</td>
<td>443</td>
<td>$177,437</td>
</tr>
</tbody></table>
<p>The lowest-paid common titles were teacher ($53,600), market research analyst ($62,900), medical technologist ($63,149) and the various postdoctoral titles ($65,000–$69,926).</p>
<h2>Who also sponsors green cards</h2>
<p>An LCA supports a temporary visa. PERM labor certification is usually the first step toward an employer-sponsored green card. Dividing PERM certifications by LCAs gives a rough measure of how often an employer takes that second step. Across all employers in FY2024–FY2025, the figure was 23 per 100. For the biggest filers (at least 3,000 certified LCAs), it ranged from 32 down to almost none:</p>
<table>
<thead>
<tr>
<th>Employer</th>
<th>Certified LCAs FY24–25</th>
<th>PERM certified FY24–25</th>
<th>PERM per 100 LCAs</th>
<th>PERM by year: FY24 / FY25 / FY26 to June</th>
</tr>
</thead>
<tbody><tr>
<td>Intel</td>
<td>6,524</td>
<td>2,083</td>
<td>31.9</td>
<td>1,148 / 935 / 326</td>
</tr>
<tr>
<td>Apple</td>
<td>9,743</td>
<td>2,645</td>
<td>27.1</td>
<td>1,421 / 1,224 / 33</td>
</tr>
<tr>
<td>Nvidia</td>
<td>3,185</td>
<td>853</td>
<td>26.8</td>
<td>280 / 573 / 722</td>
</tr>
<tr>
<td>Microsoft</td>
<td>18,706</td>
<td>4,660</td>
<td>24.9</td>
<td>1,734 / 2,926 / 1,600</td>
</tr>
<tr>
<td>Google</td>
<td>17,615</td>
<td>1,607</td>
<td>9.1</td>
<td>1,607 / 0 / 1</td>
</tr>
<tr>
<td>Amazon.com Services</td>
<td>30,077</td>
<td>2,130</td>
<td>7.1</td>
<td>2,129 / 1 / 56</td>
</tr>
<tr>
<td>Cognizant Technology Solutions US</td>
<td>22,316</td>
<td>1,235</td>
<td>5.5</td>
<td>1,235 / 0 / 0</td>
</tr>
<tr>
<td>Ernst &amp; Young U.S.</td>
<td>19,429</td>
<td>281</td>
<td>1.4</td>
<td>1 / 280 / 568</td>
</tr>
<tr>
<td>Infosys</td>
<td>11,653</td>
<td>87</td>
<td>0.7</td>
<td>87 / 0 / 0</td>
</tr>
</tbody></table>
<p>The yearly column shows something the ratio hides. Monthly certifications stopped at several large filers. Google's last month with 50 or more was February 2024, and it has had three in the 28 months since. Amazon.com Services fell below five a month from May 2024 to February 2026 and has risen slowly since (56 in October–June). Cognizant has had none since July 2024 and <a href="https://locaihost.org/visa-sponsors/infosys/">Infosys</a> none since January 2024. Because PERM cases take more than a year to decide, a decision gap from 2024 points to a pause in filings around 2023, which matches what Google and Amazon were widely reported to have done that year. The data shows only the gap, not its cause.</p>
<p>One warning about this measure: a company may file its LCAs under one legal entity and its PERM cases under another. Fidelity Technology Group has 3,847 LCAs and no PERM cases, while FMR LLC, another Fidelity entity, has 778 PERM certifications in FY2024–FY2025. Check every entity a company uses before concluding that it doesn't sponsor green cards.</p>
<h2>Where the jobs are</h2>
<p>California accounted for 18.7% of FY2025 certified LCAs by worksite, followed by Texas (15.3%), New York (8.3%), Washington (6.3%) and New Jersey (5.0%). Together those five states had 53.6% of filings.</p>
<h2>Why denials tell you nothing</h2>
<p>In FY2025, 3,918 LCAs were denied, against 541,597 certified and 31,083 certified then withdrawn. That's a denial rate of 0.68%, and it has been under 1% in each year of the data. An LCA is a statement by the employer: that it will pay at least the required wage, and that hiring the worker won't harm the working conditions of other employees at the site. The Labor Department mostly checks that the form is complete and free of obvious errors. It doesn't decide whether the worker qualifies or whether the job is real. United States Citizenship and Immigration Services (USCIS) decides that later, when it reviews the petition. PERM is checked more closely, and its denial rate was 1.78% in FY2025. Neither rate tells you about visa approvals.</p>
<h2>Methodology and caveats</h2>
<ul>
<li><strong>Source.</strong> US Department of Labor, Office of Foreign Labor Certification (OFLC), LCA and PERM disclosure files for FY2024 to FY2026 Q3 (1 October 2023 to 30 June 2026). The data is public domain. We are not affiliated with the Labor Department.</li>
<li><strong>Counting.</strong> Every file was loaded and de-duplicated by case number, keeping the latest decision. Cases are counted in the fiscal year of the decision date. "Certified" excludes certified-then-withdrawn cases. FY2026 covers only nine months, so it is compared only with the same nine months of earlier years.</li>
<li><strong>A certified LCA is not a visa.</strong> One worker can have several LCAs (for example, for a new worksite or an extension), and many LCAs never lead to a petition. LCA counts measure employer filing activity, not people hired or visas approved.</li>
<li><strong>Offered wage is not pay.</strong> We use the lower end of any wage range on the form, converted to a yearly figure (2,080 hours a year for hourly wages), and drop values below $10,000 or above $2 million. Bonuses and equity aren't included.</li>
<li><strong>Employers are legal entities.</strong> Names are normalised, so "Google LLC" and "GOOGLE LLC" count as one employer. Separate entities of the same company are not merged, apart from the Amazon total we give above. Groups are our own choices, and the lists are in the script.</li>
<li><strong>Privacy.</strong> Only business fields are read: status, dates, visa class, employer, job title, wage, worksite state and number of positions. No information about workers, employer contacts, attorneys or form preparers is read or published, and employers that file under a person's own name are excluded.</li>
<li><strong>Reproducible.</strong> Two Node.js scripts produce every figure here: <a href="https://locaihost.org/blog/h1b-sponsors-2026/analysis/h1b-2026-extract.mjs">one re-reads the DOL files</a> and <a href="https://locaihost.org/blog/h1b-sponsors-2026/analysis/h1b-2026.mjs">the other computes the results</a> (<a href="https://locaihost.org/blog/h1b-sponsors-2026/analysis/results.json">results.json</a>). Their case counts match our published employer index exactly (1,570,055 LCA and 373,878 PERM cases).</li>
</ul>
<p>Nothing here is legal or immigration advice. For your own case, talk to a qualified immigration attorney.</p>
<p><em>Source: US Department of Labor, Office of Foreign Labor Certification, LCA and PERM disclosure data (public domain).</em></p>
<hr />
<p>Each of the 2,000 largest sponsors has a free page at <a href="https://locaihost.org/visa-sponsors/employers/">locaihost.org/visa-sponsors/employers/</a> showing its filings by year, the titles it sponsors and the wages it filed. For example, see <a href="https://locaihost.org/visa-sponsors/cognizant-technology-solutions/">Cognizant</a> or <a href="https://locaihost.org/visa-sponsors/google/">Google</a>. To look up many companies at once, or to check live job listings for sponsorship evidence, the same data is available through an <a href="https://apify.com/locaihost/visa-sponsors">Apify Actor</a> at $2.50 per 1,000 results.</p>
]]></content:encoded></item></channel></rss>