<?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[Gorilla Vibe Notes]]></title><description><![CDATA[Gorilla Vibe Notes]]></description><link>https://gorillavibe.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Tue, 03 Nov 2026 15:32:25 GMT</lastBuildDate><atom:link href="https://gorillavibe.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Keyword-to-page mapping: one search intent per page]]></title><description><![CDATA[A keyword map is a simple table that says which page on your site is meant to rank for which search. It sounds basic, yet most sites with traffic problems…]]></description><link>https://gorillavibe.hashnode.dev/keyword-to-page-mapping-one-search-intent-per-page</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/keyword-to-page-mapping-one-search-intent-per-page</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Sun, 01 Nov 2026 17:58:14 GMT</pubDate><content:encoded><![CDATA[<p>A keyword map is a simple table that says which page on your site is meant to rank for which search. It sounds basic, yet most sites with traffic problems have the same fault: several pages compete for one search, or one page tries to answer five different searches. This guide shows how to build a map you can maintain in a Notion database or a spreadsheet.</p>
<h2>Start with intent, not with the keyword</h2>
<p>Two searches can share most of their words and still want different things. Group keywords by what the searcher wants to do:</p>
<ul>
<li><strong>Learn:</strong> "what is a retainer agreement", "how does schema markup work"</li>
<li><strong>Compare:</strong> "best CRM for small teams", "agency vs in-house"</li>
<li><strong>Buy or hire:</strong> "SEO agency in Dubai", "website design service"</li>
</ul>
<p>A page should serve one of these intents. If a keyword mixes two, such as a guide and a service together, decide which one the page serves and give the other its own page.</p>
<h2>The rule: one primary intent per page</h2>
<p>Each page gets:</p>
<ul>
<li>one primary keyword (the clearest phrase for the intent),</li>
<li>a handful of close variants and questions that the same page can answer naturally,</li>
<li>one stated intent.</li>
</ul>
<p>If two pages share a primary keyword, you have a clash, often called keyword cannibalisation. Search engines then have to guess which page to show, and both pages may rank lower than a single, stronger page would.</p>
<h2>Build the map in five steps</h2>
<ol>
<li><strong>List your pages.</strong> Export every indexable URL from your CMS, sitemap or crawl. Leave out thank-you pages and filtered duplicates.</li>
<li><strong>Collect keyword ideas.</strong> Use Search Console queries, your sales team's questions, competitor page titles and autocomplete suggestions. Do not worry about tools at this stage.</li>
<li><strong>Group by intent.</strong> Put keywords that a single page could satisfy in one group.</li>
<li><strong>Assign each group to a page.</strong> Choose the existing page that already fits best. If no page fits, mark the row "new page needed".</li>
<li><strong>Check for gaps and clashes.</strong> Pages with no keyword group are candidates to merge, rewrite or remove. Groups with two pages are candidates to merge or to separate more clearly.</li>
</ol>
<h2>What the table looks like</h2>
<p>These rows are examples to show the format, not real data:</p>
<ul>
<li><strong>/services/seo</strong>: primary keyword: seo agency; intent: Hire; supporting phrases: seo services, seo packages; action: Keep, tighten title</li>
<li><strong>/blog/what-is-seo</strong>: primary keyword: what is seo; intent: Learn; supporting phrases: seo meaning, how seo works; action: Keep</li>
<li><strong>/services/seo-audit</strong>: primary keyword: seo audit; intent: Hire; supporting phrases: website seo check; action: Clash with /blog/seo-audit-guide</li>
<li><strong>(none)</strong>: primary keyword: seo for clinics; intent: Hire; supporting phrases: medical seo; action: New page needed</li>
</ul>
<h2>Fixing a clash</h2>
<p>When two pages compete, you have three sensible options:</p>
<ul>
<li><strong>Merge</strong> them into the stronger page and redirect the weaker URL to it with a permanent (301) redirect.</li>
<li><strong>Differentiate</strong> them. Rewrite one page so its title, headings and opening paragraph clearly serve a different intent.</li>
<li><strong>Demote</strong> one page. Remove internal links that use the contested phrase as anchor text, and point those links at the page you want to rank.</li>
</ul>
<p>Pick the page that already has the most useful content and the most links pointing to it as the winner. Do not choose by which page you like most.</p>
<h2>Use the map day to day</h2>
<ul>
<li><strong>Before writing:</strong> check the map. If the topic is already covered, update that page instead of publishing another.</li>
<li><strong>When linking internally:</strong> use the primary keyword or a close variant as the link text pointing to the mapped page.</li>
<li><strong>When briefing writers:</strong> give them the row: page, primary keyword, intent, supporting phrases.</li>
</ul>
<p>A map does not need special software. A single table that is kept current beats a perfect one nobody reads. The <a href="https://thegorillavibe.com/service/seo">SEO service</a> page shows how we tie keywords to pages, from our team in Dubai.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to read a marketing proposal: questions that reveal the real scope]]></title><description><![CDATA[A proposal describes what an agency intends to do. It does not always describe what you will receive. Two proposals with similar headings can mean very…]]></description><link>https://gorillavibe.hashnode.dev/how-to-read-a-marketing-proposal-questions-that-reveal-the-real-scope</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/how-to-read-a-marketing-proposal-questions-that-reveal-the-real-scope</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Sun, 01 Nov 2026 17:41:58 GMT</pubDate><content:encoded><![CDATA[<p>A proposal describes what an agency intends to do. It does not always describe what you will receive. Two proposals with similar headings can mean very different amounts of work. This guide gives you a way to read one closely and a set of questions to send back before you sign.</p>
<h2>Read activities and deliverables separately</h2>
<p>Highlight every line and mark it as one of two types:</p>
<ul>
<li><strong>Activity:</strong> something the agency does, such as "manage social media", "optimise campaigns", "ongoing SEO".</li>
<li><strong>Deliverable:</strong> something you can point to afterwards, such as "twelve posts", "a new landing page", "a monthly report".</li>
</ul>
<p>Activities are not wrong, but they are hard to check. For each activity, ask what you will be able to see at the end of the month that proves it happened. If the answer is vague, the scope is vague.</p>
<h2>Words that need a follow-up question</h2>
<ul>
<li><strong>"Ongoing optimisation"</strong>: ask: What exactly is changed, how often, and how will I see it?</li>
<li><strong>"Full-service"</strong>: ask: Which services, delivered by whom, and which are excluded?</li>
<li><strong>"Up to"</strong>: ask: What is the minimum, not only the maximum?</li>
<li><strong>"Strategy"</strong>: ask: What document or session will I receive, and when?</li>
<li><strong>"Reporting"</strong>: ask: Which metrics, how often, in what format, and who explains it?</li>
<li><strong>"Support"</strong>: ask: Through which channel, during which hours, with what response time?</li>
<li><strong>"Custom"</strong>: ask: Custom compared with what, and is it built from scratch or from a template?</li>
</ul>
<h2>Ten questions to send back</h2>
<ol>
<li><strong>Who does the work?</strong> Will it be employees, freelancers or another company? Who is my day-to-day contact?</li>
<li><strong>What do you need from me?</strong> Access, approvals, content, photography, decisions. What happens to the schedule if these arrive late?</li>
<li><strong>What is not included?</strong> Ask for an explicit list, covering items such as copywriting, translation, photography, video, stock images and paid tools.</li>
<li><strong>Is advertising spend inside or outside the fee?</strong> Make sure you know whether the money paid to ad platforms is separate from the agency's fee, and who controls the ad accounts.</li>
<li><strong>Who owns the accounts and assets?</strong> Ad accounts, analytics properties, domains, design files and source code should belong to you. Ask this in writing.</li>
<li><strong>How many revisions are included?</strong> And what counts as a revision, compared with a new request?</li>
<li><strong>How is success measured?</strong> Which numbers, from which tool, compared with what starting point? Be wary of any promise of a specific ranking or result, because no one controls search engines or ad auctions.</li>
<li><strong>What are the timelines and milestones?</strong> Dates for first deliverables, and what dependencies could move them.</li>
<li><strong>How do changes work?</strong> If you want to add or swap work midway, how is that agreed and how is it charged?</li>
<li><strong>How do we end?</strong> Notice periods, minimum terms, what is handed over, and in what format. Long fixed terms deserve extra scrutiny.</li>
</ol>
<h2>Check the assumptions section</h2>
<p>Proposals often hide risk in assumptions: "assuming existing content is reused", "assuming client provides approvals within two days". Read each assumption and ask what happens if it does not hold. An assumption that is likely to fail is a future cost.</p>
<h2>Compare proposals fairly</h2>
<p>When you have two or more, do not compare the totals first. Build a simple table with one row per deliverable and one column per agency. Fill in what each includes, what it excludes, and what you must provide. Gaps in a column show the scope you would have to cover another way. Only then compare cost, and compare it against the full list of what you get.</p>
<p>A proposal that survives these questions is easier to hold to account later. For an example of how one agency describes its subscription model, see this <a href="https://thegorillavibe.com/">overview of the subscription</a> from Gorilla Vibe.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[Testing email subject lines honestly]]></title><description><![CDATA[Subject line tests are popular because they are easy to run: send two versions, see which gets more opens, declare a winner. The trouble is that the easy…]]></description><link>https://gorillavibe.hashnode.dev/testing-email-subject-lines-honestly</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/testing-email-subject-lines-honestly</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Sun, 01 Nov 2026 17:26:34 GMT</pubDate><content:encoded><![CDATA[<p>Subject line tests are popular because they are easy to run: send two versions, see which gets more opens, declare a winner. The trouble is that the easy version of the test often tells you very little. This article covers the mistakes that make results unreliable and a more careful way to run a test.</p>
<h2>Why open rates mislead</h2>
<p>An open is recorded when an image in the email loads. Some mail apps, Apple Mail Privacy Protection among them, can load images automatically, so an open may be counted when nobody read the message. Other readers block images, so real reads are not counted. Open rates are therefore a noisy measure, and the noise is not the same across audiences.</p>
<p>Better signals:</p>
<ul>
<li>Clicks on a link in the email.</li>
<li>Replies, for emails that invite them.</li>
<li>Conversions that follow the click, such as a booked call.</li>
</ul>
<p>If you still use opens, use them to compare two versions sent to the same kind of list at the same time, and do not treat the figure as an absolute.</p>
<h2>Test one thing</h2>
<p>If version A is short and plain and version B is long, contains a number and uses a question, you cannot say which change mattered. Change one element:</p>
<ul>
<li>Length</li>
<li>A question versus a statement</li>
<li>Including the recipient's company or topic</li>
<li>A specific detail versus a general claim</li>
</ul>
<p>Write down the single difference before you send.</p>
<h2>Write the hypothesis first</h2>
<p>A useful test begins with a sentence: "A subject line that names the topic will get more clicks than one that teases." Then choose the measure that will decide it, before you see results. This stops you from picking whichever number favours your preference afterwards.</p>
<h2>Split the list properly</h2>
<ol>
<li>Choose recipients at random into two groups. Do not split by alphabet, signup date or region, since each can differ in behaviour.</li>
<li>Send both versions at the same time. Different send times add another difference.</li>
<li>Make the groups the same size.</li>
<li>Keep every other part of the email identical, including the sender name and the preview text.</li>
</ol>
<p>Most email platforms offer a built-in split test. Check how it chooses a winner and whether it sends the rest of the list the winning version automatically, since a small test group can pick a winner by chance.</p>
<h2>Be realistic about small lists</h2>
<p>With a small list, differences between versions are often just chance. If one version leads by a few clicks, a repeat of the test could easily reverse it. Some honest options:</p>
<ul>
<li>Run the same test across several sends and look at the overall direction.</li>
<li>Test bigger differences, which are easier to detect than small ones.</li>
<li>Accept that a small list may not support firm conclusions, and use the exercise to learn from replies instead.</li>
</ul>
<p>Do not stop the moment one version looks ahead. Decide the sample before starting and read the result once.</p>
<h2>Keep a record</h2>
<p>Create a simple table with date, audience, hypothesis, the two subject lines, the measure, results, and what you will do next. After several tests, patterns in your own audience become visible, which is worth more than a generic list of tips.</p>
<h2>Don't forget what follows the subject line</h2>
<p>A subject line only gets someone to look. If the email itself does not deliver on its promise, a high click rate for a misleading line can reduce trust and increase unsubscribes. Check that:</p>
<ul>
<li>The subject accurately describes the content.</li>
<li>The preview text adds something instead of repeating the subject.</li>
<li>The sender name is recognisable.</li>
<li>You are not using urgency that is not real.</li>
</ul>
<h2>A short protocol</h2>
<ol>
<li>Write the hypothesis and the deciding measure.</li>
<li>Change one element.</li>
<li>Split randomly and send together.</li>
<li>Judge on clicks or replies, not opens alone.</li>
<li>Record the result and repeat before drawing wide conclusions.</li>
</ol>
<p>To plan tests across email, ads and landing pages with a team that measures results, <a href="https://thegorillavibe.com/service/performance-marketing">measured campaign testing</a> is among the services Gorilla Vibe packages into its subscription.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[Summarising customer calls with AI safely]]></title><description><![CDATA[Calls with customers contain exactly the detail marketing and sales teams need: the words people use, the objections they raise, and the problems they…]]></description><link>https://gorillavibe.hashnode.dev/summarising-customer-calls-with-ai-safely</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/summarising-customer-calls-with-ai-safely</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Thu, 29 Oct 2026 09:37:47 GMT</pubDate><content:encoded><![CDATA[<p>Calls with customers contain exactly the detail marketing and sales teams need: the words people use, the objections they raise, and the problems they describe. They are also long, and few people have time to re-listen. AI tools can turn a transcript into a summary quickly, but a call is also personal data, and a summary that is wrong is worse than none. This article sets out a careful way to do it.</p>
<h2>Decide whether you should</h2>
<p>Answer these before choosing a tool.</p>
<ol>
<li><strong>Do you have permission to record and process the call?</strong> Rules about recording differ by country and by situation. Tell participants at the start and keep a record that they agreed. If you are unsure, ask whoever handles legal or privacy matters for your business.</li>
<li><strong>What does the tool do with the data?</strong> Read the provider's terms on storage, retention, and whether content may be used to train models. Choose settings or plans that match what you promised people.</li>
<li><strong>Is the call sensitive?</strong> Calls containing health details, payment information, passwords or identity numbers should not go into a summarising tool unless your data rules allow it.</li>
</ol>
<p>If any answer is no or unknown, do not proceed until it is resolved.</p>
<h2>Reduce what you send</h2>
<ul>
<li>Remove names, phone numbers, email addresses and company identifiers where they are not needed for the task. Replace them with labels such as "Client A".</li>
<li>Send only the part of the call that matters, not an hour of small talk.</li>
<li>Do not paste in anything you would not be comfortable explaining to the person on the call.</li>
</ul>
<h2>Use a structured prompt</h2>
<p>A free-form request like "summarise this" returns a free-form result. Ask for the same structure every time:</p>
<pre><code class="language-plaintext">Summarise the transcript below for an internal sales and marketing team.
Use only what is in the transcript. If something is not stated, write "not stated".
Return these headings:
1. Customer's goal
2. Problems described, in the customer's own words where possible
3. Objections or concerns
4. Decisions made and who made them
5. Agreed next steps, with owners and dates if mentioned
6. Open questions
Do not add advice, assumptions or details that are not in the transcript.
</code></pre>
<p>The instruction to write "not stated" gives the tool a way to avoid inventing something to fill a gap.</p>
<h2>Verify every summary</h2>
<p>Summaries read fluently even when they are wrong, which makes errors easy to miss. Build a check into the process.</p>
<ul>
<li>Check names, numbers, dates and commitments against the transcript. These are the details most likely to be altered.</li>
<li>Compare quotes to the original text. If a quote is not in the transcript, remove it.</li>
<li>Look for statements that sound plausible but that nobody said.</li>
<li>Have a person who was on the call read the summary before it is filed or shared.</li>
</ul>
<p>For anything that creates an obligation, such as a promised discount or delivery date, use the original recording or notes, not the summary alone.</p>
<h2>Keep a human in charge of decisions</h2>
<p>A summary can support a decision but should not make one. Do not let a tool decide how to score a lead, whether to follow up, or what to promise without a person reviewing it. Be cautious about tools that rate a customer's mood or intent, since these judgements are hard to check and easy to over-trust.</p>
<h2>Store and share sensibly</h2>
<ol>
<li>Save summaries in the system your team already uses, not in personal files.</li>
<li>Link each summary to the source recording and transcript, so anyone can check it.</li>
<li>Limit access to people who need it.</li>
<li>Set a retention period for recordings and transcripts, and delete them when it ends.</li>
<li>Make sure staff know how to handle a request from a customer to see or delete their data.</li>
</ol>
<h2>Review the process</h2>
<p>Every quarter, sample a few summaries, compare them to transcripts, and note the errors. If the error rate worries you, tighten the prompt or reduce what the tool is asked to do.</p>
<p>To design workflows like this with human review built in, we provide <a href="https://thegorillavibe.com/service/ai-automation">practical AI automation for teams</a>.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[A content refresh routine for old posts]]></title><description><![CDATA[Most blogs publish steadily and never go back. Older posts drift: facts change, screenshots date, links break, and the post stops matching what people want…]]></description><link>https://gorillavibe.hashnode.dev/a-content-refresh-routine-for-old-posts</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/a-content-refresh-routine-for-old-posts</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Thu, 29 Oct 2026 09:22:00 GMT</pubDate><content:encoded><![CDATA[<p>Most blogs publish steadily and never go back. Older posts drift: facts change, screenshots date, links break, and the post stops matching what people want when they search for it. A regular refresh routine keeps useful pages useful without writing everything from scratch.</p>
<p>This is a routine you can run each quarter with a spreadsheet and a few hours.</p>
<h2>Step 1: build the inventory</h2>
<p>Export a list of posts with these columns:</p>
<ul>
<li>URL</li>
<li>Title</li>
<li>Publish date and last updated date</li>
<li>Visits over the last twelve months, from analytics</li>
<li>Search clicks and impressions, from Search Console</li>
<li>Enquiries or conversions the page contributed to, if you track them</li>
</ul>
<p>A spreadsheet with one row per post is enough.</p>
<h2>Step 2: choose a decision for each post</h2>
<p>Give each post one of five labels.</p>
<table>
<thead>
<tr>
<th>Decision</th>
<th>When it fits</th>
</tr>
</thead>
<tbody><tr>
<td>Keep</td>
<td>Accurate, useful and performing as expected</td>
</tr>
<tr>
<td>Update</td>
<td>Still relevant, but facts, examples or structure are out of date</td>
</tr>
<tr>
<td>Merge</td>
<td>Several thin posts cover one topic and compete with each other</td>
</tr>
<tr>
<td>Redirect</td>
<td>Nothing worth keeping, but a close replacement exists</td>
</tr>
<tr>
<td>Remove</td>
<td>Outdated, no value, and no relevant replacement</td>
</tr>
</tbody></table>
<p>Be careful with removal. A page with links pointing to it or steady visitors is usually better updated or redirected than deleted. When removing, return an appropriate status such as 410 or 404 rather than leaving a blank page.</p>
<h2>Step 3: prioritise</h2>
<p>You will not refresh everything. Sort the posts labelled "update" by a mix of value and opportunity:</p>
<ul>
<li>Pages that already bring visits and have slipped.</li>
<li>Pages close to your core services.</li>
<li>Pages about topics where facts change, such as tools, regulations or processes.</li>
</ul>
<p>Start with the ten that matter most.</p>
<h2>Step 4: refresh checklist for each post</h2>
<p>Work through the same list every time.</p>
<ol>
<li><strong>Check the search intent.</strong> Search for the main query yourself. Do the top results answer the same question your post does? If the nature of results has changed, the structure of your post may need to change.</li>
<li><strong>Check every fact.</strong> Names, features, dates, laws, prices and screenshots. Remove anything you cannot verify.</li>
<li><strong>Add what is missing.</strong> Look for questions readers still have, using your own sales and support messages.</li>
<li><strong>Cut what no longer helps.</strong> Shorter and clearer often beats longer.</li>
<li><strong>Fix the headline and opening.</strong> The first paragraph should state what the reader will get.</li>
<li><strong>Repair links.</strong> Replace broken external links, and add links to relevant newer pages on your own site.</li>
<li><strong>Update images and alt text.</strong> Replace outdated screenshots.</li>
<li><strong>Improve the call to action.</strong> Make sure the next step is relevant to the post's reader.</li>
<li><strong>Check titles and descriptions.</strong> Make them accurate and specific.</li>
<li><strong>Review formatting.</strong> Short paragraphs, descriptive headings, and tables where they help.</li>
</ol>
<h2>Step 5: keep the URL</h2>
<p>Do not change the address of a post you are refreshing. A stable URL retains links and history. If you do need to change it, set up a permanent redirect from the old address.</p>
<h2>Step 6: ask search engines to look again</h2>
<p>After publishing, you can use the URL Inspection tool in Search Console and request indexing for important pages. It is not required, and requests are not a guarantee of timing. Keeping your sitemap up to date with accurate last-modified dates also helps.</p>
<h2>Step 7: measure and record</h2>
<p>Note the date of each refresh in your sheet. After a few weeks, compare visits, clicks and enquiries for the page against the weeks before, bearing in mind seasonality and other changes. Do not expect an immediate jump, and do not credit the refresh with changes it did not cause.</p>
<h2>Make it a habit</h2>
<p>Pick a fixed day each quarter, limit the batch to a number you can finish, and record what you learned for the next round.</p>
<p>To plan and run refreshes alongside new publishing with a team, the <a href="https://thegorillavibe.com/service/seo">content-led SEO programme</a> from Gorilla Vibe fits that, within one monthly subscription.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[Building a paid media budget pacing sheet]]></title><description><![CDATA[A monthly ad budget can go wrong in two quiet ways. It can run out on the twentieth, leaving ten days of silence, or it can finish the month well short…]]></description><link>https://gorillavibe.hashnode.dev/building-a-paid-media-budget-pacing-sheet</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/building-a-paid-media-budget-pacing-sheet</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Thu, 29 Oct 2026 08:56:27 GMT</pubDate><content:encoded><![CDATA[<p>A monthly ad budget can go wrong in two quiet ways. It can run out on the twentieth, leaving ten days of silence, or it can finish the month well short, leaving money unspent and opportunities missed. A simple pacing sheet shows which way you are heading while there is still time to act.</p>
<p>This walkthrough builds one in Google Sheets. The same formulas work in Excel with minor changes.</p>
<h2>What the sheet needs</h2>
<p>You need three inputs per campaign or per channel:</p>
<ul>
<li>The monthly budget.</li>
<li>Spend so far this month, taken from the ad platform.</li>
<li>The date the spend figure covers.</li>
</ul>
<p>Everything else is calculated.</p>
<h2>Layout</h2>
<p>Use one row per campaign and these columns:</p>
<table>
<thead>
<tr>
<th>Column</th>
<th>Header</th>
<th>Content</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Campaign</td>
<td>Name</td>
</tr>
<tr>
<td>B</td>
<td>Monthly budget</td>
<td>Typed in</td>
</tr>
<tr>
<td>C</td>
<td>Spend to date</td>
<td>Pasted from the platform</td>
</tr>
<tr>
<td>D</td>
<td>Days elapsed</td>
<td>Formula</td>
</tr>
<tr>
<td>E</td>
<td>Days in month</td>
<td>Formula</td>
</tr>
<tr>
<td>F</td>
<td>Expected spend</td>
<td>Formula</td>
</tr>
<tr>
<td>G</td>
<td>Pacing</td>
<td>Formula</td>
</tr>
<tr>
<td>H</td>
<td>Projected month-end</td>
<td>Formula</td>
</tr>
<tr>
<td>I</td>
<td>Daily spend needed</td>
<td>Formula</td>
</tr>
</tbody></table>
<h2>The formulas</h2>
<p>Put these on row 2 and copy them down.</p>
<p>Days elapsed. If you paste spend up to and including today, use today's day number. If your data is always through yesterday, subtract one:</p>
<p>``` D2: =DAY(TODAY())-1 ```</p>
<p>Days in the month:</p>
<p>``` E2: =DAY(EOMONTH(TODAY(),0)) ```</p>
<p>Expected spend if the budget were spread evenly:</p>
<p>``` F2: =B2*D2/E2 ```</p>
<p>Pacing, as a ratio of actual to expected spend. A value of 1 means exactly on track:</p>
<p>``` G2: =IF(F2=0,"",C2/F2) ```</p>
<p>Projected month-end spend at the current daily rate:</p>
<p>``` H2: =IF(D2=0,"",C2/D2*E2) ```</p>
<p>Daily spend needed to land exactly on budget for the rest of the month:</p>
<p>``` I2: =IF(E2-D2&lt;=0,"",(B2-C2)/(E2-D2)) ```</p>
<p>Add conditional formatting to column G. A reasonable starting rule is amber when pacing falls below 0.9 or rises above 1.1, and red beyond 0.8 or 1.2. Those thresholds are your decision, not an industry standard, so change them to suit how much variation you can tolerate.</p>
<h2>Why even pacing is a simplification</h2>
<p>Straight-line pacing assumes every day is equal. Many accounts are not like that. Business-to-business campaigns often spend less at weekends, and a retailer may plan heavier spend around a sale. If your budget is meant to be uneven, add a column of planned spend by date and compare to that instead of the straight line.</p>
<p>Platform behaviour also matters. Some platforms are allowed to spend more than the daily budget on a given day and balance it out over the month, so a single day above the daily figure is not by itself a fault. Check each platform's documentation for the exact rules on your campaign type.</p>
<h2>How to use it</h2>
<ol>
<li>Update spend each morning, or at least twice a week.</li>
<li>Read the Pacing column first. Anything outside your amber band deserves a look.</li>
<li>For underspend, check budget limits, approval status, narrow targeting, low bids and ad disapprovals.</li>
<li>For overspend, check whether a daily cap was raised, whether a new campaign was added, and whether a promotion changed demand.</li>
<li>Use column I to decide the adjustment, rather than guessing.</li>
</ol>
<h2>Common mistakes</h2>
<ul>
<li>Mixing currencies. Convert platform spend into a single currency before it reaches the sheet, and note the rate used.</li>
<li>Forgetting tax or platform fees if your budget is set net or gross. Decide which and stay consistent.</li>
<li>Pasting spend over formulas. Keep inputs in clearly coloured cells and protect the formula columns.</li>
<li>Adding a campaign mid-month without prorating its budget.</li>
</ul>
<h2>One extra tab</h2>
<p>Add a second tab with a row per month and the final spend against budget. After a few months you will see whether pacing problems are one-offs or a pattern in how the budget is set.</p>
<p>If you would rather have a team manage budgets and bidding, <a href="https://thegorillavibe.com/service/performance-marketing">managed paid media campaigns</a> are run by Gorilla Vibe out of Dubai.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[What a marketing subscription should include]]></title><description><![CDATA[A flat monthly subscription for marketing sounds simple until the first month, when you find that "strategy" meant one call and "social media" meant three…]]></description><link>https://gorillavibe.hashnode.dev/what-a-marketing-subscription-should-include</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/what-a-marketing-subscription-should-include</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Wed, 28 Oct 2026 10:25:05 GMT</pubDate><content:encoded><![CDATA[<p>A flat monthly subscription for marketing sounds simple until the first month, when you find that "strategy" meant one call and "social media" meant three posts. Whether you are comparing providers or setting up an arrangement with one, you can avoid most disappointment by checking the same list of points before you sign.</p>
<p>This is a checklist. It does not say what any provider charges, and it does not recommend a particular model.</p>
<h2>1. A written scope in plain words</h2>
<p>The scope should say what is delivered each month, not just which disciplines are covered. Compare:</p>
<ul>
<li>Vague: "Content and social media."</li>
<li>Clear (an invented example): "Four blog articles of up to 1,000 words, reviewed by you before publishing, and a scheduled social calendar for two platforms."</li>
</ul>
<p>Ask for numbers, formats and limits. If something is not written down, assume it is not included.</p>
<h2>2. Named areas of work</h2>
<p>Check which disciplines are inside the subscription and which are extras. Typical areas are strategy, branding, web design and development, SEO, paid media management, content, social media, automation and analytics. Many providers cover only some. Ask whether ad spend, software licences and stock assets are billed separately, since those are usually paid to third parties.</p>
<h2>3. How requests are handled</h2>
<ul>
<li>How do you submit a request, and where is the status visible?</li>
<li>What is the typical turnaround for a small change, and for a larger piece of work?</li>
<li>Is there a limit on simultaneous requests?</li>
<li>Who sets priorities when requests compete?</li>
</ul>
<p>A subscription with no visible queue becomes a guessing game about what is being worked on.</p>
<h2>4. A named point of contact and the people behind the work</h2>
<p>Find out who you will speak to, who actually does the work, and what happens when someone is away. You do not need a team chart, but you do need to know whom to ask.</p>
<h2>5. Reporting you can use</h2>
<p>Agree what is reported, how often, and in what form. Reports should connect activity to your own goals, such as enquiries and leads, rather than list tasks. Ask whether you get access to the underlying data and dashboards.</p>
<h2>6. Ownership of everything produced</h2>
<p>Confirm in writing that you own the website, content, creative files, ad accounts, analytics properties and domain names, and that the accounts are registered in your business's name, not the provider's. This is the single most important item when a relationship ends.</p>
<h2>7. Terms for leaving</h2>
<p>Check the notice period, whether work in progress is handed over, and what you receive on exit. Ask about lock-in terms before anything else, because a subscription that is hard to leave behaves like a contract with a different name.</p>
<h2>8. Approvals and revisions</h2>
<ul>
<li>Who approves work, and how long does the provider wait before proceeding?</li>
<li>How many rounds of revisions are included?</li>
<li>What happens to unused capacity at month end? If it does not roll over, you should know before you start.</li>
</ul>
<h2>9. Access and security</h2>
<p>Find out how the provider handles logins, who is given admin access, and how access is removed on exit. Use individual accounts, not shared passwords.</p>
<h2>10. Honest limits</h2>
<p>A good provider will tell you what a subscription cannot do: it cannot promise rankings, guarantee sales or replace a product that does not fit the market. Be cautious of guarantees on outcomes that depend on factors outside anyone's control.</p>
<h2>Use the list in a first call</h2>
<p>Take the ten headings, ask each question aloud, and note the answers in a shared document. Then compare answers between providers on the same page.</p>
<p>One example of a plan covering strategy, branding, web and UI/UX, SEO, performance marketing, content and social media, AI automation and analytics is <a href="https://thegorillavibe.com/">Gorilla Vibe's no lock-in monthly plan</a>.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[Structured Data Worth Adding to a Service Page]]></title><description><![CDATA[Structured data is extra markup that describes a page to machines in a labelled, predictable way. It is easy to overdo. Plugins offer dozens of types, and…]]></description><link>https://gorillavibe.hashnode.dev/structured-data-worth-adding-to-a-service-page</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/structured-data-worth-adding-to-a-service-page</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Mon, 26 Oct 2026 20:39:34 GMT</pubDate><content:encoded><![CDATA[<p>Structured data is extra markup that describes a page to machines in a labelled, predictable way. It is easy to overdo. Plugins offer dozens of types, and most of them add maintenance without adding value. For a typical service page, a short list is enough, and each item should earn its place.</p>
<h2>The principle: describe what is visibly there</h2>
<p>Markup should match what a visitor can see on the page. If the markup claims something the page does not show, such as reviews that are not displayed, search engines may ignore it, and it can cause trouble. Treat structured data as a faithful summary, not a place to add claims.</p>
<h2>What is worth adding</h2>
<p><strong>The organisation or business.</strong> Name, logo, official website address and the ways to reach you. It helps search engines connect your pages to one entity. A more specific business type is better than the generic one if it honestly fits.</p>
<p><strong>The service itself.</strong> A service description with its name, a plain summary, the area you serve and the provider. This helps clarify what the page offers, even when it does not change how the result looks.</p>
<p><strong>Breadcrumbs.</strong> If your pages sit in a clear hierarchy, mark up the trail. It is low risk and mirrors something visitors already see.</p>
<p><strong>Questions and answers, if the page really has them.</strong> Be realistic here. Search engines now show decorated question results for only a narrow set of sites, so do not add this expecting a visual boost. Add it when the questions are real and visible, because it still describes the content clearly.</p>
<h2>What to skip</h2>
<ul>
<li>Review or rating markup you cannot support with genuine, visible, collected reviews</li>
<li>Types copied from a competitor because they looked impressive</li>
<li>Several overlapping plugins that each output their own version of the same facts</li>
<li>Anything that needs constant manual updating and will quietly go stale</li>
</ul>
<h2>How to check your work</h2>
<p>Run each page through the official testing tools offered by the search engines, then compare the output with what a visitor sees. Look for errors first, then warnings, and ask whether each field is true today. Recheck after redesigns, because templates change and markup often breaks silently.</p>
<p>Structured data supports good content; it cannot replace it. A clear page, accurate details and sensible internal links come first. For a closer look at how these pieces fit into a wider search plan, see <a href="https://thegorillavibe.com/service/seo">https://thegorillavibe.com/service/seo</a>, where Gorilla Vibe, a marketing agency in Dubai, describes its approach.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[Retainer or Project: A Checklist for Choosing]]></title><description><![CDATA[When you hire outside help for marketing, the first commercial question is the shape of the engagement. A project has a start, an end and a defined result…]]></description><link>https://gorillavibe.hashnode.dev/retainer-or-project-a-checklist-for-choosing</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/retainer-or-project-a-checklist-for-choosing</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Mon, 26 Oct 2026 20:26:04 GMT</pubDate><content:encoded><![CDATA[<p>When you hire outside help for marketing, the first commercial question is the shape of the engagement. A project has a start, an end and a defined result. A retainer is an ongoing arrangement with a steady rhythm of work. Neither is better in general. Use the lists below to see which one your situation resembles.</p>
<h2>A project probably fits when</h2>
<ul>
<li><input disabled type="checkbox" /> You can describe the finished result in a sentence, such as a rebuilt site or a new landing page</li>
<li><input disabled type="checkbox" /> The work has a natural end, after which your own team can carry on</li>
<li><input disabled type="checkbox" /> The scope is stable and unlikely to change much halfway through</li>
<li><input disabled type="checkbox" /> You have a deadline tied to an event, a launch or a season</li>
<li><input disabled type="checkbox" /> You want to compare proposals on the same deliverables</li>
</ul>
<h2>A retainer probably fits when</h2>
<ul>
<li><input disabled type="checkbox" /> The goal is a trend, such as steadier enquiries, rather than a single deliverable</li>
<li><input disabled type="checkbox" /> The work needs regular attention: testing, reporting, adjustment, content</li>
<li><input disabled type="checkbox" /> Channels like search or paid media improve through repeated small changes</li>
<li><input disabled type="checkbox" /> You would rather have a team that learns your business over time than brief someone new each quarter</li>
<li><input disabled type="checkbox" /> Priorities shift and you want room to redirect effort without renegotiating</li>
</ul>
<h2>A hybrid is often the honest answer</h2>
<p>Many businesses begin with a project to build a foundation, such as a site, tracking or a content plan, and then move to a lighter retainer to operate and improve it. If a proposal offers a project followed by an optional retainer, that is a sign the provider has thought about what happens after launch.</p>
<h2>Questions to settle before signing either</h2>
<ol>
<li>What exactly is included, and what would count as extra?</li>
<li>Who owns the accounts, files and data at the end?</li>
<li>How will progress be reported, and how often?</li>
<li>Who on your side approves work, and how quickly?</li>
<li>How can either side end the arrangement, and with what notice?</li>
</ol>
<h2>Warning signs</h2>
<ul>
<li>A retainer with no description of the regular work</li>
<li>Vague promises about results that nobody can control</li>
</ul>
<p>Write your answers down before the first meeting. A clear checklist makes proposals easier to compare, and it makes the conversation more useful for both sides. If you would like to talk through which shape suits your plans, you can <a href="https://thegorillavibe.com/contact">get in touch with the team</a> at Gorilla Vibe, a marketing agency in Dubai.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[Conversion Events That Actually Mean Something]]></title><description><![CDATA[Open the analytics account of almost any small business site and you will find a long list of "conversions": page views of the thank-you page, clicks on…]]></description><link>https://gorillavibe.hashnode.dev/conversion-events-that-actually-mean-something</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/conversion-events-that-actually-mean-something</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Mon, 26 Oct 2026 20:12:27 GMT</pubDate><content:encoded><![CDATA[<p>Open the analytics account of almost any small business site and you will find a long list of "conversions": page views of the thank-you page, clicks on the phone number, scrolls, video plays, button presses. Many are real signals. Many are noise that makes a dashboard look healthy while sales stay flat. Here is a way to decide which events deserve the name.</p>
<h2>Start from money, work backwards</h2>
<p>Write down the sequence that ends in revenue. For a service business it might be: visitor, enquiry, qualified conversation, proposal, signed work. For a shop: product view, basket, checkout, payment. The event you most want to measure is the last one your website can see with confidence. Everything before it is a stepping stone.</p>
<h2>Sort events into three tiers</h2>
<p><strong>Primary.</strong> The action that stands for a real commercial result: a submitted enquiry form, a completed booking, a paid order. Keep this list short. If you have more than a few, you probably have stepping stones in the wrong tier.</p>
<p><strong>Supporting.</strong> Behaviours that tend to precede the primary action: a click to call, a pricing page visit, a brochure download, a started but unfinished form. Track them, but do not hand them to an ad platform as the goal, or it will happily find you people who click phone numbers and never speak.</p>
<p><strong>Diagnostic.</strong> Scroll depth, video progress, tab opens. These help you understand a page, not judge a campaign.</p>
<h2>Check each event with four questions</h2>
<ol>
<li>Can a bot or an accidental click trigger it?</li>
<li>Does it fire once per real action, or several times on reload?</li>
<li>Would someone in the business be glad to receive it? If an event never changes a decision, remove it.</li>
<li>Does it still fire after a site update? Test after every release.</li>
</ol>
<h2>Connect events to the back office</h2>
<p>The strongest upgrade is matching website events to what happened afterwards. Mark which enquiries became customers and feed that status back, even by a weekly import. You then optimise for good leads, not just leads.</p>
<p>Finally, name events consistently and write the list down with an owner. A tidy measurement plan is the foundation for any serious <a href="https://thegorillavibe.com/service/cro">conversion rate optimisation</a> programme, because you cannot improve a rate you cannot trust.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[What to Log Before You Automate a Sales Process]]></title><description><![CDATA[Automation is a multiplier. Point it at a tidy process and you get speed. Point it at a muddled one and you get the same muddle, faster and harder to…]]></description><link>https://gorillavibe.hashnode.dev/what-to-log-before-you-automate-a-sales-process</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/what-to-log-before-you-automate-a-sales-process</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Mon, 26 Oct 2026 19:41:50 GMT</pubDate><content:encoded><![CDATA[<p>Automation is a multiplier. Point it at a tidy process and you get speed. Point it at a muddled one and you get the same muddle, faster and harder to trace. Before anyone wires up triggers and webhooks, spend a few weeks writing down what actually happens.</p>
<h2>Log the path, not the policy</h2>
<p>Your sales playbook describes how things should go. A log shows how they do go. For each new enquiry, capture a handful of facts in a shared sheet:</p>
<ul>
<li>Where it came from: form, phone, messaging app, referral, event</li>
<li>Who touched it first and how long that took</li>
<li>Each hand-off between people, with a timestamp</li>
<li>What information was missing when the hand-off happened</li>
<li>The final outcome and the stated reason</li>
</ul>
<p>The "missing information" column is the most valuable. Every blank you see repeatedly is a candidate for a required field, a follow-up message or an enrichment step.</p>
<h2>Log the exceptions</h2>
<p>Automations handle the common case well and the odd case badly. So write down the odd ones too: duplicate enquiries, leads that arrive in Arabic when your template is English, a prospect who replies to an old thread, a request that belongs to another team. Count how often each appears. If exceptions are frequent, your first automation should route them to a person, not try to solve them.</p>
<h2>Log the decisions humans make</h2>
<p>Whenever someone decides, such as "this lead is not a fit" or "this one needs a call today", ask what they looked at. Those unwritten rules are the logic your automation will need. If three people give three different answers, you have found a process problem that no tool will fix.</p>
<h2>Log the systems involved</h2>
<p>List every place data lives and every place it is copied by hand. Note which one is treated as the source of truth. Manual copying between two tools is usually the best first target, because the rule is already clear and the risk is low.</p>
<h2>Then choose small</h2>
<p>Pick one step that is frequent, rule-based and easy to reverse. Run it alongside the manual process for a while and compare outputs before switching over. Keep a visible way to pause it.</p>
<p>If you would like help turning a log like this into a working design, <a href="https://thegorillavibe.com/service/ai-automation">Gorilla Vibe</a> offers AI automation work for businesses in the UAE and the GCC, and the log you have just built is the best briefing document you could hand over.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[A one-day competitor review for your next marketing plan]]></title><description><![CDATA[Competitor research has a reputation for being slow and expensive. It does not need to be. Before a quarterly plan, a single focused day answers the…]]></description><link>https://gorillavibe.hashnode.dev/a-one-day-competitor-review-for-your-next-marketing-plan</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/a-one-day-competitor-review-for-your-next-marketing-plan</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Mon, 26 Oct 2026 13:03:09 GMT</pubDate><content:encoded><![CDATA[<p>Competitor research has a reputation for being slow and expensive. It does not need to be. Before a quarterly plan, a single focused day answers the questions that actually change decisions: who you are really competing with online, what they say, where they spend, and where they are weak. Here is the structure we use, in four blocks of about two hours each.</p>
<h2>Block 1: decide who the competitors are (morning)</h2>
<p>Your sales team's list of competitors and the list of sites that compete with you in search are rarely the same. Build both:</p>
<ul>
<li><strong>Business competitors</strong>: ask sales which names come up in lost deals and in prospect calls.</li>
<li><strong>Search competitors</strong>: search your five most important service queries and note who appears on the first page, including directories and marketplaces.</li>
<li><strong>Ad competitors</strong>: check the public ad libraries (Meta Ad Library, Google Ads Transparency Center) for the same names.</li>
</ul>
<p>Pick five to review in depth. Mixing one or two search-only competitors with the business ones often reveals the most.</p>
<h2>Block 2: positioning and offer (late morning)</h2>
<p>For each of the five, capture in a sheet:</p>
<ul>
<li>the headline on their homepage and main service page, word for word,</li>
<li>who they say they serve,</li>
<li>how they price (published prices, packages, "contact us"),</li>
<li>the proof they show: case studies, client logos, reviews, awards,</li>
<li>the main call to action and what happens after you click it.</li>
</ul>
<p>Then read your own homepage the same way. The most useful output of the whole day is often the moment you notice that four of the five competitors, and you, use almost the same headline.</p>
<h2>Block 3: channels and content (afternoon)</h2>
<p>Spend about twenty minutes per competitor on:</p>
<ul>
<li><strong>Search</strong>: which of your target queries they rank for, roughly how much content they publish, and whether it is recent.</li>
<li><strong>Paid</strong>: whether they run ads, on which platforms, and what the ads promise. Ad libraries show creative and how long ads have been running; long-running ads are usually the ones that work.</li>
<li><strong>Social</strong>: posting frequency, formats, and the engagement on their last ten posts, not their follower counts.</li>
<li><strong>Reviews</strong>: rating, volume and, most valuable of all, what customers praise and complain about.</li>
</ul>
<p>Keep notes factual. "Posts three short videos a week; last ten average about 40 likes" is useful. "Strong social presence" is not.</p>
<h2>Block 4: turn notes into decisions (late afternoon)</h2>
<p>Summarise each competitor on one line: their main promise, their strongest channel, and their visible weakness. Then answer four questions for your own plan:</p>
<ol>
<li><strong>Where are we saying the same thing as everyone else?</strong> That is a positioning problem to fix first.</li>
<li><strong>Which channel are competitors neglecting</strong> that our customers use?</li>
<li><strong>What do their unhappy reviews ask for</strong> that we can genuinely offer?</li>
<li><strong>What are they doing well that we should match</strong> before trying to be different?</li>
</ol>
<p>Each answer should become one line in next quarter's plan, with an owner.</p>
<h2>What to keep out of it</h2>
<ul>
<li><strong>Guessing their numbers.</strong> Traffic and spend estimates from third-party tools are directional at best. Use them to compare competitors with each other, not as facts.</li>
<li><strong>Copying.</strong> The aim is to find a gap, not to rebuild a competitor's page with your logo.</li>
<li><strong>Endless updating.</strong> Repeat the review once a quarter; in between, keep a simple shared doc where anyone can drop notable competitor moves.</li>
</ul>
<h2>The deliverable</h2>
<p>A one-page summary (five competitor lines, four answers, three decisions) is more useful than a fifty-slide deck. It is short enough to read before the planning meeting and specific enough to act on.</p>
<p>This kind of review is part of the <a href="https://thegorillavibe.com/service/strategy-intelligence">strategy and intelligence work</a> we do at the start of every planning cycle.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[Internal linking for service pages: a one-afternoon audit]]></title><description><![CDATA[Service pages are usually the pages a business most wants to rank, and they are often the worst linked pages on the site. They sit in the main menu, the…]]></description><link>https://gorillavibe.hashnode.dev/internal-linking-for-service-pages-a-one-afternoon-audit</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/internal-linking-for-service-pages-a-one-afternoon-audit</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Mon, 26 Oct 2026 12:57:54 GMT</pubDate><content:encoded><![CDATA[<p>Service pages are usually the pages a business most wants to rank, and they are often the worst linked pages on the site. They sit in the main menu, the blog never mentions them, and the only internal links pointing at them say "Learn more". Internal links are one of the few ranking signals you control completely, and fixing them takes an afternoon, not a project. Here is the audit we run.</p>
<h2>What you need</h2>
<ul>
<li>A crawl of the site (any crawler that exports "inlinks" per URL works).</li>
<li>A list of your service pages and the main search query each one should rank for.</li>
<li>Search Console access, for the queries each page already gets impressions for.</li>
</ul>
<h2>Step 1: count the internal links to each service page</h2>
<p>From the crawl, export every internal link with its source URL, destination URL and anchor text. Filter to your service pages and count:</p>
<ul>
<li><strong>unique linking pages</strong> per service page,</li>
<li>links that come <strong>from the navigation or footer</strong> versus links <strong>inside body content</strong>,</li>
<li>the <strong>anchor texts</strong> used.</li>
</ul>
<p>A typical result: every service page has the same 200 links from the menu and footer, and between zero and three links from content. Navigation links tell search engines a page exists. Contextual links from relevant articles tell them what it is about.</p>
<h2>Step 2: find the pages that should link but do not</h2>
<p>For each service page, look for site pages that already discuss its topic. Two quick ways:</p>
<ol>
<li>A <code>site:yourdomain.com "topic phrase"</code> search for each service's main phrase.</li>
<li>In Search Console, the Pages report filtered by a query: articles that get impressions for a service query but do not link to the service page are your best candidates.</li>
</ol>
<p>Write the candidates into a simple sheet: source page, target service page, suggested anchor, sentence where it fits.</p>
<h2>Step 3: write anchors that describe the destination</h2>
<p>Good anchor text says what the reader will get: "our technical SEO audit", "conversion rate optimisation for lead-generation sites", "a website rebuild plan". Avoid three things:</p>
<ul>
<li><strong>Generic anchors</strong> ("click here", "learn more", "this page"). They waste the signal.</li>
<li><strong>The same exact-match phrase everywhere.</strong> Vary the wording naturally, as a person would.</li>
<li><strong>Links forced into sentences</strong> that do not need them. If the link does not help the reader at that point, leave it out.</li>
</ul>
<h2>Step 4: fix the links you already have</h2>
<p>The audit usually turns up these problems, each of which is quick to fix:</p>
<ul>
<li><strong>Links to redirected URLs.</strong> After a site move, internal links often still point at old paths that redirect. Update them to the final URL so crawlers do not waste a hop.</li>
<li><strong>Links to broken pages.</strong> A service that was renamed or merged leaves 404 links behind in old articles.</li>
<li><strong>Orphan pages.</strong> Service or location pages with no internal links at all, reachable only through the sitemap.</li>
<li><strong>Links hidden in scripts or tabs</strong> that crawlers cannot follow. Check the rendered HTML for a real <code>&lt;a href&gt;</code>.</li>
</ul>
<h2>Step 5: add a "related services" block, carefully</h2>
<p>A short block at the end of each service page linking to two or three genuinely related services helps both users and crawlers. Keep it small and specific; a block linking to every service on every page adds nothing.</p>
<h2>How to tell if it worked</h2>
<p>Note the date of the changes, then compare after four to eight weeks in Search Console: impressions and average position for each service page's main queries, and the number of queries each page appears for. Internal linking rarely produces overnight jumps, but it reliably helps the pages you most want found.</p>
<h2>A realistic target</h2>
<p>For a small or mid-sized business site: every service page with at least five contextual links from relevant articles, no internal links to redirects or 404s, and no orphan pages. That is achievable in a single focused afternoon.</p>
<p>If you want a second pair of eyes on your site's structure, the <a href="https://thegorillavibe.com/service/seo">Gorilla Vibe SEO team</a> runs this audit as part of its technical reviews.</p>
<p><em>Written with AI assistance for the Gorilla Vibe marketing team.</em></p>
]]></content:encoded></item><item><title><![CDATA[A redirect audit to run before any site move]]></title><description><![CDATA[Most traffic and ranking losses after a site move come from redirects that were forgotten, chained or pointed at the wrong page. A short audit before…]]></description><link>https://gorillavibe.hashnode.dev/a-redirect-audit-to-run-before-any-site-move</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/a-redirect-audit-to-run-before-any-site-move</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Wed, 21 Oct 2026 10:37:19 GMT</pubDate><content:encoded><![CDATA[<p>Most traffic and ranking losses after a site move come from redirects that were forgotten, chained or pointed at the wrong page. A short audit before launch catches nearly all of them.</p>
<h2>Pick the right status code</h2>
<ul>
<li><strong>301 (or 308):</strong> the move is permanent. Use it when a URL is replaced for good. Search engines treat it as a signal to prefer the new address.</li>
<li><strong>302 (or 307):</strong> the move is temporary. Use it only when the old URL will come back.</li>
<li>Redirects that rely on JavaScript or a meta refresh are weaker signals than a server redirect, so avoid them for a site move.</li>
</ul>
<h2>The pre-launch audit</h2>
<ol>
<li><strong>Export the old URL list</strong> from the sitemap, the CMS, analytics and the server logs, not from one source only.</li>
<li><strong>Map every old URL to its closest equivalent</strong>, one to one. Sending everything to the homepage is treated as a soft 404 in many cases and helps nobody.</li>
<li><strong>Test the whole list on staging</strong> with a script: request each old URL without following redirects, and record the status code, the <code>Location</code> header and the final status.</li>
<li><strong>Fail the build on three patterns:</strong> redirect chains (A to B to C), redirect loops, and targets that do not answer <code>200</code>.</li>
<li><strong>Keep the redirects live</strong> for at least a year, and longer for URLs that still have inbound links.</li>
</ol>
<h2>After launch</h2>
<p>Re-run the same script against production, watch the Pages and Crawl stats reports in Search Console, and update internal links to point at the final URLs so the redirects are a safety net, not the main route.</p>
<p>This is the kind of check we package in our <a href="https://thegorillavibe.com/service/audits-sprints-special-ops">audits, sprints and special ops</a> service.</p>
<p><em>References: <a href="https://developers.google.com/search/docs/crawling-indexing/301-redirects">Google Search Central: Redirects and Google Search</a>, <a href="https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes">Google Search Central: Site moves with URL changes</a>.</em></p>
<p><em>This article was drafted with AI assistance and checked against the sources cited above.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to write alt text that is useful, not stuffed]]></title><description><![CDATA[Alt text has two jobs: it lets people who cannot see an image understand it, and it gives search engines context about what the image shows. Most alt text…]]></description><link>https://gorillavibe.hashnode.dev/how-to-write-alt-text-that-is-useful-not-stuffed</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/how-to-write-alt-text-that-is-useful-not-stuffed</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Wed, 21 Oct 2026 10:36:36 GMT</pubDate><content:encoded><![CDATA[<p>Alt text has two jobs: it lets people who cannot see an image understand it, and it gives search engines context about what the image shows. Most alt text fails at the first job, and the second job does not need keyword stuffing.</p>
<h2>Describe the purpose, not just the picture</h2>
<p>Ask what the image is <em>for</em> on that page.</p>
<ul>
<li><strong>Informative image</strong> (a chart, a product photo): describe what matters about it. "Bar chart: organic sessions rose from 4,200 to 6,100 over six months" beats "chart".</li>
<li><strong>Functional image</strong> (a logo that links home, an icon button): describe the action. "Gorilla Vibe home" rather than "logo".</li>
<li><strong>Decorative image</strong> (a divider, a background flourish): use an empty <code>alt=""</code> so screen readers skip it.</li>
<li><strong>Text in an image:</strong> repeat the text, and prefer real text in the page where you can.</li>
</ul>
<h2>Simple rules</h2>
<ol>
<li>Keep it short, usually a sentence or less.</li>
<li>Do not start with "image of" or "picture of"; assistive technology already announces an image.</li>
<li>Write for a person first. If a product name or place naturally belongs, include it once, and stop there.</li>
<li>Never repeat the same keyword across every image on a page. That is noise for users and a pattern search engines have said not to rely on.</li>
<li>Use a descriptive file name and nearby text as well; alt text is one signal among several.</li>
</ol>
<h2>Check it quickly</h2>
<p>Turn images off in your browser, or read the page with a screen reader for two minutes. Anything that makes no sense without the picture needs better alt text.</p>
<p>Clear, accessible content is part of how we plan copy and visuals in our <a href="https://thegorillavibe.com/service/content-social-media">content and social media</a> work.</p>
<p><em>References: <a href="https://www.w3.org/WAI/tutorials/images/decision-tree/">W3C WAI: An alt decision tree</a>, <a href="https://developers.google.com/search/docs/appearance/google-images">Google Search Central: Image SEO best practices</a>.</em></p>
<p><em>This article was drafted with AI assistance and checked against the sources cited above.</em></p>
]]></content:encoded></item><item><title><![CDATA[Core Web Vitals in plain English: the three numbers and what usually moves them]]></title><description><![CDATA[Core Web Vitals are three field measurements Google uses to describe how a page feels to real visitors. They are easy to quote and easy to misread, so here…]]></description><link>https://gorillavibe.hashnode.dev/core-web-vitals-in-plain-english-the-three-numbers-and-what-usually-moves-them</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/core-web-vitals-in-plain-english-the-three-numbers-and-what-usually-moves-them</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Wed, 21 Oct 2026 10:32:35 GMT</pubDate><content:encoded><![CDATA[<p>Core Web Vitals are three field measurements Google uses to describe how a page feels to real visitors. They are easy to quote and easy to misread, so here they are in plain English, with the thresholds Google publishes and the fixes that usually move each number.</p>
<h2>The three numbers</h2>
<table>
<thead>
<tr>
<th>Metric</th>
<th>What it measures</th>
<th>"Good" threshold</th>
</tr>
</thead>
<tbody><tr>
<td><strong>LCP</strong> (Largest Contentful Paint)</td>
<td>how long until the main content is visible</td>
<td>2.5 seconds or less</td>
</tr>
<tr>
<td><strong>INP</strong> (Interaction to Next Paint)</td>
<td>how quickly the page responds after a tap or click</td>
<td>200 milliseconds or less</td>
</tr>
<tr>
<td><strong>CLS</strong> (Cumulative Layout Shift)</td>
<td>how much the layout jumps while loading</td>
<td>0.1 or less</td>
</tr>
</tbody></table>
<p>Google assesses these at the 75th percentile of real visits, split by phone and desktop, so one fast test on your own laptop says very little.</p>
<h2>What usually moves each one</h2>
<ul>
<li><strong>LCP:</strong> the largest element is often a hero image or a headline. Serve the hero image at the right size, do not lazy-load it, and make sure the server answers quickly. Render-blocking CSS and heavy fonts come next.</li>
<li><strong>INP:</strong> long JavaScript tasks block the page from reacting. Look at third-party tags, large framework bundles and handlers that do too much work on a click.</li>
<li><strong>CLS:</strong> reserve space for images, embeds, ads and banners (width and height attributes, or an aspect ratio), and avoid inserting content above what the visitor is already reading.</li>
</ul>
<h2>A routine that works</h2>
<ol>
<li>Start with field data (the Core Web Vitals report in Search Console, or the Chrome UX Report), not a single lab run.</li>
<li>Pick the template with the most visits and the worst number, not the page you happen to like.</li>
<li>Change one thing, then wait for field data to catch up. It is a rolling window, so improvements take weeks to show.</li>
</ol>
<p>Performance work like this is part of how we build and maintain sites in our <a href="https://thegorillavibe.com/service/web-platform-development">web platform development</a> service.</p>
<p><em>References: <a href="https://web.dev/articles/vitals">web.dev: Web Vitals</a>, <a href="https://web.dev/articles/inp">web.dev: Interaction to Next Paint</a>, <a href="https://developers.google.com/search/docs/appearance/core-web-vitals">Google Search Central: Core Web Vitals</a>.</em></p>
<p><em>This article was drafted with AI assistance and checked against the sources cited above.</em></p>
]]></content:encoded></item><item><title><![CDATA[Fixing the Grey Box: A Share-Preview Checklist for Open Graph and Twitter Cards]]></title><description><![CDATA[You send a link to a prospect on WhatsApp, a partner shares your article on LinkedIn, someone drops your homepage into Slack, and the preview is a grey box…]]></description><link>https://gorillavibe.hashnode.dev/fixing-the-grey-box-a-share-preview-checklist-for-open-graph-and-twitter-cards</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/fixing-the-grey-box-a-share-preview-checklist-for-open-graph-and-twitter-cards</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Mon, 19 Oct 2026 11:03:22 GMT</pubDate><content:encoded><![CDATA[<p>You send a link to a prospect on WhatsApp, a partner shares your article on LinkedIn, someone drops your homepage into Slack, and the preview is a grey box with a bare URL. Every share of that page now looks less trustworthy than a competitor's. The fix is a handful of tags in the page head, but they fail in predictable ways. This is the checklist we run.</p>
<h2>The five tags that make the preview</h2>
<pre><code class="language-html">&lt;meta property="og:title" content="SEO for B2B companies in the UAE | Example Agency"&gt;
&lt;meta property="og:description" content="Technical SEO, content and reporting for B2B companies across the GCC."&gt;
&lt;meta property="og:image" content="https://example.com/og/seo-service-1200x630.jpg"&gt;
&lt;meta property="og:url" content="https://example.com/service/seo"&gt;
&lt;meta name="twitter:card" content="summary_large_image"&gt;
</code></pre>
<p>LinkedIn, Facebook, WhatsApp, Slack, Telegram and most chat apps read Open Graph. X reads <code>twitter:card</code> first and falls back to Open Graph for the rest.</p>
<h2>Why previews still come out grey</h2>
<ol>
<li><strong>No <code>og:image</code> at all.</strong> This is the most common case. Many CMS templates set it only on blog posts, so service pages and the homepage share as text.</li>
<li><strong>The image URL is not public.</strong> Relative paths (<code>/og.jpg</code>), images behind a login, staging hostnames, or images blocked by <code>robots.txt</code> cannot be fetched by the platform's crawler. Always use an absolute <code>https://</code> URL that answers <code>200</code> to anonymous requests.</li>
<li><strong>Wrong size or format.</strong> Use 1200 × 630 pixels, JPG or PNG, under about 5 MB. Square or very small images are cropped or ignored.</li>
<li><strong>Placeholder text.</strong> A description like <code>sdfsdffsdfsd</code> left from development goes into every preview. Real example, real production site.</li>
<li><strong>Cached old preview.</strong> Platforms cache the first scrape. After fixing the tags, refresh the cache in the LinkedIn Post Inspector and the Facebook Sharing Debugger, otherwise you keep seeing the old grey box.</li>
<li><strong>Tags rendered by JavaScript only.</strong> Most link-preview crawlers do not run JavaScript. Tags must be in the server-rendered HTML.</li>
</ol>
<h2>A default that covers every page</h2>
<p>Create one branded default image, 1200 × 630, with the logo and a short value statement in safe margins. Set it in the base layout, and let individual templates override it:</p>
<pre><code class="language-tsx">// Next.js App Router example
export const metadata = {
  openGraph: {
    images: [{ url: 'https://example.com/og/default-1200x630.jpg', width: 1200, height: 630 }],
  },
  twitter: { card: 'summary_large_image' },
};
</code></pre>
<p>Then give your most-shared pages (homepage, top services, best articles) their own image.</p>
<h2>Checklist</h2>
<ul>
<li> <code>og:title</code>, <code>og:description</code>, <code>og:image</code>, <code>og:url</code> and <code>twitter:card</code> exist on every template</li>
<li> <code>og:image</code> is absolute and public, answers <code>200</code> with an <code>image/*</code> type, and is 1200 × 630</li>
<li> <code>og:url</code> matches the canonical URL</li>
<li> No placeholder text in titles or descriptions</li>
<li> The tags are in the server HTML (view source, not DevTools)</li>
<li> The cache is refreshed in the LinkedIn and Facebook debuggers after changes</li>
</ul>
<p>To check a whole list of URLs at once, we use a small open-source script, <a href="https://gitlab.com/gorillavibe/og-meta-check">og-meta-check</a>. It flags missing tags, images that don't load, and descriptions that will be truncated.</p>
<p>First impressions now happen in chat windows as much as on websites. Getting this right is a small part of the brand and web work we do at <a href="https://thegorillavibe.com/">Gorilla Vibe</a>.</p>
<p><em>References: <a href="https://ogp.me/">The Open Graph protocol</a>, <a href="https://www.linkedin.com/post-inspector/">LinkedIn Post Inspector</a>, <a href="https://developer.x.com/en/docs/x-for-websites/cards/overview/abouts-cards">X Cards: getting started</a>.</em></p>
<p><em>This article was drafted with AI assistance.</em></p>
]]></content:encoded></item><item><title><![CDATA[A robots.txt Decision Table for Search and AI Crawlers]]></title><description><![CDATA[Every few weeks a client asks the same question: should we block the AI bots? The honest answer is "it depends on what each bot does with your pages". The…]]></description><link>https://gorillavibe.hashnode.dev/a-robots-txt-decision-table-for-search-and-ai-crawlers</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/a-robots-txt-decision-table-for-search-and-ai-crawlers</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Mon, 19 Oct 2026 11:02:09 GMT</pubDate><content:encoded><![CDATA[<p>Every few weeks a client asks the same question: <em>should we block the AI bots?</em> The honest answer is "it depends on what each bot does with your pages". The crawlers in your server logs do different jobs, and blocking all of them with one rule throws away visibility you may want. Here is the decision table we use, followed by the <code>robots.txt</code> patterns and the mistakes to avoid.</p>
<h2>Who is crawling, and why</h2>
<table>
<thead>
<tr>
<th>Crawler (user agent)</th>
<th>Operator</th>
<th>What it is used for</th>
</tr>
</thead>
<tbody><tr>
<td><code>Googlebot</code></td>
<td>Google</td>
<td>Search indexing (and AI Overviews, which draw on the normal search index)</td>
</tr>
<tr>
<td><code>Google-Extended</code></td>
<td>Google</td>
<td>A <strong>control token</strong>, not a separate crawler: opting out stops content being used for Gemini model training and grounding, without affecting Search</td>
</tr>
<tr>
<td><code>Bingbot</code></td>
<td>Microsoft</td>
<td>Bing search, which also feeds Copilot answers</td>
</tr>
<tr>
<td><code>GPTBot</code></td>
<td>OpenAI</td>
<td>Collecting content for training OpenAI models</td>
</tr>
<tr>
<td><code>OAI-SearchBot</code></td>
<td>OpenAI</td>
<td>Surfacing and linking sites in ChatGPT search results</td>
</tr>
<tr>
<td><code>ChatGPT-User</code></td>
<td>OpenAI</td>
<td>Fetching a page on demand because a user asked about it</td>
</tr>
<tr>
<td><code>PerplexityBot</code></td>
<td>Perplexity</td>
<td>Indexing for Perplexity answers and citations</td>
</tr>
<tr>
<td><code>ClaudeBot</code></td>
<td>Anthropic</td>
<td>Collecting content for training Anthropic models</td>
</tr>
<tr>
<td><code>CCBot</code></td>
<td>Common Crawl</td>
<td>An open web archive that many datasets are built from</td>
</tr>
</tbody></table>
<p>The useful split is <strong>search and citation</strong> crawlers, which can send you visitors and mention your brand, versus <strong>training-only</strong> crawlers, which use your content without sending traffic back.</p>
<h2>The decision table</h2>
<table>
<thead>
<tr>
<th>Your situation</th>
<th>Search crawlers</th>
<th>AI search / citation crawlers</th>
<th>Training-only crawlers</th>
</tr>
</thead>
<tbody><tr>
<td>Service business that wants to be found and recommended</td>
<td>allow</td>
<td><strong>allow</strong>: being cited in AI answers is the new "page one"</td>
<td>your choice: usually allow, or block if you object to training use</td>
</tr>
<tr>
<td>Publisher whose revenue depends on visits</td>
<td>allow</td>
<td>allow, and watch referral traffic</td>
<td>block (<code>GPTBot</code>, <code>ClaudeBot</code>, <code>CCBot</code>, <code>Google-Extended</code>)</td>
</tr>
<tr>
<td>Paywalled or member content</td>
<td>allow on public pages only</td>
<td>allow on public pages only</td>
<td>block</td>
</tr>
<tr>
<td>Staging / test environments</td>
<td><strong>block everything</strong> (and use authentication; robots.txt is not security)</td>
<td>block</td>
<td>block</td>
</tr>
</tbody></table>
<h2>The patterns</h2>
<p>Allow everything, but opt out of model training:</p>
<pre><code class="language-text">User-agent: *
Allow: /

User-agent: GPTBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: Google-Extended
Disallow: /

Sitemap: https://example.com/sitemap.xml
</code></pre>
<p>Keep a private area out of every crawler:</p>
<pre><code class="language-text">User-agent: *
Disallow: /account/
Disallow: /checkout/
</code></pre>
<h2>Mistakes we see</h2>
<ol>
<li><strong>Blocking <code>Googlebot</code> "to stop Google AI".</strong> It removes you from Search. Use <code>Google-Extended</code> for training and grounding.</li>
<li><strong>Using robots.txt to hide pages from search results.</strong> Robots.txt stops crawling, not indexing. A blocked URL can still be listed from links. Use a crawlable page with <code>noindex</code> instead.</li>
<li><strong>Blocking <code>OAI-SearchBot</code> or <code>PerplexityBot</code> by accident</strong> with a broad <code>User-agent: *</code> disallow added for another reason. Then wondering why competitors are cited and you are not.</li>
<li><strong>Never re-checking.</strong> New crawlers appear every few months, and operators change user agents. Put a quarterly reminder next to the file.</li>
<li><strong>Treating robots.txt as enforcement.</strong> Well-behaved crawlers honour it. Others don't. Rate limiting and WAF rules are the tools for abusive bots.</li>
</ol>
<h2>How to check what you have</h2>
<p>Run your key URLs through a small script with <code>urllib.robotparser</code> (Python standard library), or our open-source <a href="https://codeberg.org/gorillavibe/robots-check">robots-check</a>. It prints an allow/deny matrix for search and AI crawlers. Then compare the matrix with the decision table above, and write the decision down so the next developer doesn't undo it.</p>
<p>Getting found in AI answers starts with technical basics like this one. It's part of how we approach <a href="https://thegorillavibe.com/service/ai-automation">AI and automation</a> for our clients.</p>
<p><em>References: <a href="https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers">Google: Google-Extended and Google's crawlers</a>, <a href="https://platform.openai.com/docs/bots">OpenAI: Overview of OpenAI crawlers</a>, <a href="https://developers.google.com/search/docs/crawling-indexing/robots/intro">Google: Introduction to robots.txt</a>.</em></p>
<p><em>This article was drafted with AI assistance.</em></p>
]]></content:encoded></item><item><title><![CDATA[XML sitemap hygiene: what belongs in your sitemap (and what we keep finding instead)]]></title><description><![CDATA[An XML sitemap is not a list of every URL your CMS knows about. It is a statement to search engines: these are the pages I want indexed, and this is their…]]></description><link>https://gorillavibe.hashnode.dev/xml-sitemap-hygiene-what-belongs-in-your-sitemap-and-what-we-keep-finding-instead</link><guid isPermaLink="true">https://gorillavibe.hashnode.dev/xml-sitemap-hygiene-what-belongs-in-your-sitemap-and-what-we-keep-finding-instead</guid><dc:creator><![CDATA[The Gorilla Vibe]]></dc:creator><pubDate>Sun, 18 Oct 2026 15:34:47 GMT</pubDate><content:encoded><![CDATA[<p>An XML sitemap is not a list of every URL your CMS knows about. It is a statement to search engines: <em>these are the pages I want indexed, and this is their canonical address</em>. When the statement is wrong, search engines learn to trust the file less, and the pages you actually care about get crawled later. Most sitemaps we audit fail in the same few ways.</p>
<h2>What belongs in a sitemap</h2>
<p>Only URLs that are, at the same time:</p>
<ul>
<li>answering <strong><code>200</code></strong> directly (no redirect),</li>
<li><strong>indexable</strong> (no <code>noindex</code> in meta robots or the <code>X-Robots-Tag</code> header),</li>
<li><strong>self-canonical</strong> (the canonical tag points at the same URL),</li>
<li><strong>published and meant for search</strong> (not test pages, thank-you pages, internal search results or filtered listings).</li>
</ul>
<p>If a URL fails any one of these, it does not belong in the file.</p>
<h2>What we usually find instead</h2>
<table>
<thead>
<tr>
<th>Found in the sitemap</th>
<th>Why it is a problem</th>
<th>Fix</th>
</tr>
</thead>
<tbody><tr>
<td><code>/qa-builder-smoke-test-page</code>, <code>/service/test21</code></td>
<td>Test content offered for indexing; it often returns 404 later</td>
<td>Delete test pages in the CMS; generate the sitemap only from published content</td>
</tr>
<tr>
<td><code>/thank-you</code> with <code>noindex</code></td>
<td>A contradiction: "index this" plus "don't index this"</td>
<td>Exclude noindex templates from the generator</td>
</tr>
<tr>
<td>Old URLs that now redirect</td>
<td>Search engines are asked to crawl addresses you abandoned</td>
<td>List the final URLs only, and keep the 301s in place</td>
</tr>
<tr>
<td><code>/about</code>, <code>/faq</code> returning 404</td>
<td>Broken promise; wastes crawl budget</td>
<td>Publish the pages or remove them from menu and sitemap</td>
</tr>
<tr>
<td>Every <code>lastmod</code> at the same second</td>
<td>Signals that the date is not real, so search engines ignore it</td>
<td>Set <code>lastmod</code> from the real content change date, or leave it out</td>
</tr>
<tr>
<td><code>?category=</code> and <code>?tag=</code> variants</td>
<td>Duplicate listings competing with the main page</td>
<td>Canonicalise them to the main listing and keep them out</td>
</tr>
</tbody></table>
<h2>Structure that scales</h2>
<ul>
<li><strong>Use a sitemap index</strong> that points to one file per content type: <code>pages</code>, <code>posts</code>, <code>services</code>, <code>careers</code>. When one type breaks, you see it immediately.</li>
<li><strong>Stay under 50,000 URLs and 50 MB per file</strong>, which is the protocol limit.</li>
<li><strong>Reference the index in <code>robots.txt</code></strong> (<code>Sitemap: https://example.com/sitemap.xml</code>) and submit it in Search Console and Bing Webmaster Tools.</li>
<li><strong>Use one hostname and protocol</strong>, the canonical one. Don't mix <code>www</code> and non-<code>www</code>, or <code>http</code> and <code>https</code>.</li>
</ul>
<h2>Audit it like a crawler would</h2>
<p>Read the sitemap and its index, request each URL <strong>without following redirects</strong>, and flag anything that is not a plain <code>200</code>, indexable and self-canonical. Add a pattern check for words like <code>test</code>, <code>staging</code>, <code>demo</code> and <code>smoke</code> in the path. Our small open-source script <a href="https://codeberg.org/gorillavibe/sitemap-audit">sitemap-audit</a> does exactly this with the Python standard library. It is easy to run after every release.</p>
<h2>Then keep it clean</h2>
<p>The durable fix is in the generator, not in the XML file. Make the sitemap a query over <em>published, indexable, canonical</em> content, so test pages and drafts can never enter it. Then re-run the audit monthly. A clean sitemap won't rank anything by itself, but it removes noise between your best pages and the crawler.</p>
<p>This kind of technical groundwork comes before content and links in our <a href="https://thegorillavibe.com/service/seo">SEO service</a>.</p>
<p><em>References: <a href="https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap">Google: Build and submit a sitemap</a>, <a href="https://www.sitemaps.org/protocol.html">sitemaps.org protocol</a>, <a href="https://www.bing.com/webmasters/help/sitemaps-3b5cf6ed">Bing: Sitemaps best practices</a>.</em></p>
<p><em>This article was drafted with AI assistance and checked against the sources cited above.</em></p>
]]></content:encoded></item></channel></rss>