<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Mendola.Tech Guides &amp; Resources</title>
    <link>https://mendola.tech/blog/</link>
    <description>Practical website, technology, analytics, automation, and operations guides for small businesses.</description>
    <language>en-us</language>
    <atom:link href="https://mendola.tech/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How to Buy a Domain Name for a Small Business: An Ownership and Security Checklist</title>
      <link>https://mendola.tech/blog/small-business-domain-name-purchase-checklist/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/small-business-domain-name-purchase-checklist/</guid>
      <description>A registrar-neutral checklist for buying a business domain, documenting ownership, securing the account, and testing DNS and renewal recovery.</description>
      <category>Technology Operations</category>
      <pubDate>Sat, 15 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<blockquote>
<p>Reference guide — 2026-08-15. This is a registrar-neutral operating checklist, not legal, trademark, tax, security, or registrar-specific advice. Availability, prices, policies, privacy options, and transfer rules must be checked with the applicable registrar and registry before acting.</p>
</blockquote>
<p>People often say they want to “purchase a website name.” The item being registered is a <strong>domain name</strong>: the address that can be connected to a website, email, and other services. Registration creates a time-limited contractual right to use the name under the registrar's agreement; it is not a permanent one-time purchase.</p>
<p>The safest small-business setup is simple to describe: the business is the registered name holder, the registrar account is business-controlled, at least two authorized people can recover it, and every renewal and DNS dependency is documented. The checklist below turns that principle into an acceptance test.</p>
<h2 id="what-matters-most">What matters most</h2>
<ol>
<li><strong>Ownership should be established before checkout.</strong> The business should decide which legal entity or authorized individual will be the registrant, which durable company email will receive notices, and who can approve account or DNS changes. A developer or agency can receive delegated access without becoming the sole owner.</li>
<li><strong>The advertised registration price is only one input.</strong> Compare renewal pricing, included privacy or proxy terms, multifactor authentication, recovery, DNS management, support, transfer instructions, expiration handling, and the complete registration agreement. ICANN says registrants are entitled to accessible information about those processes and terms.</li>
<li><strong>Availability is not clearance.</strong> A registrar search showing that a string is available does not determine whether using it conflicts with another party's rights, local naming rules, or a registry restriction. Escalate legal questions rather than treating checkout availability as approval.</li>
<li><strong>The acceptance test must include website and email dependencies.</strong> Changing nameservers or DNS records can affect the website, mail delivery, verification records, and third-party services. Record the baseline before a change and test each dependency afterward.</li>
<li><strong>Renewal and recovery are operational controls.</strong> Auto-renew can reduce accidental expiration risk only when the payment method, notices, account access, and recovery contacts remain current. A renewal checkbox without an owner and a review date is not a continuity plan.</li>
</ol>
<h2 id="how-to-use-this-checklist">How to use this checklist</h2>
<p>This guide was prepared on 2026-08-15 from ICANN's registrant information, accredited-registrar information, registration overview, rights and responsibilities, locked-domain guidance, and transfer FAQs. The synthesis is deliberately registrar-neutral: it does not rank vendors, quote temporary prices, or assume that every top-level domain uses identical policies.</p>
<p>The contribution is a four-stage operating record—<strong>select, register, secure, verify</strong>—plus a two-person acceptance table. A business can save the completed record with its website runbook and repeat the verification at least annually and after any staff, agency, payment, registrar, DNS, or email change.</p>
<h3 id="1-select-a-name-and-define-the-owner">1. Select a name and define the owner</h3>
<p>Write down the proposed name, intended use, preferred top-level domain, acceptable alternatives, and who is authorized to approve the choice. Check the spelling aloud, type it on mobile, and look for confusing hyphens, repeated letters, unintended word combinations, or a name that is hard to dictate by phone.</p>
<p>Before registration, record:</p>
<ul>
<li>The intended registered name holder: business entity or authorized individual</li>
<li>A durable company-controlled registrant email and recovery phone</li>
<li>Primary and backup account custodians</li>
<li>The expected website, email, redirect, and subdomain uses</li>
<li>Any trademark, licensing, regulated-name, or local legal review required for the business</li>
<li>The date and person who approved the final name</li>
</ul>
<p>Do not let a contractor register the domain only in the contractor's personal account as a convenience. If a provider administers the account, the business should still retain direct ownership, recovery, billing visibility, and a documented path to remove access.</p>
<h3 id="2-compare-registrars-as-an-operating-service">2. Compare registrars as an operating service</h3>
<p>For a generic top-level domain, confirm the registrar or the registrar behind a reseller through ICANN's current accredited-registrar information. Country-code domains can use different registry and registrar arrangements, so check the applicable operator's rules.</p>
<p>Use the same comparison columns for every candidate:</p>
<table>
<thead>
<tr>
<th>Decision field</th>
<th>What to record</th>
</tr>
</thead>
<tbody><tr>
<td>Registration and renewal</td>
<td>Initial term, recurring renewal price, taxes or fees, grace or restoration information, and the date the quoted terms were checked</td>
</tr>
<tr>
<td>Account security</td>
<td>Multifactor authentication options, recovery method, account-change notices, session or device controls, and delegated-user support</td>
</tr>
<tr>
<td>DNS control</td>
<td>Nameserver editing, DNS record support, DNSSEC availability when relevant, export or documentation options, and change history</td>
</tr>
<tr>
<td>Registrant data</td>
<td>Required contact data, privacy or proxy terms, disclosure process, and how the registrant updates information</td>
</tr>
<tr>
<td>Support and recovery</td>
<td>Support channels, identity-verification process, escalation route, and what evidence is required when account access is lost</td>
</tr>
<tr>
<td>Transfer and exit</td>
<td>Lock controls, authorization-code process, transfer instructions, restrictions, and any fees disclosed by the registrar</td>
</tr>
<tr>
<td>Bundled services</td>
<td>Email, hosting, certificates, site builders, or security products that may create a dependency if canceled separately</td>
</tr>
</tbody></table>
<p>Save or export the registration agreement and the specific terms accepted at checkout. ICANN describes the registration agreement as the contract between the registrant and registrar and says registrants should have information about registering, managing, transferring, renewing, and restoring the name.</p>
<h3 id="3-register-in-a-business-controlled-account">3. Register in a business-controlled account</h3>
<p>Create or use an account that the business can recover without a former employee, agency, or developer. Use a unique password stored in the approved password manager and enable the registrar's strongest practical multifactor authentication option. Give each person a named role when the platform supports delegated access; avoid a shared mailbox and password as the only control.</p>
<p>At checkout:</p>
<ol>
<li>Confirm the exact domain, top-level domain, registration term, renewal setting, and total.</li>
<li>Confirm the registered name holder and required contact information are accurate.</li>
<li>Review privacy or proxy terms without assuming they remove the duty to keep underlying data current.</li>
<li>Use a business-controlled payment method and record its owner and expiration review date.</li>
<li>Save the receipt, agreement, registrar name, account identifier, registration date, expiration date, and support route.</li>
<li>Turn on account-change, transfer, DNS-change, and renewal notices when available.</li>
<li>Keep the domain locked against unauthorized transfer when it is not actively being transferred.</li>
</ol>
<p>ICANN notes that a locked domain may display a status such as registrar lock or client transfer prohibited. The lock is a protective control, not a substitute for securing the registrar account or recovery path.</p>
<h3 id="4-connect-dns-without-guessing">4. Connect DNS without guessing</h3>
<p>Before changing nameservers or records, capture the current state if the domain already exists. List every expected dependency: website, <code>www</code>, email, contact forms, verification records, analytics, advertising, customer portals, APIs, and any subdomain.</p>
<p>Use a change record with:</p>
<ul>
<li>Exact old and new nameservers or DNS records</li>
<li>Record type, host, value, TTL, reason, approver, and change time</li>
<li>Expected website and email behavior</li>
<li>Test method and responsible person</li>
<li>Rollback value and decision deadline</li>
</ul>
<p>Do not delete unfamiliar mail or verification records merely because they are not needed for the website. Test the apex domain, <code>www</code>, HTTPS, redirects, a real form submission with synthetic data, inbound and outbound mail, and important subdomains after the change. DNS caching means old and new answers can coexist temporarily; preserve the prior values until the agreed verification window passes.</p>
<h3 id="5-run-a-two-person-acceptance-test">5. Run a two-person acceptance test</h3>
<p>The purchaser and a backup custodian should independently confirm the following without sharing a password:</p>
<table>
<thead>
<tr>
<th>Acceptance check</th>
<th>Evidence to retain</th>
</tr>
</thead>
<tbody><tr>
<td>Correct domain and registrant</td>
<td>Registrar account view or receipt with sensitive values redacted in the operating record</td>
</tr>
<tr>
<td>Recovery works</td>
<td>Date each custodian confirmed the recovery email, phone, security key, or approved backup method</td>
</tr>
<tr>
<td>Renewal is owned</td>
<td>Expiration date, renewal setting, payment owner, notice recipients, and next annual review date</td>
</tr>
<tr>
<td>Transfer protection is understood</td>
<td>Current lock status and the registrar's current unlock and authorization-code instructions</td>
</tr>
<tr>
<td>DNS authority is known</td>
<td>Authoritative nameservers, DNS provider, account owner, and exported or transcribed baseline</td>
</tr>
<tr>
<td>Website works</td>
<td>Apex and <code>www</code> status, canonical destination, HTTPS, redirect behavior, and monitoring owner</td>
</tr>
<tr>
<td>Email works</td>
<td>Inbound and outbound tests for each business-critical sending path, without storing message contents unnecessarily</td>
</tr>
<tr>
<td>Vendor access is bounded</td>
<td>Named role, business purpose, approver, review date, and removal trigger</td>
</tr>
</tbody></table>
<p>Store this record with the website ownership inventory, not inside a public repository. Store passwords, recovery codes, and private keys only in the approved secret-management system.</p>
<h2 id="what-this-checklist-cannot-prove">What this checklist cannot prove</h2>
<p>This checklist cannot determine whether a proposed name infringes a trademark or another legal right, whether a regulated business may use the name, or whether a particular registration agreement is appropriate. It does not cover every country-code registry, premium-name rule, aftermarket purchase, brokered transaction, dispute, court order, or abusive-registration process.</p>
<p>Registrar interfaces, prices, privacy services, security controls, grace periods, restoration terms, and transfer procedures can change. ICANN's transfer materials also describe circumstances that may prevent or delay a transfer, including some 60-day periods and lock states. Review the current registrar and registry terms before planning a time-sensitive move.</p>
<p>Passing the acceptance test does not guarantee uninterrupted DNS, email, hosting, certificate issuance, search visibility, or account recovery. It shows that the business has identified the controlling accounts, recorded the intended state, and tested the dependencies available at that time.</p>
<h2 id="put-the-checklist-into-practice">Put the checklist into practice</h2>
<p>ICANN explains the registrar and registrant relationship and publishes registrant resources. Mendola.Tech adds a small-business operating artifact that connects the purchase decision to website continuity: a named owner, backup custodian, recovery check, renewal record, DNS change log, website/email tests, vendor-access boundary, and repeatable acceptance evidence.</p>
<p>The same table can be reused during a website launch or vendor handoff. Pair it with the <a href="/blog/small-business-website-ownership-handoff-checklist/">website ownership handoff checklist</a> so the domain, DNS, source code, hosting, analytics, forms, and recovery paths have one accountable inventory.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://www.icann.org/registrants" rel="noreferrer">Information for Domain Name Registrants</a> — ICANN; accessed 2026-08-15. Defines the registrant relationship and links current registrant resources.</li>
<li><a href="https://www.icann.org/resources/pages/register-domain-name-2017-06-20-en" rel="noreferrer">Registering Domain Names</a> — ICANN; accessed 2026-08-15. Explains accredited registrars, resellers, and country-code registration differences.</li>
<li><a href="https://www.icann.org/en/contracted-parties/accredited-registrars" rel="noreferrer">Accredited Registrars</a> — ICANN; accessed 2026-08-15. Supports checking the current accredited-registrar relationship for generic top-level domains.</li>
<li><a href="https://www.icann.org/resources/pages/benefits-2013-09-16-en" rel="noreferrer">Registrants' Benefits and Responsibilities</a> — ICANN; accessed 2026-08-15. Supports reviewing registration terms, pricing, support, privacy, renewal, restoration, transfer, and accurate contact responsibilities.</li>
<li><a href="https://www.icann.org/resources/pages/locked-2013-05-03-en" rel="noreferrer">About Locked Domain</a> — ICANN; accessed 2026-08-15. Explains registrar lock or client-transfer-prohibited status and the unlock path.</li>
<li><a href="https://www.icann.org/resources/pages/name-holder-faqs-2017-10-10-en" rel="noreferrer">FAQs for Registrants: Transferring Your Domain Name</a> — ICANN; accessed 2026-08-15. Describes the transfer process and circumstances that can prevent or delay a transfer.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Google Business Profile Ownership and Access Checklist</title>
      <link>https://mendola.tech/blog/google-business-profile-ownership-access-checklist/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/google-business-profile-ownership-access-checklist/</guid>
      <description>A customer-facing checklist for confirming Google Business Profile ownership, assigning access safely, documenting recovery details, and avoiding lockouts.</description>
      <category>SEO &amp; Visibility</category>
      <pubDate>Thu, 13 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<p>Your Google Business Profile can influence how customers find your location, call your business, request directions, read reviews, and see current hours. Yet many owners discover that they do not control the profile until an employee leaves, an agency relationship ends, or a verification request blocks an urgent update.</p>
<p>This checklist helps a small business confirm who owns the profile, replace shared-password habits with named access, and keep enough recovery information to handle staff or vendor changes. Complete it for every location and review it at least quarterly.</p>
<h2 id="what-matters-most">What matters most</h2>
<p>Three decisions prevent most ownership confusion:</p>
<ol>
<li><strong>The business keeps primary ownership.</strong> Use a durable Google account controlled by the company, not an employee's personal account or an agency's account.</li>
<li><strong>People receive named roles.</strong> Add owners and managers through Google Business Profile instead of sharing the primary owner's password.</li>
<li><strong>Access changes are documented.</strong> Record who approved each user, why access is needed, and when it should be reviewed or removed.</li>
</ol>
<p>Google distinguishes between primary owner, owner, and manager roles. The primary owner has the highest level of control, including the ability to transfer primary ownership. An owner can add and remove users, while a manager can perform many daily profile tasks without controlling user access. Google's current role table should be checked before assigning access because product permissions can change.</p>
<h2 id="how-to-audit-ownership-and-access">How to audit ownership and access</h2>
<h3 id="1-build-a-location-inventory">1. Build a location inventory</h3>
<p>Start with a row for every storefront, office, service-area business, or department that has a separate profile.</p>
<table>
<thead>
<tr>
<th>Record</th>
<th>What to capture</th>
</tr>
</thead>
<tbody><tr>
<td>Profile identity</td>
<td>Exact business name, address or service area, primary category, phone number, and website URL</td>
</tr>
<tr>
<td>Profile link</td>
<td>Direct Google Maps or Business Profile link used to identify the listing</td>
</tr>
<tr>
<td>Primary owner</td>
<td>Google account, responsible person, and confirmation date</td>
</tr>
<tr>
<td>Other users</td>
<td>Name, email, role, business reason, approver, and review date</td>
</tr>
<tr>
<td>Recovery details</td>
<td>Recovery email, recovery phone, security-key location if used, and responsible administrator</td>
</tr>
<tr>
<td>Related assets</td>
<td>Website domain, analytics, advertising account, Merchant Center, Search Console, and call-tracking ownership</td>
</tr>
</tbody></table>
<p>Do not place passwords, backup codes, or full security answers in an ordinary spreadsheet. Use an approved password manager or another controlled system for secrets. The inventory should show where recovery materials are stored and who can authorize access, not expose the materials themselves.</p>
<h3 id="2-confirm-the-primary-owner-is-business-controlled">2. Confirm the primary owner is business-controlled</h3>
<p>Sign in through Google's official Business Profile interface and open the people and access settings. Confirm that the displayed location is the correct one before changing anything. Look for a primary owner account that:</p>
<ul>
<li>uses a company-controlled identity with a current recovery method;</li>
<li>is not tied only to a former employee, contractor, or marketing agency;</li>
<li>is protected by multifactor authentication;</li>
<li>can be recovered even if one person's phone is lost;</li>
<li>is included in the business's offboarding and continuity procedures.</li>
</ul>
<p>If an appropriate business account is already an owner, the current primary owner can transfer primary ownership through Google's role controls. Google may impose waiting periods or other restrictions on newly added users, so do not wait until the day an agency contract ends or an employee departs.</p>
<p>If nobody at the business has access, use Google's official request-access process. Keep screenshots, dates, account names, and messages associated with the request. Avoid creating duplicate profiles as a shortcut; duplicates can create customer confusion and additional cleanup.</p>
<h3 id="3-give-each-person-the-least-powerful-useful-role">3. Give each person the least powerful useful role</h3>
<p>Use an owner role only when that person genuinely needs to manage users or make high-control changes. A staff member or vendor who updates hours, adds photos, answers reviews, or publishes routine information will often need manager access instead.</p>
<p>Ask these questions for every user:</p>
<ul>
<li>What recurring task requires access?</li>
<li>Does that task require owner capabilities, or is manager access enough?</li>
<li>Is the email address a named, current identity rather than a shared login?</li>
<li>Who approved the access?</li>
<li>When will it be reviewed?</li>
<li>What event should trigger removal: contract end, job change, leave, or inactivity?</li>
</ul>
<p>Never send the primary owner's password to a vendor. Named access creates a clearer activity trail, can be removed without changing the owner's credentials, and avoids exposing recovery information.</p>
<h3 id="4-check-the-public-profile-while-you-are-there">4. Check the public profile while you are there</h3>
<p>An access review is a good time to confirm the information customers see. Verify the name, category, address or service area, phone number, website link, appointment link, hours, holiday hours, and business description. Test the phone number and website link from a signed-out browser or a phone.</p>
<p>Google's guidelines require businesses to represent themselves consistently and accurately. Do not add keywords, service areas, addresses, or categories merely to influence rankings. Record uncertain items for review instead of improvising a change that conflicts with Google's rules or the business's real-world identity.</p>
<h3 id="5-create-an-access-change-procedure">5. Create an access-change procedure</h3>
<p>Write down the steps for adding, reviewing, and removing users. A simple process can require:</p>
<ol>
<li>a request naming the location, person, task, role, and end date;</li>
<li>approval by the business owner or designated administrator;</li>
<li>an invitation through the profile's people and access controls;</li>
<li>confirmation that the person can complete the intended task;</li>
<li>a quarterly review and immediate review after staffing or vendor changes;</li>
<li>removal of access before or at the end of the relationship;</li>
<li>a final check that the business still has a working primary owner and recovery path.</li>
</ol>
<p>Keep the website domain, DNS, hosting, analytics, search, advertising, and profile access inventories together. A business can control its Google Business Profile but still be unable to update the linked website because another party owns the domain or hosting account.</p>
<h2 id="what-this-checklist-cannot-guarantee">What this checklist cannot guarantee</h2>
<p>This audit cannot guarantee rankings, review volume, verification approval, or recovery of a profile. Google's verification and policy systems make their own decisions, and the options shown can differ by profile and account history.</p>
<p>The checklist also does not decide who is legally authorized to act for a business during an ownership dispute. If control is contested, preserve records and use Google's official support and access-request processes. Seek legal advice when company ownership or contractual rights are in dispute.</p>
<h2 id="put-the-checklist-into-practice">Put the checklist into practice</h2>
<p>Set a recurring calendar reminder for the first week of each quarter. The reviewer should open each profile, verify the primary owner, compare every current user with the approved inventory, remove access that is no longer needed, and test the public phone and website links.</p>
<p>After any employee or agency transition, perform the review immediately. Save the completion date and reviewer name, but keep credentials in the password manager rather than in the audit record.</p>
<p>If you need help organizing profile, domain, website, and analytics ownership as one handoff, Mendola.Tech can help you build the inventory and correct the gaps without taking primary control away from your business.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://support.google.com/business/answer/3403100?hl=en" rel="noreferrer">Manage owners and managers of your Business Profile</a> — Google Business Profile Help; accessed 2026-08-13. Explains primary owner, owner, and manager roles and how to manage access.</li>
<li><a href="https://support.google.com/business/answer/4566671?hl=en" rel="noreferrer">Request ownership of a Business Profile</a> — Google Business Profile Help; accessed 2026-08-13. Describes the official process for requesting access to a profile owned by another account.</li>
<li><a href="https://support.google.com/business/answer/3038177?hl=en" rel="noreferrer">Guidelines for representing your business on Google</a> — Google Business Profile Help; accessed 2026-08-13. Provides Google's rules for business identity, address, service area, categories, and other public details.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Small-Business Email Authentication Checklist: SPF, DKIM, and DMARC</title>
      <link>https://mendola.tech/blog/small-business-email-authentication-checklist/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/small-business-email-authentication-checklist/</guid>
      <description>A practical SPF, DKIM, and DMARC checklist for inventorying business senders, correcting DNS records, monitoring results, and protecting legitimate email.</description>
      <category>Performance &amp; Reliability</category>
      <pubDate>Thu, 13 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<p>Your business may send mail through more systems than you expect: employee inboxes, website forms, estimates, invoices, newsletters, scheduling tools, support software, payment platforms, and automated alerts. Each system can affect whether recipients trust or reject messages using your domain.</p>
<p>SPF, DKIM, and DMARC are DNS-based email authentication controls. Configured together, they help receiving systems determine whether a message is authorized and whether the authenticated domain aligns with the address a person sees. This checklist helps a small business organize the work without cutting off legitimate senders.</p>
<h2 id="what-matters-most">What matters most</h2>
<p>Do not start by copying a strict DMARC record from a generic tutorial. Start by finding every legitimate sender. A policy that rejects unauthenticated mail is useful only after the systems your company relies on can authenticate correctly.</p>
<ul>
<li><strong>SPF</strong> publishes which sending infrastructure may send for a domain. SPF evaluation has technical limits, including a limit on DNS-querying mechanisms, so repeatedly appending vendor fragments can create an invalid or fragile record.</li>
<li><strong>DKIM</strong> adds a cryptographic signature that a receiver can verify using a public key published in DNS. Each sending provider normally supplies its own selector and setup instructions.</li>
<li><strong>DMARC</strong> checks whether a message passes SPF or DKIM in alignment with the visible From domain. It also publishes a handling policy and can request aggregate reports.</li>
</ul>
<p>Passing SPF alone does not necessarily mean DMARC passes. For example, a vendor can authenticate its own return-path domain while showing your domain in the From address. DKIM can provide the aligned path if the vendor signs with your domain, or the vendor may support aligned SPF. Confirm the provider's documented configuration instead of guessing.</p>
<h2 id="how-to-build-an-email-authentication-plan">How to build an email authentication plan</h2>
<h3 id="1-inventory-domains-and-every-source-of-outbound-mail">1. Inventory domains and every source of outbound mail</h3>
<p>Create a row for the main domain and each subdomain used in email. Then list every system that sends or forwards messages.</p>
<table>
<thead>
<tr>
<th>Sender</th>
<th>Questions to answer</th>
</tr>
</thead>
<tbody><tr>
<td>Employee email</td>
<td>Which provider hosts mail? Are aliases, groups, scanners, or shared mailboxes used?</td>
</tr>
<tr>
<td>Website forms</td>
<td>Does the site send directly, use an API provider, or pass through the mailbox provider? What appears in From and Reply-To?</td>
</tr>
<tr>
<td>Sales and marketing</td>
<td>Which CRM, newsletter, review, proposal, or outreach tools send as the business?</td>
</tr>
<tr>
<td>Operations</td>
<td>Which scheduling, invoicing, payroll, ticketing, monitoring, or payment tools send mail?</td>
</tr>
<tr>
<td>Infrastructure</td>
<td>Which hosting, domain, backup, security, or status systems send alerts using the domain?</td>
</tr>
<tr>
<td>Forwarding</td>
<td>Are messages forwarded through personal accounts, groups, or help desks that may affect authentication?</td>
</tr>
</tbody></table>
<p>For each sender, record the owner, purpose, visible From domain, return-path domain, DKIM signing domain, setup documentation, renewal date, and a real test recipient. Remove obsolete systems from the plan before adding more DNS entries.</p>
<h3 id="2-protect-dns-changes-and-capture-the-baseline">2. Protect DNS changes and capture the baseline</h3>
<p>Identify who controls the registrar and authoritative DNS. Confirm that the business can recover both accounts and that multifactor authentication is enabled. Export or record the current DNS zone before editing it.</p>
<p>Use DNS lookups and message headers from real test emails to capture the current SPF, DKIM, and DMARC results. Do not rely only on a vendor dashboard saying “verified.” A receiver's Authentication-Results header shows how that message was evaluated at delivery.</p>
<p>Plan changes during a period when the responsible people can monitor important mail. DNS caching means old and new answers can coexist for a time, so avoid stacking several uncertain changes at once.</p>
<h3 id="3-consolidate-and-validate-spf">3. Consolidate and validate SPF</h3>
<p>A domain should publish one SPF policy, not several separate TXT records beginning with <code>v=spf1</code>. Combine authorized sources into one intentional record using the instructions from the mailbox and sending providers.</p>
<p>Before publishing:</p>
<ul>
<li>remove services that no longer send mail;</li>
<li>count mechanisms that cause DNS lookups and stay within the SPF specification's limits;</li>
<li>decide whether subdomains send mail and configure them deliberately;</li>
<li>avoid broad authorization of infrastructure you do not control;</li>
<li>choose the ending qualifier only after understanding its operational effect;</li>
<li>recheck the record after vendors change their sending instructions.</li>
</ul>
<p>SPF authenticates the envelope sender used during mail transport, not automatically the address visible in the From field. That distinction matters when evaluating DMARC alignment.</p>
<h3 id="4-enable-dkim-for-each-legitimate-provider">4. Enable DKIM for each legitimate provider</h3>
<p>Follow each provider's current instructions to generate or assign the DKIM key and publish the required DNS record. The record name usually includes a selector supplied by the provider. Do not reuse a private key between unrelated services.</p>
<p>Send a real message through each workflow and inspect the delivered headers. Confirm <code>dkim=pass</code>, identify the signing domain, and check whether it aligns with the visible From domain used by the business. Test normal employee mail and automated paths separately; a contact form and a human mailbox may use different sending infrastructure.</p>
<p>Keep an ownership record for selectors and remove obsolete keys after a migration is complete. Rotate keys according to provider capabilities and your security plan.</p>
<h3 id="5-start-dmarc-with-reporting-and-a-named-owner">5. Start DMARC with reporting and a named owner</h3>
<p>Publish DMARC at <code>_dmarc.yourdomain</code> using a record based on the official specification and your providers' guidance. Many businesses begin with a monitoring policy while they collect aggregate reports and correct legitimate failures.</p>
<p>The reporting mailbox can receive large machine-readable files. Use an address or DMARC-reporting service prepared to process them, and consider the privacy and vendor-review implications before sending reports to a third party.</p>
<p>Review reports for:</p>
<ul>
<li>recognized systems passing aligned SPF or DKIM;</li>
<li>known systems authenticating with a vendor domain but not aligning;</li>
<li>forgotten tools that still send legitimate mail;</li>
<li>unauthorized or unexplained sources using the domain;</li>
<li>forwarding or mailing-list behavior that changes the authentication path;</li>
<li>traffic from subdomains that need their own plan.</li>
</ul>
<p>Assign one person to own the review and a second person who can cover absences. A reporting-only record that nobody reads is not a finished control.</p>
<h3 id="6-tighten-the-policy-in-measured-steps">6. Tighten the policy in measured steps</h3>
<p>After legitimate senders consistently authenticate and align, consider moving toward quarantine and then reject. The schedule should reflect mail volume, business risk, report quality, and the ability to respond to failures. Use policy percentage options only with a clear testing purpose, and confirm how your receiving partners handle them.</p>
<p>For each change, record the old record, new record, approver, date, expected outcome, monitoring window, rollback plan, and result. Keep a test checklist for employee mail, website leads, invoices, proposals, newsletters, password resets, support messages, and any other business-critical workflow.</p>
<p>Google's current sender guidelines require authentication for mail sent to personal Gmail accounts, with additional requirements for higher-volume senders. Other mailbox providers have their own policies. Authentication improves identity assurance, but it does not guarantee inbox placement; content, reputation, complaints, volume patterns, and recipient behavior also matter.</p>
<h2 id="what-this-checklist-cannot-guarantee">What this checklist cannot guarantee</h2>
<p>SPF, DKIM, and DMARC cannot guarantee that a message reaches the inbox, that every impersonation attempt stops, or that a compromised authorized account sends only legitimate mail. They also do not encrypt message content.</p>
<p>DMARC reports can reveal sending sources, but an unfamiliar source is not automatically malicious and a familiar source is not automatically configured correctly. Investigate before blocking. Email forwarding and mailing lists can create legitimate edge cases, which is one reason DKIM and aligned identities matter.</p>
<p>DNS and mail changes can interrupt important communication. If you do not control all senders or cannot interpret the reports, use a qualified email administrator rather than jumping directly to a reject policy.</p>
<h2 id="put-the-checklist-into-practice">Put the checklist into practice</h2>
<p>Complete the sender inventory first, then correct one provider at a time. Test from the actual application to an external mailbox and save the relevant authentication results. When the inventory is clean, publish DMARC reporting, monitor it for a representative business cycle, and document every remaining failure.</p>
<p>Review the inventory quarterly and whenever you add a marketing, billing, form, support, or automation vendor. Make removing a sender part of vendor offboarding so old authorizations and DKIM keys do not remain indefinitely.</p>
<p>Mendola.Tech can help map website and business-email senders, coordinate DNS changes, validate delivered messages, and turn DMARC reporting into a controlled rollout plan.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://support.google.com/mail/answer/81126" rel="noreferrer">Email sender guidelines</a> — Google Gmail Help; accessed 2026-08-13. Lists Gmail's current authentication and sender requirements.</li>
<li><a href="https://support.google.com/a/answer/33786?hl=en" rel="noreferrer">Set up SPF</a> — Google Workspace Admin Help; accessed 2026-08-13. Explains SPF purpose, record structure, and setup considerations.</li>
<li><a href="https://support.google.com/a/answer/180504?hl=en" rel="noreferrer">Set up DKIM</a> — Google Workspace Admin Help; accessed 2026-08-13. Describes DKIM signing and DNS setup for Google Workspace.</li>
<li><a href="https://support.google.com/a/answer/2466563?hl=en" rel="noreferrer">Set up DMARC</a> — Google Workspace Admin Help; accessed 2026-08-13. Covers DMARC records, reports, alignment, and rollout.</li>
<li><a href="https://www.cisa.gov/sites/default/files/publications/cisa-dmarc.pdf" rel="noreferrer">Domain-based Message Authentication, Reporting, and Conformance (DMARC)</a> — Cybersecurity and Infrastructure Security Agency; accessed 2026-08-13. Provides an official overview of SPF, DKIM, DMARC, and policy deployment.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Website Vendor Proposal Comparison Scorecard for Small Businesses</title>
      <link>https://mendola.tech/blog/website-vendor-proposal-comparison-scorecard/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/website-vendor-proposal-comparison-scorecard/</guid>
      <description>A line-by-line scorecard for comparing website proposals by ownership, scope, accessibility, performance, security, measurement, support, and exit terms.</description>
      <category>Technology Operations</category>
      <pubDate>Thu, 13 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<p>Two website proposals can quote similar prices while describing very different outcomes. One may include content migration, accessibility review, analytics, hosting, backups, support, and a documented handoff. Another may include only a template setup, leaving the owner to supply content, connect systems, and solve problems after launch.</p>
<p>Use this scorecard to put every vendor on the same page before you choose. Send each vendor the same project inventory, ask for written answers, and score only what the proposal or contract actually commits to deliver.</p>
<h2 id="what-matters-most">What matters most</h2>
<p>The best proposal is not automatically the lowest price or the longest feature list. It is the one that defines a suitable outcome, assigns responsibilities clearly, protects business ownership, and gives you a practical way to verify the work.</p>
<p>Before requesting estimates, write down:</p>
<ul>
<li>the business goal and primary customer action;</li>
<li>required pages, locations, services, languages, and content to migrate;</li>
<li>forms, payments, scheduling, CRM, email, maps, reviews, analytics, or other integrations;</li>
<li>who supplies copy, photography, brand assets, legal language, and approvals;</li>
<li>launch deadline and any event driving it;</li>
<li>current domain, DNS, hosting, email, analytics, search, and advertising accounts;</li>
<li>internal staff who will update the site after launch;</li>
<li>expected maintenance, reporting, and support.</li>
</ul>
<p>Ask vendors to identify assumptions and exclusions against that same inventory. A price based on six pages cannot be compared fairly with one based on thirty pages and a content migration.</p>
<h2 id="how-to-score-website-proposals">How to score website proposals</h2>
<p>Use a 0–3 scale for every item: <strong>0 = omitted</strong>, <strong>1 = vague statement</strong>, <strong>2 = defined deliverable</strong>, and <strong>3 = defined deliverable with acceptance method, owner, and timing</strong>. Mark any item that is mandatory regardless of total score.</p>
<h3 id="1-scope-and-content">1. Scope and content</h3>
<table>
<thead>
<tr>
<th>Question</th>
<th>Evidence to request</th>
</tr>
</thead>
<tbody><tr>
<td>What is being built?</td>
<td>Page and template inventory, features, integrations, responsive states, and browser/device support</td>
</tr>
<tr>
<td>Who creates content?</td>
<td>Number of copy rounds, word or page limits, photography, image licensing, migration, metadata, and approvals</td>
</tr>
<tr>
<td>What is excluded?</td>
<td>Explicit list of out-of-scope work, allowance limits, hourly rates, and change-order process</td>
</tr>
<tr>
<td>How is completion judged?</td>
<td>Review stages, acceptance criteria, testing period, defect process, and launch authorization</td>
</tr>
</tbody></table>
<p>Request a sitemap or page list with each proposal. Phrases such as “up to ten pages” should explain what counts as a page, whether legal pages are included, and what happens when the final inventory changes.</p>
<h3 id="2-ownership-and-portability">2. Ownership and portability</h3>
<p>The business should know who owns and controls every essential asset. Record the proposed account owner for:</p>
<ul>
<li>domain registration and registrar login;</li>
<li>authoritative DNS;</li>
<li>hosting, deployment, and backups;</li>
<li>source code or site export;</li>
<li>written content, original design files, photos, fonts, plugins, and licenses;</li>
<li>form submissions and customer data;</li>
<li>analytics, tag management, Search Console, advertising, maps, and business profiles;</li>
<li>transactional email, CRM, scheduling, and payment integrations.</li>
</ul>
<p>Ask what happens if the relationship ends. The proposal should state what the business receives, in what format, within what time, at what cost, and what help is available for transition. A vendor may have legitimate license restrictions on third-party themes, fonts, or software; those restrictions should be disclosed before purchase.</p>
<p>ICANN advises registrants to maintain accurate registration contact information and understand their registrar relationship. Even when a vendor administers the domain, the business should have a documented ownership and recovery path.</p>
<h3 id="3-design-mobile-use-and-accessibility">3. Design, mobile use, and accessibility</h3>
<p>Ask how the vendor will test navigation, forms, buttons, headings, keyboard access, focus, contrast, text resizing, alternative text, errors, and common mobile screen sizes. Request the accessibility target by name—for example, the applicable WCAG 2.2 level—and the testing method.</p>
<p>No vendor can responsibly promise that a site will be “100% ADA compliant” forever based only on an automated scanner. W3C explains that WCAG provides testable success criteria, while conformance evaluation requires judgment and can involve both automated and human testing. The proposal should define what is checked, what standard is targeted, what limitations remain, and how future content is handled.</p>
<p>Score higher when the vendor provides sample deliverables such as an issue log, keyboard walkthrough, form-error test, content guidance, and a process for correcting confirmed barriers.</p>
<h3 id="4-performance-and-technical-quality">4. Performance and technical quality</h3>
<p>Replace “fast” or “optimized” with a test plan. Ask:</p>
<ul>
<li>which representative pages and devices will be tested;</li>
<li>whether measurements are lab tests, real-user field data, or both;</li>
<li>which Core Web Vitals or other metrics will be reported;</li>
<li>what test date, tool version, and conditions will be recorded;</li>
<li>how third-party scripts and customer-supplied media affect the target;</li>
<li>what happens when a result misses the agreed threshold.</li>
</ul>
<p>Google's web.dev documentation identifies Largest Contentful Paint, Interaction to Next Paint, and Cumulative Layout Shift as the current Core Web Vitals and explains their “good” thresholds at the 75th percentile of page loads. A single desktop screenshot is not proof that all users or pages meet those thresholds.</p>
<p>Also request basics such as HTTPS, canonical URLs, redirects, status codes, structured data where relevant, XML sitemap, robots controls, semantic headings, image dimensions, error pages, and form-delivery testing.</p>
<h3 id="5-security-privacy-and-recovery">5. Security, privacy, and recovery</h3>
<p>The Federal Trade Commission advises small businesses to define security expectations when choosing vendors and to verify that providers follow through. Ask the website vendor to document:</p>
<ul>
<li>software update responsibilities and timing;</li>
<li>administrator access, multifactor authentication, and offboarding;</li>
<li>secret and API-key handling;</li>
<li>backup frequency, retention, restoration responsibility, and restore testing;</li>
<li>logging, monitoring, incident notification, and escalation;</li>
<li>form-data collection, retention, deletion, and third-party sharing;</li>
<li>privacy, cookie, payment, health, or industry-specific responsibilities;</li>
<li>subcontractors and critical service providers.</li>
</ul>
<p>“Daily backups” is incomplete without location, retention, restore access, and a tested recovery procedure. Score the recovery plan, not the existence of a checkbox.</p>
<h3 id="6-analytics-leads-and-search-visibility">6. Analytics, leads, and search visibility</h3>
<p>Define the customer actions that matter: calls, forms, appointments, purchases, directions, downloads, or qualified inquiries. Ask who configures analytics, consent settings, event definitions, filters, dashboards, and account ownership.</p>
<p>For search work, request deliverables rather than ranking guarantees. Useful items may include crawl and index controls, redirect mapping, titles and descriptions, local-business consistency, structured data, search-console setup, and a post-launch indexing check. No vendor controls Google's rankings, and traffic or ranking alone does not establish lead quality or revenue.</p>
<p>For forms and calls, test the complete path from a public page to the real recipient. Document validation, spam handling, confirmation messages, notification delivery, storage, privacy, mobile use, and a backup contact method. A form that displays “success” but never reaches the business is not successful.</p>
<h3 id="7-maintenance-support-and-total-cost">7. Maintenance, support, and total cost</h3>
<p>Create a three-year cost table that includes setup, design, content, hosting, licenses, domains, email services, maintenance, support, analytics, integrations, accessibility work, backups, and likely change requests.</p>
<p>Ask each vendor to state:</p>
<ul>
<li>included monthly work and what is billed separately;</li>
<li>support channel, coverage hours, first-response target, and emergency definition;</li>
<li>update, backup, monitoring, reporting, and review schedule;</li>
<li>annual price changes or usage-based costs;</li>
<li>content-editing turnaround and limits;</li>
<li>cancellation notice, export cost, and transition assistance.</li>
</ul>
<p>A low build price paired with proprietary lock-in or expensive routine changes can cost more over time. A higher managed price may be reasonable when the continuing deliverables are specific and valuable. The scorecard makes that tradeoff visible.</p>
<h2 id="what-this-scorecard-cannot-decide">What this scorecard cannot decide</h2>
<p>A numeric score cannot determine whether you trust a team, whether its design style fits your brand, or whether its process suits your staff. It also cannot verify a claim that the vendor will not demonstrate.</p>
<p>References and portfolios show past work, not a guaranteed result for your project. Contact references with similar scope and ask what changed, how problems were handled, and whether the site was easy to operate after launch.</p>
<p>The scorecard is not legal advice. Have qualified counsel review ownership, privacy, accessibility, intellectual-property, liability, and termination terms when the business risk warrants it.</p>
<h2 id="put-the-scorecard-into-practice">Put the scorecard into practice</h2>
<p>Give each vendor the same written inventory and a copy of the questions. Score the written response before a sales call, then use the call to resolve gaps. Afterward, ask the vendor to add important promises to the proposal or contract; meeting notes are weaker than agreed deliverables.</p>
<p>Choose a small set of non-negotiables, such as business ownership of the domain, a working export path, form-delivery testing, named accessibility target, account handoff, and backup restoration procedure. Do not let a high total score erase a zero on a critical requirement.</p>
<p>Finally, turn the winning proposal into a launch and handoff checklist. Assign an owner and acceptance method to every deliverable so the same scorecard that helped you buy the site also helps you receive it.</p>
<p>Mendola.Tech can review competing proposals, build a neutral scope, or provide a managed website plan with ownership, maintenance, measurement, and handoff terms documented up front.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://www.w3.org/TR/WCAG22/" rel="noreferrer">Web Content Accessibility Guidelines (WCAG) 2.2</a> — World Wide Web Consortium; accessed 2026-08-13. Provides the current W3C Recommendation and testable accessibility success criteria.</li>
<li><a href="https://www.w3.org/WAI/standards-guidelines/wcag/" rel="noreferrer">WCAG overview</a> — W3C Web Accessibility Initiative; accessed 2026-08-13. Explains the guidelines, supporting documents, and conformance context.</li>
<li><a href="https://www.ftc.gov/business-guidance/small-businesses/cybersecurity" rel="noreferrer">Cybersecurity for Small Business</a> — Federal Trade Commission; accessed 2026-08-13. Provides small-business security and vendor-management guidance.</li>
<li><a href="https://www.ftc.gov/business-guidance/blog/2019/02/cybersecurity-small-business-hiring-web-host" rel="noreferrer">Cybersecurity for small business: Hiring a web host</a> — Federal Trade Commission; accessed 2026-08-13. Suggests questions about security, updates, access, backups, and service-provider practices.</li>
<li><a href="https://www.icann.org/registrants" rel="noreferrer">Information for domain name registrants</a> — Internet Corporation for Assigned Names and Numbers; accessed 2026-08-13. Explains registrant responsibilities and domain-management resources.</li>
<li><a href="https://web.dev/articles/vitals" rel="noreferrer">Web Vitals</a> — Google/web.dev; accessed 2026-08-13. Defines the current Core Web Vitals and their user-experience focus.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Contact Form Reliability Test: From Browser Submission to Human Response</title>
      <link>https://mendola.tech/blog/contact-form-browser-to-inbox-reliability-test/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/contact-form-browser-to-inbox-reliability-test/</guid>
      <description>A synthetic test matrix for validating form UX, API acceptance, durable lead storage, email delivery, alerting, privacy, and human response.</description>
      <category>Performance &amp; Reliability</category>
      <pubDate>Tue, 11 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<blockquote>
<p>This guide explains how to test a contact form from the visitor's browser through human follow-up. It does not report a client's lead volume, delivery rate, response time, or business results. Only send synthetic test messages when the business has authorized them.</p>
</blockquote>
<p>A website can show “Thanks, we received your message” even when the lead never reaches the person expected to answer it. The browser may accept the click while the API times out. The API may return success before durable storage. The record may be stored while an email notification bounces. The notification may arrive in a shared inbox with no owner. A salesperson may reply from a different system that cannot be tied back to the original submission.</p>
<p>Calling all of those outcomes “form conversion” hides the failure boundary. This protocol treats a contact form as an observable chain from user action to accountable response.</p>
<h2 id="what-matters-most">What matters most</h2>
<ol>
<li><strong>Browser success is not business success.</strong> A visible confirmation proves a user-interface state. It should not be used as evidence of inbox delivery, CRM creation, assignment, or response.</li>
<li><strong>One correlation ID makes the chain testable.</strong> The browser, endpoint, durable record, notification, queue, and response log should share a non-secret identifier that lets an operator trace one synthetic submission without searching by personal data.</li>
<li><strong>The durable record should not depend on email.</strong> Email is useful notification and workflow infrastructure, but delivery can be delayed, filtered, rejected, or routed incorrectly. The accepted lead needs a system of record and recovery queue.</li>
<li><strong>Partial failures matter most.</strong> Testing only a perfect submission misses duplicate clicks, timeouts after acceptance, notification failures, expired credentials, attachment limits, spam challenges, and the dangerous case where the user is told to retry after the server already stored the lead.</li>
</ol>
<h2 id="how-to-run-the-test">How to run the test</h2>
<h3 id="define-the-stages-before-choosing-tools">Define the stages before choosing tools</h3>
<p>Use a stage model that can be observed independently:</p>
<table>
<thead>
<tr>
<th>Stage</th>
<th>Success evidence</th>
<th>Failure owner</th>
<th>Recovery action</th>
</tr>
</thead>
<tbody><tr>
<td>1. Form usable</td>
<td>Required fields, labels, errors, keyboard flow and submission state work</td>
<td>Website owner</td>
<td>Correct interface and accessibility defect</td>
</tr>
<tr>
<td>2. Request sent</td>
<td>Browser emits one authorized request with expected payload and correlation ID</td>
<td>Frontend owner</td>
<td>Preserve data safely, retry only under defined rules</td>
</tr>
<tr>
<td>3. Request accepted</td>
<td>Endpoint authenticates context, validates, rate-limits and returns the documented response</td>
<td>API owner</td>
<td>Return actionable status; do not claim success on rejection</td>
</tr>
<tr>
<td>4. Record durable</td>
<td>Lead is written once to the system of record with timestamp and source</td>
<td>Data/CRM owner</td>
<td>Reconcile queue or restore failed write</td>
</tr>
<tr>
<td>5. Notification attempted</td>
<td>Delivery provider receives a notification job tied to the durable record</td>
<td>Integration owner</td>
<td>Retry or place in dead-letter/recovery queue</td>
</tr>
<tr>
<td>6. Delivery state known</td>
<td>Provider records delivered, delayed, bounced, suppressed, rejected or unknown state</td>
<td>Email owner</td>
<td>Correct recipient, authentication, suppression or routing issue</td>
</tr>
<tr>
<td>7. Queue assignment</td>
<td>Named team or person owns the lead with due time</td>
<td>Operations owner</td>
<td>Reassign and alert escalation owner</td>
</tr>
<tr>
<td>8. Human response</td>
<td>First meaningful response is timestamped against the lead</td>
<td>Business owner</td>
<td>Escalate overdue item; preserve outcome</td>
</tr>
</tbody></table>
<p>The implementation may combine systems, but the test should not combine claims. For example, an HTTP <code>200</code> or <code>202</code> can mean the endpoint accepted work; it does not by itself mean that the final email was delivered.</p>
<h3 id="use-synthetic-data-that-cannot-be-mistaken-for-a-customer">Use synthetic data that cannot be mistaken for a customer</h3>
<p>Create a dedicated, authorized monitor identity:</p>
<ul>
<li>Name begins with <code>SYNTHETIC TEST — DO NOT CONTACT</code></li>
<li>Reply address routes to a controlled test mailbox</li>
<li>Phone uses an approved non-customer test value</li>
<li>Message includes monitor name, run ID, expected route, and deletion policy</li>
<li>UTM values identify the synthetic source without resembling a real campaign</li>
<li>Payload contains no secrets or real customer details</li>
</ul>
<p>Coordinate the schedule with the team that receives leads. If tests create tickets or notifications, label and auto-route them so staff do not waste time or become conditioned to ignore alerts. The monitoring process should delete or retain test records according to the approved policy.</p>
<h3 id="add-a-correlation-id-at-the-first-trusted-boundary">Add a correlation ID at the first trusted boundary</h3>
<p>Generate or assign an opaque identifier such as <code>lead_20260811_01HX...</code>. Do not embed email addresses, phone numbers, sequential customer counts, internal credentials, or other sensitive information. Return the safe identifier in the success response when appropriate and attach it to server logs, the durable lead record, notification metadata, and operations queue.</p>
<p>The user-facing page can say: “Your message was received. Reference: ABC123.” It should not expose internal database keys or enough information to enumerate other submissions.</p>
<h3 id="test-accessible-states-not-only-endpoint-behavior">Test accessible states, not only endpoint behavior</h3>
<p>The form test should cover labels, instructions, required fields, invalid formats, error summaries, focus behavior, keyboard submission, waiting state, duplicate prevention, retry language, and success confirmation. WCAG 2.2 requires programmatically determinable status messages at Level AA and includes separate criteria for error identification and labels or instructions.</p>
<p>Automated checks can confirm roles, attributes, and DOM states. A keyboard and assistive-technology review is still needed to determine whether the experience is understandable.</p>
<h3 id="build-a-failure-matrix">Build a failure matrix</h3>
<p>Run at least these cases in an authorized nonproduction environment before production-safe synthetic monitoring:</p>
<table>
<thead>
<tr>
<th>Case</th>
<th>Injected condition</th>
<th>Expected user state</th>
<th>Expected operational state</th>
</tr>
</thead>
<tbody><tr>
<td>Valid submission</td>
<td>All dependencies healthy</td>
<td>One clear success, safe reference ID</td>
<td>One durable record, one notification job, one assignment</td>
</tr>
<tr>
<td>Invalid field</td>
<td>Schema validation fails</td>
<td>Specific error attached to field and summarized as designed</td>
<td>No lead and no notification</td>
</tr>
<tr>
<td>Double click</td>
<td>Two rapid submit attempts</td>
<td>One waiting/success path</td>
<td>One durable lead or two explicitly related attempts under the idempotency policy</td>
</tr>
<tr>
<td>Slow endpoint</td>
<td>Response exceeds UX threshold</td>
<td>Honest waiting or timeout guidance</td>
<td>Server state traceable; retry cannot silently duplicate</td>
</tr>
<tr>
<td>Storage failure</td>
<td>Database/CRM unavailable</td>
<td>No false success</td>
<td>Recoverable job or clear rejection according to design</td>
</tr>
<tr>
<td>Notification failure</td>
<td>Email provider rejects or times out</td>
<td>Lead may still show accepted if durably stored</td>
<td>Alert and retry/recovery queue; lead visible in system of record</td>
</tr>
<tr>
<td>Recipient bounce</td>
<td>Mailbox rejects delivery</td>
<td>No change to already accepted lead</td>
<td>Bounce tied to lead; alternate queue and owner alerted</td>
</tr>
<tr>
<td>CAPTCHA unavailable</td>
<td>Challenge cannot complete</td>
<td>Accessible alternative or clear failure</td>
<td>No accidental acceptance; service owner alerted</td>
</tr>
<tr>
<td>Expired credential</td>
<td>Provider/API rejects authentication</td>
<td>No unsupported success claim</td>
<td>High-priority operational alert without logging the secret</td>
</tr>
<tr>
<td>Client disconnect</td>
<td>Browser closes after request begins</td>
<td>No assumption</td>
<td>Accepted state resolved from server-side correlation ID</td>
</tr>
</tbody></table>
<p>The expected response to a partial failure is a product decision, not a testing afterthought. If durable storage succeeds but notification fails, the interface may correctly say the lead was received—provided that an operator can see and recover the lead without the email.</p>
<h3 id="distinguish-smtp-acceptance-from-mailbox-placement">Distinguish SMTP acceptance from mailbox placement</h3>
<p>Email delivery has multiple stages. A provider can accept a message for processing. A receiving mail system can accept or reject it. Delivery Status Notifications can describe delivered, delayed, failed, relayed, or expanded states, but a “delivered” transport state does not prove that a person noticed the message, that it landed in the primary inbox, or that a reply occurred.</p>
<p>Track notification job accepted, provider message ID, delivery event, bounce or suppression event, destination alias, queue arrival where observable, assignment, and human response as different timestamps. Do not publish an “email delivery rate” without defining the denominator, observation point, and treatment of delayed and unknown states.</p>
<h3 id="define-service-level-indicators-from-the-chain">Define service-level indicators from the chain</h3>
<p>Useful internal measures include:</p>
<ul>
<li><strong>Durable acceptance rate:</strong> valid authorized submissions stored once / valid authorized submission attempts</li>
<li><strong>Notification attempt rate:</strong> durable leads with a notification job / durable leads</li>
<li><strong>Known notification failure rate:</strong> durable leads with rejected, bounced, or suppressed notification / notification jobs</li>
<li><strong>Unassigned lead age:</strong> time from durable acceptance to accountable owner</li>
<li><strong>First-response time:</strong> time from durable acceptance to first qualifying human response</li>
<li><strong>Reconciliation gap:</strong> accepted correlation IDs not present in the durable record, or durable records with no required downstream state</li>
</ul>
<p>Report synthetic and real operations separately. Synthetic tests confirm a controlled path at known times; they do not estimate customer conversion behavior.</p>
<h3 id="monitor-without-leaking-customer-data">Monitor without leaking customer data</h3>
<p>Logs should prefer correlation ID, stage, timestamp, result code, provider reference, and safe diagnostic category. Redact field values, credentials, raw request bodies, attachments, session tokens, and unnecessary network identifiers. Define access, retention, deletion, and incident response for every system that receives lead data.</p>
<p>Alert messages should contain enough context to route the failure without copying the full lead into chat or email. Link authorized operators to the system of record instead.</p>
<h3 id="run-a-daily-reconciliation">Run a daily reconciliation</h3>
<p>At a defined interval, compare counts and correlation IDs across accepted API requests, durable leads, notification jobs, provider events, queue assignments, and responses. Create an exceptions table:</p>
<table>
<thead>
<tr>
<th>Correlation ID</th>
<th>Last confirmed stage</th>
<th>Missing stage</th>
<th>Age</th>
<th>Owner</th>
<th>Next action</th>
</tr>
</thead>
</table>
<p>This catches failures that individual alerts miss, including a disabled webhook, a filter that diverts all notifications, or a queue integration that reports success without creating an assignment.</p>
<h2 id="what-this-test-cannot-prove">What this test cannot prove</h2>
<p>A synthetic test does not prove that every browser, assistive technology, network, spam-control path, attachment, international address, privacy condition, or provider outage will behave the same way. A test mailbox does not predict mailbox placement for every recipient domain.</p>
<p>Transport delivery status cannot prove human attention. First response time cannot prove response quality or business outcome. An operational correlation ID is not a substitute for appropriate audit, consent, privacy, security, or records management.</p>
<p>Aggressive production testing can create spam, distort analytics, consume quotas, trigger abuse controls, or burden staff. Use authorization, rate limits, clear labeling, controlled recipients, and a deletion policy.</p>
<h2 id="put-the-guide-into-practice">Put the guide into practice</h2>
<p>The eight-stage evidence chain prevents one green browser message from being mistaken for a successful lead handoff. It pairs every stage with visible proof, a recovery owner, and a way to find records that stopped moving through the process.</p>
<p>The resulting dashboard can stay small: last successful synthetic run, last durable lead, notification failure count, oldest unassigned lead, oldest unanswered lead, and unresolved correlation gaps. Each number should lead to a clear operational action. Mendola.Tech can help map and test that chain when a business needs a more reliable lead process.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://www.w3.org/TR/WCAG22/" rel="noreferrer">Web Content Accessibility Guidelines (WCAG) 2.2</a> — W3C Recommendation; accessed 2026-08-11. Supports error identification, labels or instructions, name/role/value, and programmatically determinable status messages.</li>
<li><a href="https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html" rel="noreferrer">Understanding Success Criterion 4.1.3: Status Messages</a> — W3C Web Accessibility Initiative; accessed 2026-08-11. Supports announcing success, waiting, progress, and error status without unnecessary focus change.</li>
<li><a href="https://www.rfc-editor.org/info/rfc3464/" rel="noreferrer">RFC 3464: An Extensible Message Format for Delivery Status Notifications</a> — RFC Editor; accessed 2026-08-11. Supports distinguishing delivery-status actions and machine-readable transport outcomes.</li>
<li><a href="https://fetch.spec.whatwg.org/" rel="noreferrer">Fetch Standard</a> — WHATWG; accessed 2026-08-11. Supports the browser request/response model and the distinction between a network response and later application-side outcomes.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Local Business Identity Change Control: A Name, Address, Phone and Domain Checklist</title>
      <link>https://mendola.tech/blog/local-business-identity-change-control-checklist/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/local-business-identity-change-control-checklist/</guid>
      <description>A source-of-truth and verification checklist for changing a local business name, address, phone, domain, hours, or service-area model across web systems.</description>
      <category>SEO &amp; Visibility</category>
      <pubDate>Tue, 11 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<blockquote>
<p>Use this checklist when a business changes its name, address, phone number, domain, or public location details. It cannot guarantee rankings, listing approval, review retention, verification outcomes, or update timing; each platform applies its own current rules.</p>
</blockquote>
<p>A local business changes its phone number. The homepage is updated, but the call button in the mobile header still dials the old line. Structured data names the new number while a location page and PDF estimate use the old one. The Google Business Profile has the new website, but paid ads and conversion tracking still point to a retired domain. Customers keep calling both numbers, so nobody notices which systems were missed.</p>
<p>That is not merely “NAP inconsistency.” It is an incomplete data migration. Name, address, phone, domain, hours, category, and service-area changes feed customer interfaces, search platforms, maps, ads, analytics, forms, email, legal documents, operations, and third-party directories. The safe approach is change control with a defined source, dependency map, effective date, verification evidence, and rollback or forwarding plan.</p>
<h2 id="what-matters-most">What matters most</h2>
<ol>
<li><strong>The real-world business is the source—not an SEO spreadsheet.</strong> The approved record should reflect the actual name, eligible location or service-area model, reachable phone, owned website, operating hours, and responsible business owner.</li>
<li><strong>Display rules vary by business model.</strong> Google's current Business Profile guidelines tell service-area businesses without a storefront to hide their address. Uniformly publishing a home address in the name of “citation consistency” can be wrong and harmful.</li>
<li><strong>Old contact paths need a retirement plan.</strong> Phone forwarding, domain redirects, email aliases, map links, form endpoints, call tracking, and advertising destinations can fail at different times. Monitor both old and new paths through a defined transition window.</li>
<li><strong>Verification is observable, not assumed.</strong> A saved dashboard edit may remain under review or be superseded by another source. Record public results on desktop and mobile, authenticated and unauthenticated where relevant, after expected propagation windows.</li>
</ol>
<h2 id="how-to-manage-the-change">How to manage the change</h2>
<h3 id="approve-an-effective-dated-identity-record">Approve an effective-dated identity record</h3>
<p>Create one versioned record owned by the business:</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Approved value</th>
<th>Effective date</th>
<th>Public display rule</th>
<th>Evidence owner</th>
</tr>
</thead>
<tbody><tr>
<td>Business name</td>
<td>Real-world name used in signage, stationery and customer dealings</td>
<td>YYYY-MM-DD</td>
<td>No added keywords or promotional text</td>
<td>Business owner</td>
</tr>
<tr>
<td>Legal name</td>
<td>Exact entity where required</td>
<td>YYYY-MM-DD</td>
<td>Display only in legal, billing or schema fields where appropriate</td>
<td>Business/legal owner</td>
</tr>
<tr>
<td>Location model</td>
<td>Storefront, hybrid or service-area business</td>
<td>YYYY-MM-DD</td>
<td>Determines whether street address is publicly shown</td>
<td>Business owner</td>
</tr>
<tr>
<td>Address</td>
<td>Complete eligible location plus unit details</td>
<td>YYYY-MM-DD</td>
<td>Hidden for a qualifying service-area business when required</td>
<td>Operations owner</td>
</tr>
<tr>
<td>Service area</td>
<td>Named cities, counties or practical territory</td>
<td>YYYY-MM-DD</td>
<td>Describes where service is offered; not a substitute for false locations</td>
<td>Operations owner</td>
</tr>
<tr>
<td>Primary phone</td>
<td>Direct, answered number for the business/location</td>
<td>YYYY-MM-DD</td>
<td>Click-to-call and visible formatting tested</td>
<td>Operations owner</td>
</tr>
<tr>
<td>Website</td>
<td>Canonical HTTPS destination owned and managed for the business</td>
<td>YYYY-MM-DD</td>
<td>One location-specific destination where appropriate</td>
<td>Digital owner</td>
</tr>
<tr>
<td>Hours</td>
<td>Regular, special and holiday hours</td>
<td>YYYY-MM-DD</td>
<td>Time zone and appointment rules explicit</td>
<td>Operations owner</td>
</tr>
<tr>
<td>Categories/services</td>
<td>Accurate primary and additional categories plus supported services</td>
<td>YYYY-MM-DD</td>
<td>Follow platform definitions; do not keyword-stuff</td>
<td>Business owner</td>
</tr>
</tbody></table>
<p>Preserve prior versions. The goal is not to erase history but to know which value was authoritative on a given date.</p>
<h3 id="decide-whether-the-change-is-cosmetic-or-substantive">Decide whether the change is cosmetic or substantive</h3>
<p>A punctuation correction differs from a rebrand. A suite correction differs from a move across town. A call-tracking number differs from replacing the company's only line. A new domain with the same business differs from an acquisition or merger.</p>
<p>Record the reason, real-world effective date, entities or locations affected, customer impact, licensing or regulatory dependencies, verification requirements, review/profile implications to investigate, and approved communication. Do not use the checklist to make an ineligible location appear eligible or to combine distinct businesses without platform approval.</p>
<h3 id="map-controlled-and-uncontrolled-dependencies">Map controlled and uncontrolled dependencies</h3>
<p>Start with systems the business controls:</p>
<ul>
<li>Website header, footer, contact page, location pages, forms, buttons, metadata, structured data, social cards, PDFs, email templates, downloadable documents, image text, and accessibility labels</li>
<li>Domain registration, DNS, redirects, certificates, email addresses, aliases, SPF/DKIM/DMARC-related configuration, and subdomains</li>
<li>CRM, scheduling, invoicing, proposals, contracts, payment receipts, support system, call tracking, SMS, and voicemail</li>
<li>Analytics properties, tag manager, conversion definitions, consent platform, ad destinations, merchant/product feeds, and campaign templates</li>
<li>Google Business Profile, Search Console, social profiles, map platforms, industry directories, licensing directories, chambers, associations, and data aggregators relevant to the business</li>
</ul>
<p>Then record references the business cannot directly edit: news articles, customer websites, old PDFs, community pages, and scraped directories. Prioritize by customer harm, authority, visibility, and ability to correct. Do not launch mass automated edits or duplicate listings to chase theoretical consistency.</p>
<h3 id="choose-the-update-sequence">Choose the update sequence</h3>
<p>The exact order depends on the change, but a defensible sequence is:</p>
<ol>
<li>Verify owner access, recovery methods, and current exports before changing anything.</li>
<li>Prepare the new website/contact paths and test them privately or in preview.</li>
<li>Configure domain redirects, phone forwarding, email aliases, and monitoring where the old path will retire.</li>
<li>Update the canonical website source record and all generated site surfaces in one release.</li>
<li>Update Business Profile and other high-authority owner-controlled platforms using the same approved record.</li>
<li>Update ads, analytics, tag management, conversion endpoints, scheduling, CRM, billing, documents, and operations.</li>
<li>Correct selected external directories and partners with recorded submissions.</li>
<li>Verify the public results, reconcile differences, and monitor old paths.</li>
</ol>
<p>For a domain change, keep page-to-page redirects where equivalent content exists, preserve important paths, update internal links and canonicals, verify both properties in search tools, and monitor certificates, DNS, email, forms, and analytics. A blanket redirect to the new homepage can discard useful path meaning and hide broken migrations.</p>
<h3 id="treat-each-website-surface-as-a-test-case">Treat each website surface as a test case</h3>
<p>Search source files and built output for every old value and common formatting variant. For a phone change, that includes digits, formatted text, <code>tel:</code> links, structured data, aria-labels, tracking scripts, images, and third-party widgets. For a domain change, include absolute URLs, canonical tags, Open Graph URLs, JSON-LD identifiers, sitemap, robots references, RSS, forms, CORS allowlists, OAuth callbacks, email links, and hard-coded API settings.</p>
<p>Build a route sample:</p>
<ul>
<li>Homepage on desktop and mobile</li>
<li>Header and footer</li>
<li>Contact and estimate pages</li>
<li>One service page</li>
<li>One location page</li>
<li>One article</li>
<li>One PDF or downloadable document</li>
<li>404/error route</li>
<li>Form success and failure path</li>
<li>Search result/social preview metadata in source</li>
</ul>
<p>Automated scans can find literal old values. They cannot decide whether a historical article, legal record, photo, or archived document should change.</p>
<h3 id="handle-storefront-and-service-area-addresses-deliberately">Handle storefront and service-area addresses deliberately</h3>
<p>Google's guidelines say the business name should match the real-world name and distinguish storefront, hybrid, and service-area businesses. A service-area business that travels to customers and lacks an eligible staffed storefront should hide the address on the profile. An address used only for mail or a virtual office does not become an eligible customer-facing location because it appears consistently online.</p>
<p>The website can still identify the actual community or service territory truthfully without publishing a private home address or inventing offices. Document what appears publicly, what is stored privately for verification or billing, and which platforms have their own rules.</p>
<h3 id="preserve-ownership-and-review-platform-access">Preserve ownership and review platform access</h3>
<p>Use named accounts and delegated roles. Google distinguishes profile owners and managers; the business should know the primary owner and avoid sharing one password among employees and vendors. Before a major change, verify that at least the appropriate business owner can manage access and recovery.</p>
<p>Do not assume that reviews, photos, posts, history, or verification will automatically behave a certain way after a merger, move, rebrand, or ownership change. Review the platform's current scenario-specific documentation and contact support when the case does not match the standard edit flow.</p>
<h3 id="build-a-verification-ledger">Build a verification ledger</h3>
<p>Record each dependency with status and evidence:</p>
<table>
<thead>
<tr>
<th>System</th>
<th>Intended state</th>
<th>Submitted</th>
<th>Publicly verified</th>
<th>Evidence</th>
<th>Owner</th>
<th>Follow-up</th>
</tr>
</thead>
<tbody><tr>
<td>Website production</td>
<td>New value on all generated surfaces</td>
<td>Date/time and commit</td>
<td>Route sample and source scan pass</td>
<td>Build/test record</td>
<td>Web owner</td>
<td>Monitor errors</td>
</tr>
<tr>
<td>Business Profile</td>
<td>Approved name/location/phone/site/hours</td>
<td>Date/time and editor</td>
<td>Public profile checked</td>
<td>Screenshot/link and profile state</td>
<td>Profile owner</td>
<td>Recheck pending edits</td>
</tr>
<tr>
<td>Old phone</td>
<td>Forwarding with approved greeting</td>
<td>Date/time</td>
<td>Synthetic call from external line</td>
<td>Call record</td>
<td>Operations</td>
<td>Retire on date</td>
</tr>
<tr>
<td>Old domain</td>
<td>Valid HTTPS and mapped redirects</td>
<td>Date/time</td>
<td>HTTP tests across route sample</td>
<td>Redirect report</td>
<td>Web owner</td>
<td>Renewal/retirement decision</td>
</tr>
<tr>
<td>Forms/CRM</td>
<td>New routing and sender configuration</td>
<td>Date/time</td>
<td>Synthetic lead traced end to end</td>
<td>Correlation ID</td>
<td>Operations</td>
<td>Reconcile daily</td>
</tr>
</tbody></table>
<p>A screenshot proves one display at one time. Combine it with machine-readable checks, account-state evidence, calls, form tests, and operational confirmation.</p>
<h3 id="monitor-the-transition">Monitor the transition</h3>
<p>For the approved transition period, track:</p>
<ul>
<li>Calls to old and new numbers, missed-call routing, SMS behavior, voicemail, and recorded greeting</li>
<li>Requests to the old domain and paths, redirect failures, certificate errors, DNS, 404s, and form submissions</li>
<li>Email to old and new addresses, bounces, authentication failures, and replies</li>
<li>Business Profile pending/rejected edits, user-suggested changes, duplicate profiles, and public display</li>
<li>Search Console verification, sitemap processing, canonical selection samples, and crawl errors</li>
<li>Paid campaign destination errors, call-tracking pools, conversion events, and scheduling/CRM delivery</li>
<li>Customer reports of wrong directions, wrong hours, unreachable numbers, or confusing branding</li>
</ul>
<p>Set an owner and threshold for each alert. “Keep an eye on it” is not a monitoring plan.</p>
<h2 id="what-this-checklist-cannot-guarantee">What this checklist cannot guarantee</h2>
<p>This checklist cannot determine Business Profile eligibility, how Google or another platform will display an edit, whether reviews will transfer, or how long third-party systems will retain old information. It does not guarantee rankings or prevent temporary visibility changes.</p>
<p>Legal name, licenses, tax records, insurance, regulated advertising, accessibility, privacy notices, contracts, and consumer communications may impose requirements outside local SEO. Qualified advisers and the responsible authorities should review those obligations.</p>
<p>Third-party directories can resurface old data from their own sources. Repeated submissions can create duplicates or conflicts. Prioritize authoritative owner-controlled systems and use each platform's correction process.</p>
<h2 id="put-the-checklist-into-practice">Put the checklist into practice</h2>
<p>An effective-dated identity record and verification ledger keep the real business facts, public display rules, website changes, platform submissions, visible results, and recovery steps in one place.</p>
<p>That separation prevents two common mistakes: forcing every platform to display the same address when the business model says otherwise, and declaring a migration complete because one dashboard accepted an edit. The ledger keeps unresolved listings, responsible owners, and retirement dates visible. Mendola.Tech can help coordinate the website and account changes when the update spans multiple systems.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://support.google.com/business/answer/3038177" rel="noreferrer">Guidelines for representing your business on Google</a> — Google Business Profile Help; accessed 2026-08-11. Supports real-world business names, accurate addresses, storefront/service-area distinctions, and authoritative location phone and website information.</li>
<li><a href="https://support.google.com/business/answer/3039617" rel="noreferrer">Edit your Business Profile</a> — Google Business Profile Help; accessed 2026-08-11. Supports current profile editing and the possibility that changes require review.</li>
<li><a href="https://support.google.com/business/answer/2853879" rel="noreferrer">Manage your business address</a> — Google Business Profile Help; accessed 2026-08-11. Supports address, map pin, service-area, and hidden-address workflows.</li>
<li><a href="https://support.google.com/business/answer/3403100" rel="noreferrer">Manage your Business Profile owners and managers</a> — Google Business Profile Help; accessed 2026-08-11. Supports delegated account roles and primary ownership.</li>
<li><a href="https://developers.google.com/search/docs/appearance/structured-data/local-business" rel="noreferrer">Local business structured data</a> — Google Search Central; accessed 2026-08-11. Supports using LocalBusiness structured data for defined business details while following general structured-data requirements.</li>
<li><a href="https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes" rel="noreferrer">Site Moves and Migrations</a> — Google Search Central; accessed 2026-08-11. Supports page mapping, redirects, canonical updates, verification, sitemap submission, and monitoring during URL-changing moves.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Small-Business Website Ownership Handoff: A Vendor-Exit Checklist</title>
      <link>https://mendola.tech/blog/small-business-website-ownership-handoff-checklist/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/small-business-website-ownership-handoff-checklist/</guid>
      <description>A verification-first checklist for transferring domains, code, hosting, content, analytics, business profiles, licenses, and operational knowledge.</description>
      <category>Technology Operations</category>
      <pubDate>Tue, 11 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<blockquote>
<p>Use this checklist when a business is taking control of its website from an agency, freelancer, employee, or former provider. It is not legal, tax, privacy, security, licensing, or registrar-specific advice; contracts and current provider terms control each handoff.</p>
</blockquote>
<p>A small business can pay for a website for years without controlling the systems required to keep it online. The domain may be registered in a vendor account. Source code may exist only on one laptop. The public site may deploy from an unknown branch. Form submissions may route through a former employee's mailbox. Analytics and the Google Business Profile may list the agency as the only owner.</p>
<p>A vendor exit exposes those dependencies at the worst possible time. The solution is not a single download. It is a verified transfer packet that proves the owner can operate, restore, update, and reassign the website without depending on the outgoing provider.</p>
<h2 id="what-matters-most">What matters most</h2>
<ol>
<li><strong>Possession and control are different.</strong> A folder of HTML does not confer control of the domain, DNS, hosting account, deployment keys, form endpoint, analytics property, business profile, licensed assets, or billing relationship.</li>
<li><strong>Primary ownership should follow the business.</strong> Vendors can be delegated as users or managers. The business should retain an owner-controlled account, recovery method, and billing view for critical services whenever the provider supports that model.</li>
<li><strong>Exports need restoration tests.</strong> A repository mirror, database export, media archive, or DNS zone is evidence only after the receiving team can inspect it, rebuild it, and explain how it would be restored.</li>
<li><strong>Revocation comes after acceptance.</strong> Removing the outgoing team too early can interrupt a launch or erase the only recovery path. Leaving access indefinitely creates a different risk. Use a dated acceptance gate and revocation record.</li>
</ol>
<h2 id="how-to-complete-the-handoff">How to complete the handoff</h2>
<h3 id="freeze-the-handoff-boundary">Freeze the handoff boundary</h3>
<p>Record the effective date, current vendor, receiving owner, receiving technical contact, websites and subdomains, environments, and maintenance responsibilities included. State what is excluded: email administration, advertising accounts, photography rights, customer data, a separate CRM, or an unrelated application should not disappear into “website access.”</p>
<p>Pause nonessential changes during the final export and record the deployed revision. If work must continue, define who can change which environment and how the final difference will be reconciled.</p>
<h3 id="build-an-authoritative-asset-register">Build an authoritative asset register</h3>
<p>Use one row per asset or account:</p>
<table>
<thead>
<tr>
<th>Asset</th>
<th>Primary owner</th>
<th>Authoritative location</th>
<th>Export or transfer</th>
<th>Verification</th>
<th>Recovery contact</th>
</tr>
</thead>
<tbody><tr>
<td>Domain registration</td>
<td>Business account</td>
<td>Registrar</td>
<td>Account change or registrar transfer</td>
<td>Registrant, expiration, lock, nameservers and renewal confirmed</td>
<td>Named owner and registrar support path</td>
</tr>
<tr>
<td>DNS zone</td>
<td>Business or approved infrastructure account</td>
<td>DNS provider</td>
<td>Zone export plus human-readable record list</td>
<td>Authoritative queries match expected records</td>
<td>Provider owner and emergency contact</td>
</tr>
<tr>
<td>Source code</td>
<td>Business-owned organization</td>
<td>Git host</td>
<td>Repository ownership transfer or mirror</td>
<td>Fresh clone, history, tags, branches and build pass</td>
<td>Organization owners</td>
</tr>
<tr>
<td>Hosting and deployment</td>
<td>Business account</td>
<td>Host/CDN</td>
<td>Owner role, project transfer, environment inventory</td>
<td>Known revision deploys to preview and production</td>
<td>Account owners and provider support</td>
</tr>
<tr>
<td>Database and uploads</td>
<td>Business account</td>
<td>Managed service or storage</td>
<td>Dated export and media archive</td>
<td>Restore rehearsal in an isolated environment</td>
<td>Data owner and technical custodian</td>
</tr>
<tr>
<td>Forms and email delivery</td>
<td>Business account</td>
<td>Endpoint and mail provider</td>
<td>Configuration export and verified recipients</td>
<td>Synthetic submission reaches the intended queue</td>
<td>Operations owner</td>
</tr>
<tr>
<td>Analytics and search tools</td>
<td>Business account</td>
<td>Analytics/Search Console platforms</td>
<td>Owner/admin role</td>
<td>Owner can view property, settings and history</td>
<td>Named marketing owner</td>
</tr>
<tr>
<td>Business profiles</td>
<td>Business owner</td>
<td>Listing platform</td>
<td>Owner role; vendor remains manager if needed</td>
<td>Owner can edit and manage access</td>
<td>Primary owner</td>
</tr>
<tr>
<td>Content and media rights</td>
<td>Business records</td>
<td>Repository/DAM/contract file</td>
<td>Originals and rights schedule</td>
<td>License, attribution, territory and term reviewed</td>
<td>Contract owner</td>
</tr>
</tbody></table>
<p>Do not put passwords, private keys, recovery codes, customer exports, and ordinary inventory notes in the same shared spreadsheet. The register can identify where secrets are stored without exposing them.</p>
<h3 id="verify-domain-control-without-creating-an-outage">Verify domain control without creating an outage</h3>
<p>Record the registrar of record, registered name holder information available to the owner, account owner, recovery email and phone, expiration date, auto-renew state, billing method, transfer lock, authorization-code process, nameservers, DNSSEC state, and any registry-specific requirements.</p>
<p>Transferring a domain between registrars is not always required. Moving the domain into an owner-controlled account at the existing registrar may be enough. If a registrar transfer is selected, use the registrar's current workflow and ICANN transfer policy rather than copying an old checklist. Preserve the existing DNS service until the new authority and records are verified.</p>
<p>Capture the DNS zone before any change, including A, AAAA, CNAME, MX, TXT, CAA, verification, DKIM, SPF-related, DMARC, and service-specific records. Query authoritative DNS and common recursive resolvers before and after the transition. A screenshot of a provider dashboard does not prove what the public DNS is serving.</p>
<h3 id="transfer-source-as-a-reproducible-system">Transfer source as a reproducible system</h3>
<p>The receiving team should obtain the Git repository with history, default branch, protected-branch rules, tags, releases, submodules, Git LFS objects, CI configuration, issue or migration records needed by the contract, and a map of deployment integrations. GitHub documents that a mirror clone can preserve repository files and revision history, while other platform metadata may need a separate export.</p>
<p>Require a clean-room test:</p>
<ol>
<li>Clone into an empty directory using the access a future maintainer will have.</li>
<li>Follow the written runtime and dependency setup.</li>
<li>Build without undocumented files from the outgoing developer's computer.</li>
<li>Run the test suite and record versions and results.</li>
<li>Deploy to an isolated preview using newly issued credentials.</li>
<li>Compare routes, forms, metadata, redirects, analytics configuration, and critical assets.</li>
<li>Document how to roll back to the accepted production release.</li>
</ol>
<p>A passing local build is not proof that production can be operated. A production deployment is not proof that the repository can be restored. Test both.</p>
<h3 id="inventory-third-party-dependencies-and-licenses">Inventory third-party dependencies and licenses</h3>
<p>List fonts, images, video, themes, plugins, APIs, maps, review widgets, consent tools, form providers, email delivery, CAPTCHA, monitoring, CDN, payment services, and automation. For each, record the contracting account, billing owner, plan, renewal, usage limit, data handled, export path, license or terms reference, and replacement consequence.</p>
<p>Avoid transferring a vendor's multi-client API key or software license into the owner's repository. Create an owner-controlled subscription or document the approved continuing arrangement. Rotate secrets during the handoff and test the new credentials before retiring the old ones.</p>
<h3 id="preserve-measurement-and-business-identity">Preserve measurement and business identity</h3>
<p>Transfer owner or administrator access for analytics, tag management, search tools, ad accounts in scope, call tracking, conversion endpoints, and the business profile. Preserve property IDs, data streams, event definitions, filters, exclusions, conversion definitions, audiences, consent settings, retention settings, and known reporting breaks.</p>
<p>Google's Business Profile guidance distinguishes owners and managers and advises against password sharing. The business can hold ownership while an authorized provider receives a delegated role. Record the primary owner, other owners, managers, recovery account, and the date former access will be removed.</p>
<h3 id="write-the-operating-runbook">Write the operating runbook</h3>
<p>The handoff is incomplete until an unfamiliar but qualified person can answer:</p>
<ul>
<li>How does a content edit move from source to production?</li>
<li>Which branch and commit are deployed now?</li>
<li>How are preview and production separated?</li>
<li>Where do form submissions go, and how is a failure detected?</li>
<li>How are domains, certificates, dependencies, backups and licenses renewed?</li>
<li>What is monitored, who receives alerts, and what is the response path?</li>
<li>How is the prior release restored?</li>
<li>Where are privacy requests, retention, and customer-data procedures documented?</li>
<li>Which changes require business approval?</li>
</ul>
<p>Include commands and links, but explain the expected result and failure path. A runbook made only of copy-and-paste commands becomes dangerous when an account, branch, or environment changes.</p>
<h3 id="use-a-two-person-acceptance-gate">Use a two-person acceptance gate</h3>
<p>The business owner confirms control, billing, and recovery. The receiving technical custodian confirms reproducibility and operation. Both review an exceptions register with owner, risk, due date, and workaround.</p>
<p>Acceptance evidence should include:</p>
<ul>
<li>Owner login and recovery verified for critical services</li>
<li>Domain, DNS and renewal state recorded</li>
<li>Repository cloned and built cleanly</li>
<li>Preview and production deployments verified</li>
<li>Forms and notification routing tested with synthetic data</li>
<li>Backup inspected and at least one restore path rehearsed</li>
<li>Analytics, search and profile access verified</li>
<li>License and renewal schedule delivered</li>
<li>Runbook and architecture map delivered</li>
<li>Former access revocation date scheduled</li>
</ul>
<p>After acceptance, revoke personal accounts, old deploy keys, shared passwords, stale OAuth grants, former webhooks, unused API keys, and obsolete recovery methods. Save a revocation log without storing the secret values.</p>
<h2 id="what-this-checklist-cannot-decide">What this checklist cannot decide</h2>
<p>This checklist cannot determine contract ownership, copyright, work-made-for-hire status, privacy obligations, record-retention duties, tax treatment, or whether a provider must transfer a specific platform asset. It does not make a proprietary hosted system portable when the platform does not provide source or a complete export.</p>
<p>Repository mirrors may omit issues, pull requests, packages, discussions, hosted build artifacts, secrets, LFS objects, or provider-specific settings. Domain and Business Profile transfers can have waiting periods, verification requirements, and product-specific restrictions. Current provider documentation and qualified counsel should resolve the specific case.</p>
<p>The handoff also cannot prove that the inherited site is secure, accessible, compliant, accurate, or maintainable. Those require separate reviews.</p>
<h2 id="put-the-checklist-into-practice">Put the checklist into practice</h2>
<p>A verified handoff needs more than a list of logins. Pair every asset with five facts: owner, authoritative location, transfer mechanism, acceptance test, and recovery contact. A clean build, isolated deployment, synthetic form test, restore rehearsal, and two-person acceptance review turn “we sent the files” into evidence that the business can continue operating.</p>
<p>The same register can be used at the start of a vendor relationship. Recording ownership and exit paths before work begins makes future transitions less disruptive and gives both parties a clear boundary. Mendola.Tech can help document and verify the handoff when a business needs an independent technical review.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://www.icann.org/resources/pages/transfer-policy-2016-06-01-en" rel="noreferrer">Transfer Policy</a> — ICANN; accessed 2026-08-11. Supports using the current registrar-transfer policy and authorization process rather than an improvised domain handoff.</li>
<li><a href="https://www.icann.org/en/groups/ssac/documents/sac-044-en.pdf" rel="noreferrer">A Registrant's Guide to Protecting Domain Name Registration Accounts</a> — ICANN Security and Stability Advisory Committee; accessed 2026-08-11. Supports registrant account control, recovery, and domain-account security planning.</li>
<li><a href="https://docs.github.com/en/repositories/archiving-a-github-repository/backing-up-a-repository" rel="noreferrer">Backing up a repository</a> — GitHub Docs; accessed 2026-08-11. Supports mirror cloning for repository files and revision history and notes limitations of other archive formats.</li>
<li><a href="https://support.google.com/business/answer/3403100" rel="noreferrer">Manage your Business Profile owners and managers</a> — Google Business Profile Help; accessed 2026-08-11. Supports owner/manager roles and individual account access rather than shared credentials.</li>
<li><a href="https://support.google.com/business/answer/13763036" rel="noreferrer">Business eligibility and ownership guidelines</a> — Google Business Profile Help; accessed 2026-08-11. Supports owner control and the authorized representative's responsibility to transfer profile ownership on request.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>DNS and TLS Failure Modes: A Verification-First Website Launch Runbook</title>
      <link>https://mendola.tech/blog/dns-tls-website-launch-failure-runbook/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/dns-tls-website-launch-failure-runbook/</guid>
      <description>A standards-based failure catalog, command sequence, and evidence template for diagnosing DNS, HTTPS, and certificate problems during a website launch.</description>
      <category>Performance &amp; Reliability</category>
      <pubDate>Mon, 10 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<blockquote>
<p>Use this runbook only for domains and systems you control or are authorized to test. The commands use placeholders and help organize a launch diagnosis; they do not report a client incident, outage duration, or recovery result.</p>
</blockquote>
<p>“The SSL is broken” can describe several unrelated failures. The domain may still point to the old host. One authoritative nameserver may disagree with another. IPv4 may reach the new site while IPv6 reaches an old certificate. The correct origin may serve a default virtual host because the TLS handshake did not carry or route the expected name. Certificate issuance may fail even though the current website still loads.</p>
<p>Changing several DNS, CDN, hosting, and certificate settings at once makes those failures harder to isolate. This runbook starts with evidence: define the expected state, query each layer, save the outputs, and change only the layer that disagrees.</p>
<p>It is designed for website owners, developers, and operators coordinating a launch through a <a href="/managed-website/">managed website</a>, <a href="/services/systems-engineering/">systems engineering</a>, or <a href="/services/infrastructure-security/">infrastructure</a> engagement.</p>
<h2 id="what-matters-most">What matters most</h2>
<ol>
<li><strong>A browser is an end-to-end symptom check, not a layer diagnosis.</strong> It combines recursive DNS, address-family selection, routing, TLS name handling, certificate validation, HTTP redirects, caching, and browser policy. Test those layers separately.</li>
<li><strong>Authoritative truth and a recursive resolver's cached answer are different observations.</strong> Query the delegated authoritative nameservers directly, then query multiple recursive resolvers. This distinguishes an incorrect source record from a correct record that has not reached every cache.</li>
<li><strong>IPv4 and IPv6 are independent delivery paths.</strong> A correct A record does not compensate for a stale AAAA record. Test both when both are published.</li>
<li><strong>The hostname must be present at several boundaries.</strong> DNS must lead to the intended edge/origin, the TLS client must send the intended Server Name Indication (SNI), the served certificate must cover that hostname, and HTTP virtual-host routing must select the intended site.</li>
<li><strong>Certificate issuance and certificate serving are separate states.</strong> ACME proves control and obtains a certificate. The web server, load balancer, or CDN must still deploy the correct chain and select it for the requested name.</li>
<li><strong>CAA controls which certificate authorities may issue; it does not choose which certificate a server presents.</strong> An overly restrictive or inherited CAA policy can block issuance while the current certificate continues serving until it expires.</li>
</ol>
<h2 id="how-to-use-the-runbook">How to use the runbook</h2>
<h3 id="scope-and-evidence-boundary">Scope and evidence boundary</h3>
<p>This is a standards-based operational synthesis, not a benchmark or incident postmortem. The sequence was developed by mapping a website request across these layers:</p>
<ol>
<li>Registrar delegation and DNS zone authority</li>
<li>Authoritative resource records</li>
<li>Recursive resolver caching</li>
<li>IPv4/IPv6 connection target</li>
<li>HTTP host and redirect behavior</li>
<li>TLS SNI, certificate names, validity dates, issuer, and chain</li>
<li>ACME domain-control validation and CAA authorization</li>
<li>CDN, proxy, load balancer, and origin routing</li>
</ol>
<p>The commands below are evidence-collection templates. Replace placeholders only with an authorized domain, expected address, and authoritative nameserver. Preserve raw output with an ISO 8601 timestamp and note the network from which the test ran.</p>
<h3 id="define-the-expected-state-first">Define the expected state first</h3>
<p>Before opening a DNS dashboard, write down the intended result:</p>
<pre><code class="language-yaml">domain: www.example.com
apex_domain: example.com
expected_authoritative_nameservers:
  - ns1.provider.example
  - ns2.provider.example
expected_ipv4: [documented address or CDN-managed]
expected_ipv6: [documented address, CDN-managed, or intentionally absent]
expected_canonical_url: https://www.example.com/
expected_tls_names:
  - example.com
  - www.example.com
tls_termination: CDN | load_balancer | origin
certificate_automation: provider-managed | ACME HTTP-01 | ACME DNS-01 | other
change_ticket_or_deployment: identifier
launch_window_timezone: America/New_York
</code></pre>
<p>“CDN-managed” still needs a provider hostname or configuration identifier. The purpose is to prevent a troubleshooting session from treating an unfamiliar but intended address as an error.</p>
<h3 id="failure-catalog">Failure catalog</h3>
<table>
<thead>
<tr>
<th>Layer</th>
<th>Typical symptom</th>
<th>Verification that isolates it</th>
<th>Avoid assuming</th>
</tr>
</thead>
<tbody><tr>
<td>Registrar delegation</td>
<td>Some or all resolvers report an old/empty zone</td>
<td>Compare parent delegation with intended authoritative nameservers</td>
<td>Editing records in an undelegated dashboard will fix production</td>
</tr>
<tr>
<td>Authoritative DNS</td>
<td>Direct queries return the wrong A/AAAA/CNAME/CAA answer</td>
<td>Query every authoritative nameserver directly</td>
<td>All authoritative servers agree</td>
</tr>
<tr>
<td>Recursive cache</td>
<td>Authoritative answer is correct; public resolvers disagree</td>
<td>Query multiple recursive resolvers and record TTLs</td>
<td>“Propagation” explains a wrong authoritative answer</td>
</tr>
<tr>
<td>Address family</td>
<td>Site works on one network/device but fails on another</td>
<td>Test A/IPv4 and AAAA/IPv6 paths independently</td>
<td>IPv6 is unused because the operator did not configure it</td>
</tr>
<tr>
<td>TCP/network edge</td>
<td>DNS resolves but port 80/443 cannot be reached</td>
<td>Test connection from more than one authorized vantage point</td>
<td>A certificate change fixes firewall/routing</td>
</tr>
<tr>
<td>HTTP virtual host</td>
<td>Correct IP returns a default site, redirect loop, or wrong host</td>
<td>Pin DNS for the request while preserving the Host header</td>
<td>The IP uniquely identifies a website</td>
</tr>
<tr>
<td>TLS SNI selection</td>
<td>Wrong/default certificate is presented</td>
<td>Connect to the expected IP with the expected SNI hostname</td>
<td>The same certificate is served for every name on the IP</td>
</tr>
<tr>
<td>Certificate identity</td>
<td>Browser reports name mismatch</td>
<td>Inspect Subject Alternative Name coverage</td>
<td>Common Name alone describes modern hostname coverage</td>
</tr>
<tr>
<td>Validity or chain</td>
<td>Expired/not-yet-valid/untrusted-chain warning</td>
<td>Inspect dates, issuer, leaf/intermediate chain, and client trust result</td>
<td>Renewal means the new certificate was deployed</td>
</tr>
<tr>
<td>ACME HTTP-01</td>
<td>Issuance/renewal validation fails</td>
<td>Fetch the exact challenge path over port 80 through the public route</td>
<td>An HTTPS homepage proves the HTTP challenge is reachable</td>
</tr>
<tr>
<td>ACME DNS-01</td>
<td>Issuance cannot see the expected TXT value</td>
<td>Query authoritative <code>_acme-challenge</code> TXT records</td>
<td>Dashboard presence means every authoritative server answers</td>
</tr>
<tr>
<td>CAA authorization</td>
<td>CA refuses issuance while DNS and HTTP otherwise work</td>
<td>Query effective CAA at the requested name and relevant parent names</td>
<td>CAA changes which certificate is currently served</td>
</tr>
<tr>
<td>CDN/proxy/origin mapping</td>
<td>Edge serves a valid but wrong site/certificate or reports 52x</td>
<td>Compare edge, pinned origin, host mapping, and TLS termination configuration</td>
<td>Origin health and edge configuration are the same state</td>
</tr>
</tbody></table>
<h3 id="verification-sequence">Verification sequence</h3>
<p>Run read-only checks before changing production. Examples show PowerShell commands available on Windows and portable tools commonly available on macOS/Linux or through an operator toolbox.</p>
<h4>1. Confirm delegation</h4>
<p>PowerShell:</p>
<pre><code class="language-powershell">Resolve-DnsName example.com -Type NS
</code></pre>
<p>Portable:</p>
<pre><code class="language-sh">dig +trace example.com NS
dig example.com NS
</code></pre>
<p>Record the nameservers returned through the parent chain. A zone can contain correct-looking records at a provider that is not actually delegated for the domain.</p>
<h4>2. Ask every authoritative server</h4>
<pre><code class="language-sh">dig @ns1.provider.example example.com A
dig @ns1.provider.example example.com AAAA
dig @ns1.provider.example www.example.com CNAME
dig @ns1.provider.example example.com CAA

dig @ns2.provider.example example.com A
dig @ns2.provider.example example.com AAAA
dig @ns2.provider.example www.example.com CNAME
dig @ns2.provider.example example.com CAA
</code></pre>
<p>Do not skip the second server. A partially updated authoritative set can create location-dependent behavior even before recursive caching is considered. Save answers, flags, TTLs, CNAME chains, and response codes.</p>
<p>On Windows, an explicit server can be queried with:</p>
<pre><code class="language-powershell">Resolve-DnsName example.com -Type A -Server ns1.provider.example
Resolve-DnsName example.com -Type AAAA -Server ns1.provider.example
Resolve-DnsName example.com -Type CAA -Server ns1.provider.example
</code></pre>
<h4>3. Compare recursive resolvers</h4>
<pre><code class="language-sh">dig @1.1.1.1 example.com A
dig @8.8.8.8 example.com A
dig @1.1.1.1 example.com AAAA
dig @8.8.8.8 example.com AAAA
</code></pre>
<p>These public resolvers are examples, not a complete global propagation test. Also query the resolver actually used by an affected network. If recursive answers differ from the now-correct authoritative answer, record the remaining TTL and wait/retest according to the change plan. Do not keep editing the authoritative record just to force caches to refresh.</p>
<h4>4. Test IPv4 and IPv6 independently</h4>
<pre><code class="language-sh">curl -4 -I https://example.com/
curl -6 -I https://example.com/
</code></pre>
<p>If AAAA is published, an IPv6 failure is a real failure path. Remove or change it only when that is part of the approved design; first verify whether the CDN, load balancer, or origin is intended to serve IPv6.</p>
<h4>5. Pin the intended address without changing DNS</h4>
<pre><code class="language-sh">curl -I --resolve example.com:443:&lt;expected-ip&gt; https://example.com/
curl -I --resolve www.example.com:443:&lt;expected-ip&gt; https://www.example.com/
</code></pre>
<p><code>--resolve</code> lets the client connect to a chosen address while retaining the URL hostname for TLS SNI and HTTP Host routing. It is useful for testing a new edge/origin before public DNS changes. It is not a substitute for confirming the actual public DNS answer.</p>
<p>For plain HTTP routing and ACME HTTP-01 diagnostics:</p>
<pre><code class="language-sh">curl -I --resolve example.com:80:&lt;expected-ip&gt; http://example.com/
curl --resolve example.com:80:&lt;expected-ip&gt; \
  http://example.com/.well-known/acme-challenge/&lt;authorized-test-token&gt;
</code></pre>
<p>Never publish a real active challenge token in an article, ticket, or public log.</p>
<h4>6. Inspect the certificate selected by SNI</h4>
<pre><code class="language-sh">openssl s_client \
  -connect &lt;expected-ip&gt;:443 \
  -servername example.com \
  -showcerts &lt;/dev/null
</code></pre>
<p>To extract the leaf certificate details from a saved PEM file:</p>
<pre><code class="language-sh">openssl x509 -in leaf.pem -noout \
  -subject -issuer -serial -dates -ext subjectAltName
</code></pre>
<p>Record:</p>
<ul>
<li>Hostname used for SNI</li>
<li>Connected IP and port</li>
<li>Subject Alternative Name entries</li>
<li>Issuer and serial number</li>
<li><code>notBefore</code> and <code>notAfter</code></li>
<li>Presented intermediates and client verification result</li>
</ul>
<p>Repeat for the apex and <code>www</code> names if both are public. A certificate covering one does not automatically cover the other.</p>
<h4>7. Verify HTTP redirects as a graph</h4>
<pre><code class="language-sh">curl -sS -D - -o /dev/null http://example.com/
curl -sS -D - -o /dev/null https://example.com/
curl -sS -D - -o /dev/null http://www.example.com/
curl -sS -D - -o /dev/null https://www.example.com/
</code></pre>
<p>Record every <code>Location</code> value and final status. The intended pattern is project-specific, but each public variant should reach the documented canonical URL without a loop, unrelated host, downgrade, or path/query corruption.</p>
<h4>8. Isolate ACME validation</h4>
<p>For HTTP-01, Let's Encrypt documents that the token is retrieved from <code>http://&lt;domain&gt;/.well-known/acme-challenge/&lt;token&gt;</code> and that the challenge uses port 80. Test the exact public hostname and path. A redirect policy, access rule, proxy, or multi-origin deployment can block the challenge while the homepage still appears healthy.</p>
<p>For DNS-01:</p>
<pre><code class="language-sh">dig @ns1.provider.example _acme-challenge.example.com TXT
dig @ns2.provider.example _acme-challenge.example.com TXT
dig @1.1.1.1 _acme-challenge.example.com TXT
</code></pre>
<p>DNS-01 supports wildcard issuance, but the TXT value must be visible through the effective authoritative path. If <code>_acme-challenge</code> is delegated by CNAME or NS, follow and document that delegation rather than editing the wrong zone. Use narrowly scoped DNS API credentials and an automated cleanup policy.</p>
<p>For CAA:</p>
<pre><code class="language-sh">dig example.com CAA
dig www.example.com CAA
</code></pre>
<p>CAA records authorize certificate authorities to issue. Effective policy can be found through DNS tree processing defined by the CAA standard, so a record at a parent domain can matter when a child has none. Compare the requested certificate names and CA with the effective policy.</p>
<h3 id="change-discipline">Change discipline</h3>
<p>After the evidence identifies a mismatched layer:</p>
<ol>
<li>Save the before-state outputs and current configuration/version.</li>
<li>Change one authoritative system under an approved change record.</li>
<li>Record the exact time, operator, old value, new value, expected effect, and rollback condition.</li>
<li>Re-run the same checks from authoritative DNS through HTTP/TLS.</li>
<li>Verify both address families and every public hostname.</li>
<li>Keep monitoring after the immediate test passes; cached and geographically distributed paths can update at different times.</li>
<li>Save the after-state and label any remaining uncertainty.</li>
</ol>
<p>Avoid deleting old hosting, certificates, DNS zones, or CDN mappings until the rollback window and evidence-retention policy permit it. A passing homepage from one laptop is not enough to retire the previous path.</p>
<h3 id="evidence-record-template">Evidence record template</h3>
<pre><code class="language-markdown"># DNS/TLS change evidence

- Domain/hostnames:
- Authorized scope:
- Expected canonical URL:
- Change/deployment ID:
- Test start/end (timestamp + timezone):
- Test networks/vantage points:
- Authoritative nameservers:
- Expected A/AAAA/CNAME state:
- TLS termination point:
- Certificate automation method:

## Before state

- Delegation output:
- Authoritative outputs from every server:
- Recursive resolver outputs and TTLs:
- IPv4/IPv6 HTTP results:
- Pinned-origin result:
- SNI/certificate result:
- Redirect graph:
- ACME/CAA result:

## Diagnosis

- Failing layer:
- Evidence:
- Alternatives ruled out:
- Uncertainty remaining:

## Change

- Old value/configuration:
- New value/configuration:
- Time applied:
- Rollback condition:

## After state

- Repeat the exact before-state checks
- Monitoring window and owner:
- Final status:
</code></pre>
<p>This record gives a customer a readable explanation and gives an engineer enough context to reproduce the diagnosis later.</p>
<h2 id="what-the-runbook-cannot-prove">What the runbook cannot prove</h2>
<ul>
<li>This runbook is a reference synthesis and has not been benchmarked against every registrar, DNS provider, CA, CDN, load balancer, browser, operating system, or hosting platform.</li>
<li>DNS behavior can involve DNSSEC, split-horizon/private zones, HTTPS/SVCB records, service discovery, captive portals, enterprise filtering, and provider-specific flattening not covered here.</li>
<li>Public recursive resolvers provide useful samples but do not represent every network or cache worldwide.</li>
<li><code>curl</code>, <code>dig</code>, <code>Resolve-DnsName</code>, and OpenSSL versions differ. Some environments require adjusted syntax or separate installation.</li>
<li>A successful command from one vantage point does not prove global availability, browser trust across all clients, or future renewal success.</li>
<li>Certificate trust can vary with client trust stores, algorithms, chain construction, clock accuracy, revocation behavior, and enterprise interception.</li>
<li>CDN and managed-certificate providers can hide origin or automation details. Use their official logs and diagnostics in addition to these external checks.</li>
<li>The runbook does not authorize scanning, bypassing access controls, changing third-party systems, or testing domains outside an approved scope.</li>
<li>It is operational guidance, not a formal security assessment, compliance audit, service-level guarantee, or promise of uninterrupted availability.</li>
</ul>
<h2 id="put-the-runbook-into-practice">Put the runbook into practice</h2>
<p>The launch-focused failure catalog connects DNS delegation, authoritative and recursive answers, IPv4 and IPv6 delivery, HTTP routing, TLS certificate identity, certificate challenges, CAA, and CDN or origin mapping in one verification sequence.</p>
<p>The key artifact is not another list of DNS record definitions. It is a verification order with paired commands and an evidence template. A website owner can see which layer failed and what was changed; an operator can reproduce the before/after state without relying on an ambiguous browser screenshot or a generic “wait for propagation” explanation.</p>
<p>See Mendola.Tech's <a href="/work/">engineering work and case studies</a> for implementation examples and the <a href="/blog/">guides library</a> for related website operations help.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://www.rfc-editor.org/rfc/rfc1034" rel="noreferrer">RFC 1034: Domain Names — Concepts and Facilities</a> — IETF/RFC Editor; accessed 2026-08-10. Supports the DNS hierarchy, zones, authoritative data, resolvers, and caching model.</li>
<li><a href="https://www.rfc-editor.org/rfc/rfc1035" rel="noreferrer">RFC 1035: Domain Names — Implementation and Specification</a> — IETF/RFC Editor; accessed 2026-08-10. Supports DNS message/resource-record behavior and core record/query mechanics.</li>
<li><a href="https://www.rfc-editor.org/rfc/rfc6066" rel="noreferrer">RFC 6066: TLS Extensions</a> — IETF/RFC Editor; accessed 2026-08-10. Supports the Server Name Indication extension used to select the intended virtual host/certificate during TLS negotiation.</li>
<li><a href="https://www.rfc-editor.org/rfc/rfc8446" rel="noreferrer">RFC 8446: The Transport Layer Security Protocol Version 1.3</a> — IETF/RFC Editor; accessed 2026-08-10. Supports the TLS handshake and certificate-based server authentication context.</li>
<li><a href="https://www.rfc-editor.org/rfc/rfc8555" rel="noreferrer">RFC 8555: Automatic Certificate Management Environment</a> — IETF/RFC Editor; accessed 2026-08-10. Supports automated certificate issuance, identifier authorization, and HTTP/DNS validation challenge concepts.</li>
<li><a href="https://www.rfc-editor.org/rfc/rfc8659" rel="noreferrer">RFC 8659: DNS Certification Authority Authorization</a> — IETF/RFC Editor; accessed 2026-08-10. Supports CAA syntax, tree processing, and CA authorization semantics.</li>
<li><a href="https://letsencrypt.org/docs/challenge-types/" rel="noreferrer">Challenge Types</a> — Let's Encrypt; updated 2026-02-12 and accessed 2026-08-10. Supports current HTTP-01 port/redirect behavior, DNS-01 wildcard/delegation behavior, propagation considerations, and credential-scope cautions.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>What a Monthly SEO Report Can and Cannot Prove</title>
      <link>https://mendola.tech/blog/monthly-seo-report-claim-quality-template/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/monthly-seo-report-claim-quality-template/</guid>
      <description>A month-end SEO snapshot template and claim-quality rubric for search visibility, map grids, backlinks, technical health, and conversions.</description>
      <category>SEO &amp; Visibility</category>
      <pubDate>Mon, 10 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<blockquote>
<p>Use this template to review an SEO report without confusing a measurement with a guaranteed business result. The examples are intentionally empty and do not disclose any client's rankings, map positions, traffic, leads, backlinks, or provider scores.</p>
</blockquote>
<p>A monthly SEO report should help someone decide what changed, what needs attention, and what should be tested next. It should not turn every fluctuating metric into a success story or imply that an observed change was caused by the most recent piece of work.</p>
<p>The core problem is provenance. “Position improved” is incomplete unless the report states which position metric, for which query set, at which location and device, over which dates, and whether the underlying data was final. The same number can mean a Search Console average across impressions, a single neutral organic result, one cell in a local map grid, or a provider-specific backlink rank.</p>
<p>This guide provides a saved month-end snapshot schema, a claim-quality rubric, and a review template for a business owner or operator using Mendola.Tech's <a href="/managed-website/">managed website and local visibility service</a>.</p>
<h2 id="what-matters-most">What matters most</h2>
<ol>
<li><strong>Metric identity is part of the result.</strong> A number without its provider, scope, unit, and collection context cannot be compared safely. Search Console's average position is calculated across impressions and can differ with aggregation; a location-specific rank check answers a different question.</li>
<li><strong>The comparison window needs an operational definition.</strong> “July versus August” could mean full calendar-month totals, the last finalized day of each month, or two provider snapshots collected on different days. The report should store the intended period and the actual collection/finalization timestamps.</li>
<li><strong>Local visibility is a surface, not a point.</strong> A center-cell map rank cannot describe a service area. Each coordinate, keyword, device/language setting, grid geometry, search depth, and business match needs its own saved result.</li>
<li><strong>Backlink counts and provider rank need index context.</strong> A live backlink index changes as the provider crawls. Backlinks, referring domains, and a provider's rank are separate measures; none is Google's PageRank or a guarantee of search performance.</li>
<li><strong>Missing data is not zero performance.</strong> A new project, failed API request, excluded project type, insufficient provider data, and a business not found within the searched depth require different states. Collapsing them into <code>0</code> or “not applicable” destroys the audit trail.</li>
<li><strong>The report should grade its own claims.</strong> Observations can be reported directly. Explanations should be labeled as hypotheses with evidence. Causal claims require a design that rules out credible alternatives and are uncommon in ordinary monthly SEO reporting.</li>
</ol>
<h2 id="how-to-build-the-monthly-report">How to build the monthly report</h2>
<h3 id="design-question">Design question</h3>
<p>What minimum information must a monthly record preserve so a later reviewer can compare search, local-map, backlink, technical, and conversion measurements without changing their meaning?</p>
<p>The template was built on 2026-08-10 using five rules:</p>
<ol>
<li>Use each provider's documented metric definition rather than a shared marketing label.</li>
<li>Store raw observations separately from summaries, explanations, and recommendations.</li>
<li>Preserve configuration and data-status fields needed to repeat the measurement.</li>
<li>Treat unavailable, inapplicable, and unsuccessful collection as distinct states.</li>
<li>Require every narrative claim to identify its evidence class and limitations.</li>
</ol>
<p>The sources reviewed were Google Search Console documentation and API definitions, Google Analytics acquisition documentation, and DataForSEO documentation for location-specific Maps SERPs and backlink data. The resulting schema is Mendola.Tech's synthesis; it is not an official Google or DataForSEO reporting standard.</p>
<h3 id="metric-dictionary">Metric dictionary</h3>
<p>The first page of a report should define the metrics it uses. This starter dictionary separates similarly named measures.</p>
<table>
<thead>
<tr>
<th>Display label</th>
<th>Source and unit</th>
<th>Required scope fields</th>
<th>Safe interpretation</th>
</tr>
</thead>
<tbody><tr>
<td>Search clicks</td>
<td>Search Console; count</td>
<td>Property, search type, dates, filters, aggregation, data state</td>
<td>Recorded clicks from eligible Google Search results under that scope</td>
</tr>
<tr>
<td>Search impressions</td>
<td>Search Console; count</td>
<td>Same as clicks</td>
<td>Recorded appearances under Search Console's counting rules</td>
</tr>
<tr>
<td>Search CTR</td>
<td>Search Console; clicks divided by impressions</td>
<td>Same as clicks</td>
<td>Ratio for the selected Search Console scope</td>
</tr>
<tr>
<td>Search average position</td>
<td>Search Console; average topmost position across impressions</td>
<td>Property/page aggregation, query/page filters, country, device, dates</td>
<td>Trend indicator for that impression mix; not a fixed rank</td>
</tr>
<tr>
<td>Tracked organic rank</td>
<td>SERP provider; ordinal result position</td>
<td>Keyword, engine, location, device, language, depth, timestamp, target</td>
<td>Position in one controlled lookup configuration</td>
</tr>
<tr>
<td>Local map grid rank</td>
<td>Maps SERP provider; ordinal position at one coordinate</td>
<td>Keyword, coordinate, zoom, grid ID, device/language, depth, business ID</td>
<td>Visibility at one sampled point, not an entire service area</td>
</tr>
<tr>
<td>Backlinks</td>
<td>Backlink provider; link count</td>
<td>Target mode, filters, provider/index, retrieved timestamp</td>
<td>Links found in that provider's index under that target definition</td>
</tr>
<tr>
<td>Referring domains</td>
<td>Backlink provider; domain count</td>
<td>Same as backlinks plus subdomain/main-domain counting rule</td>
<td>Distinct referring domains under the provider's documented definition</td>
</tr>
<tr>
<td>Provider domain rank</td>
<td>Named backlink provider; provider-defined score/scale</td>
<td>Provider, scale, target, retrieved timestamp</td>
<td>Comparative provider metric; not Google PageRank or a universal “DR”</td>
</tr>
<tr>
<td>Technical issues</td>
<td>Named crawler/audit; count by severity and rule</td>
<td>Crawler/version, URL scope, render mode, ruleset, timestamp</td>
<td>Issues found by that crawl; not a complete SEO score</td>
</tr>
<tr>
<td>Organic sessions</td>
<td>GA4 Traffic acquisition; session count</td>
<td>Property, session-scoped channel definition, dates, filters, consent state</td>
<td>Sessions attributed under the configured acquisition rules</td>
</tr>
<tr>
<td>Accepted web leads</td>
<td>First-party/GA4 event contract; event or deduplicated count</td>
<td>Event definition/version, source, dates, environment, deduplication rule</td>
<td>Accepted requests under the written trigger; not revenue or causation</td>
</tr>
</tbody></table>
<p>If a customer-facing interface uses the label “DR,” the report should spell out the actual provider and scale beside it. “DataForSEO domain rank,” for example, is more auditable than an unexplained “DR 27.” The provider can expand its index or revise its model, so the retrieval date belongs with the score.</p>
<h3 id="snapshot-identity">Snapshot identity</h3>
<p>Every month-end snapshot should have an immutable identity record before storing metric rows:</p>
<pre><code class="language-yaml">snapshot_id: project-id_2026-07_final_v1
project_id: stable-project-id
period_start: 2026-07-01
period_end: 2026-07-31
report_timezone: America/New_York
collection_started_at: YYYY-MM-DDThh:mm:ssZ
collection_completed_at: YYYY-MM-DDThh:mm:ssZ
status: provisional | finalized | superseded
supersedes_snapshot_id: null
configuration_version: tracked-scope-version
source_versions:
  search_console: documented-property-and-query-hash
  organic_rank: documented-keyword-location-device-hash
  map_grid: documented-grid-and-keyword-hash
  backlinks: documented-provider-target-and-scale
  technical_audit: documented-crawler-and-ruleset
  analytics: documented-property-and-event-contract
</code></pre>
<p>The example dates identify a period, not measured values. A production record should also hash or otherwise version the tracked keyword set, competitor set, grid geometry, target-domain normalization, and audit rules. If those inputs change, the report should show a scope change rather than implying a like-for-like trend.</p>
<h3 id="data-state-vocabulary">Data-state vocabulary</h3>
<p>Each metric row needs a <code>data_status</code> independent of its numeric value.</p>
<table>
<thead>
<tr>
<th>Status</th>
<th>Meaning</th>
<th>Display rule</th>
</tr>
</thead>
<tbody><tr>
<td><code>complete</code></td>
<td>Provider returned the expected finalized observation</td>
<td>Show value and retrieval context</td>
</tr>
<tr>
<td><code>provisional</code></td>
<td>Provider indicates the newest period may still change</td>
<td>Show value with a provisional label</td>
</tr>
<tr>
<td><code>not_found</code></td>
<td>Lookup completed, but target was outside the documented result depth</td>
<td>Show “Not found in top N,” not rank zero</td>
</tr>
<tr>
<td><code>insufficient</code></td>
<td>Provider has no eligible/adequate data for the requested metric</td>
<td>Show the provider limitation</td>
</tr>
<tr>
<td><code>not_applicable</code></td>
<td>Metric was intentionally excluded by a documented project rule</td>
<td>Show the rule or exclusion reason</td>
</tr>
<tr>
<td><code>not_configured</code></td>
<td>Project lacks the keyword, property, grid, event, or provider configuration</td>
<td>Show the missing setup</td>
</tr>
<tr>
<td><code>failed</code></td>
<td>Request or processing failed</td>
<td>Show error class, attempt time, and retry state</td>
</tr>
<tr>
<td><code>stale</code></td>
<td>Last successful observation is older than the report's freshness policy</td>
<td>Show the old date; do not present it as current</td>
</tr>
</tbody></table>
<p>This vocabulary answers a surprisingly important question: does a blank mean poor performance, no data, no setup, or a broken collection job? Only <code>not_found</code> is a search result, and even then it is bounded by the configured depth.</p>
<h3 id="month-end-collection-protocol">Month-end collection protocol</h3>
<p>A defensible automated workflow can run on the first day of each month for the previous calendar month, but one run should not be treated as final when a source still marks data incomplete.</p>
<ol>
<li><strong>Freeze scope.</strong> At period close, store the active project, keyword, competitor, map-grid, domain-target, event-definition, and technical-audit configuration versions.</li>
<li><strong>Create a provisional snapshot.</strong> On the first day, collect every available source and preserve raw responses, timestamps, costs, task identifiers, and explicit errors.</li>
<li><strong>Keep point-in-time checks point-in-time.</strong> Organic rank and local-map grid results describe their actual lookup timestamp. Do not relabel them as a month-long average unless repeated samples were collected and an aggregation rule was predeclared.</li>
<li><strong>Request finalized period data.</strong> For Search Console, query the exact start/end dates and request finalized data. If the source is not final or the last date is absent, retain the provisional state and schedule a finalization pass.</li>
<li><strong>Finalize without overwriting.</strong> Save the finalized snapshot as a new version that references the provisional record. Preserve the raw provisional response for auditability.</li>
<li><strong>Calculate deltas only between compatible rows.</strong> Source, scope, unit, target, keyword, location, device, grid cell, aggregation, and configuration version must match. Otherwise label the row “scope changed.”</li>
<li><strong>Generate the narrative from reviewed comparisons.</strong> Keep observation, explanation, and action in separate fields. Do not let a positive/negative color produce a causal sentence automatically.</li>
</ol>
<h3 id="local-map-grid-record">Local map grid record</h3>
<p>A 7-by-7 grid contains 49 independent coordinate checks per keyword. Store them as rows, not as one center rank copied into 49 cells.</p>
<pre><code class="language-text">snapshot_id,grid_id,keyword,cell_row,cell_column,latitude,longitude,
zoom,provider_task_id,business_match_id,rank,search_depth,data_status,
queried_at
</code></pre>
<p>The grid-level record should preserve its center coordinate, rows, columns, total width/height or spacing method, coordinate-generation algorithm, language, device/OS, Google domain, search-area setting, and business match rule. An average rank may be calculated as a secondary summary only after stating how <code>not_found</code> cells are handled. The full grid remains the primary evidence.</p>
<h3 id="claim-quality-rubric">Claim-quality rubric</h3>
<p>Score each sentence that interprets a change. The grade describes evidence strength, not whether the number moved in a favorable direction.</p>
<table>
<thead>
<tr>
<th>Grade</th>
<th>Claim class</th>
<th>Minimum support</th>
<th>Example wording pattern</th>
</tr>
</thead>
<tbody><tr>
<td>A</td>
<td>Reproducible observation</td>
<td>Compatible snapshots, saved raw data, definitions, dates, and scope</td>
<td>“Under the saved configuration, metric X changed from A to B.”</td>
</tr>
<tr>
<td>B</td>
<td>Supported explanation</td>
<td>Grade A plus direct diagnostic evidence and a plausible mechanism</td>
<td>“The timing and crawl evidence support X as a likely contributor.”</td>
</tr>
<tr>
<td>C</td>
<td>Working hypothesis</td>
<td>Grade A plus a plausible but unverified explanation and named alternatives</td>
<td>“One hypothesis is X; Y and Z have not been ruled out.”</td>
</tr>
<tr>
<td>D</td>
<td>Directional signal</td>
<td>Incomplete, noisy, sparse, or scope-affected evidence</td>
<td>“This warrants monitoring; the current record is not decision-ready.”</td>
</tr>
<tr>
<td>F</td>
<td>Unsupported claim</td>
<td>Missing provenance, incompatible scopes, cherry-picked dates, or causal wording without design</td>
<td>Remove or rewrite</td>
</tr>
</tbody></table>
<p>Ordinary month-to-month SEO reports will contain many Grade A observations and Grade C hypotheses. That is healthy. A report does not become more useful by pretending every movement has a certain explanation.</p>
<h3 id="customer-facing-report-template">Customer-facing report template</h3>
<pre><code class="language-markdown"># [Project] — SEO progress for [period]

## What changed

- Observation:
- Evidence grade:
- Compared snapshots:
- Scope/data-status note:

## Search visibility

- Search Console clicks, impressions, CTR, and average position
- Tracked keyword positions by fixed location/device
- New or materially changed query/page patterns

## Local map visibility

- Full saved grid for each tracked keyword
- Coverage summary with the not-found handling rule
- Configuration changes, if any

## Authority and backlinks

- Provider-named domain rank and scale
- Backlinks and referring domains
- New/lost observations with provider retrieval dates

## Technical health

- New, resolved, and persistent issues by rule/severity
- Crawl scope and version

## Leads and customer actions

- Events under the current measurement contract
- Collection or consent limitations

## What we think may explain it

- Hypothesis:
- Supporting evidence:
- Alternatives not ruled out:

## What happens next

- Action, owner, expected evidence, and review date

## Method and limitations

- Source definitions, period, timezone, filters, scope versions, and known gaps
</code></pre>
<p>The report leads with customer decisions while keeping the evidence available. It avoids internal-only labels such as “pipeline succeeded” unless they explain a data limitation that affects the customer.</p>
<h2 id="what-the-report-cannot-prove">What the report cannot prove</h2>
<ul>
<li>The template has not been validated against a representative sample of SEO programs or reporting platforms.</li>
<li>Search Console does not guarantee every query row; anonymized queries and internal limits affect detail, while chart and table aggregation can differ.</li>
<li>Average position changes when the impression mix changes and is not equivalent to a fixed-location rank check.</li>
<li>Location-specific SERP and Maps results vary by provider settings, time, personalization controls, interface changes, result depth, and business matching.</li>
<li>A map grid samples coordinates; it does not observe every resident, route, device, or search context inside a service area.</li>
<li>Backlink indexes differ and change as providers crawl. A provider score is not a direct Google ranking signal and should not be compared across vendors as though scales were interchangeable.</li>
<li>Analytics acquisition and lead data depends on tags, consent, attribution settings, event definitions, and blockers. It is not a complete census of customers.</li>
<li>Month-over-month movement can reflect seasonality, demand, competitors, search-system changes, site changes, measurement changes, and random variation.</li>
<li>The rubric improves claim discipline but does not create a causal experiment. A/B tests, controlled rollouts, longer time series, or other designs may be required for stronger conclusions.</li>
</ul>
<h2 id="put-the-report-template-into-practice">Put the report template into practice</h2>
<p>The reporting structure gives shared definitions to sources that are often displayed together without enough context: Search Console, neutral organic ranks, coordinate-level map grids, provider-specific backlink metrics, technical audits, and accepted customer actions.</p>
<p>The reusable additions are the immutable snapshot identity, explicit data-state vocabulary, compatibility gate for deltas, per-cell map record, and claim-quality rubric. Together they make a later month-end comparison auditable: a reviewer can tell what was observed, which configuration produced it, whether the data was final, and where the report moves from evidence into interpretation.</p>
<p>This approach complements Mendola.Tech's <a href="/blog/managed-small-business-website-performance-benchmark-2026/">website performance benchmark protocol</a>, which also separates measurement conditions from broader business claims.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://support.google.com/webmasters/answer/17011364" rel="noreferrer">Performance report: About the data</a> — Google Search Console Help; accessed 2026-08-10. Supports data freshness, preliminary/finalized distinctions, and property-versus-page aggregation differences.</li>
<li><a href="https://support.google.com/webmasters/answer/7042828" rel="noreferrer">What are impressions, position, and clicks?</a> — Google Search Console Help; accessed 2026-08-10. Supports the definitions of Search Console clicks, impressions, CTR, and average position, including location/history variability.</li>
<li><a href="https://support.google.com/webmasters/answer/17011259" rel="noreferrer">Performance report dimensions and data groupings</a> — Google Search Console Help; accessed 2026-08-10. Supports anonymized-query, truncation, canonical URL, and aggregation limitations.</li>
<li><a href="https://developers.google.com/webmaster-tools/v1/searchanalytics/query" rel="noreferrer">Search Analytics: query</a> — Google Search Console API; accessed 2026-08-10. Supports explicit date ranges, filters, aggregation type, row limits, and finalized-versus-fresh data requests.</li>
<li><a href="https://support.google.com/analytics/answer/14731736" rel="noreferrer">GA4 user acquisition versus traffic acquisition</a> — Google Analytics Help; accessed 2026-08-10. Supports distinguishing user-scoped acquisition from session-scoped traffic acquisition metrics.</li>
<li><a href="https://docs.dataforseo.com/v3/serp-google-maps-task_post/" rel="noreferrer">Google Maps SERP task parameters</a> — DataForSEO API documentation; accessed 2026-08-10. Supports keyword, coordinate, zoom, location, language, depth, device/OS, and search-area configuration for location-specific Maps results.</li>
<li><a href="https://docs.dataforseo.com/v3/backlinks-overview/" rel="noreferrer">DataForSEO Backlinks API overview</a> — DataForSEO API documentation; accessed 2026-08-10. Supports the live-index scope and separate backlink, referring-domain, history, timeseries, and rank data products.</li>
<li><a href="https://docs.dataforseo.com/v3/databases-backlink_summary/" rel="noreferrer">DataForSEO backlink summary fields</a> — DataForSEO API documentation; accessed 2026-08-10. Supports distinguishing backlinks, referring pages, referring domains, referring main domains, and provider domain rank.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>A GA4 Event Taxonomy for Calls, Texts, and Lead Forms</title>
      <link>https://mendola.tech/blog/service-business-ga4-event-taxonomy/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/service-business-ga4-event-taxonomy/</guid>
      <description>A practical GA4 event dictionary and QA method that separates contact intent, accepted form leads, errors, and downstream outcomes.</description>
      <category>Analytics &amp; Measurement</category>
      <pubDate>Mon, 10 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<blockquote>
<p>Use this guide to define what website contact events mean before relying on them in reports. It does not disclose client analytics, lead volume, conversion rates, call outcomes, or revenue.</p>
</blockquote>
<p>A service-business website usually offers several contact paths: call, text, submit a form, or continue into a separate scheduling or onboarding system. Analytics becomes misleading when every tap is labeled a “lead” or when different websites use different names for the same action.</p>
<p>This reference guide provides a small, implementation-ready event taxonomy for those contact paths. It deliberately separates what the browser can observe from what the business later confirms. That distinction makes reports easier to audit and keeps a click from being presented as a completed conversation, estimate, sale, or customer.</p>
<p>The guide is intended for business owners, website operators, developers, and analysts reviewing a <a href="/managed-website/">managed website</a> or a custom <a href="/services/automation/">automation and integration</a> project.</p>
<h2 id="what-matters-most">What matters most</h2>
<ol>
<li><strong>Contact intent and business outcomes are different measurements.</strong> A <code>tel:</code> link click shows that a visitor activated a phone link. It does not establish that a call connected, that the caller was qualified, or that work was sold. The same boundary applies to text links.</li>
<li><strong>An accepted form response is a stronger website event than a submit-button click.</strong> A useful <code>generate_lead</code> trigger occurs only after client-side validation passes and the receiving endpoint confirms acceptance. Attempt and error events remain separate diagnostics.</li>
<li><strong>Google's recommended lead events can anchor the vocabulary.</strong> GA4 currently recommends <code>generate_lead</code> for submitted requests and provides later-stage events including <code>qualify_lead</code>, <code>working_lead</code>, and <code>close_convert_lead</code>. Those later stages require a documented CRM or offline-data process; the browser should not guess them.</li>
<li><strong>Parameters need a privacy allowlist.</strong> Google prohibits sending personally identifiable information to Analytics. The safe default is operational context such as placement, form ID, service category, and destination host—not names, contact details, message text, or precise coordinates.</li>
<li><strong>A stable contract matters more than a large event catalog.</strong> GA4 event names are case-sensitive, have reserved names and prefixes, and do not retroactively repair old data when renamed. A short reviewed dictionary reduces fragmented reporting.</li>
</ol>
<h2 id="how-to-define-the-events">How to define the events</h2>
<h3 id="question-and-scope">Question and scope</h3>
<p>The design question is narrow: what minimum set of web and downstream events can distinguish contact intent, a form-processing result, and a confirmed business-stage change without overstating what the data proves?</p>
<p>The taxonomy was produced on 2026-08-10 by:</p>
<ol>
<li>Reviewing Google's current recommended lead-generation events, event naming rules, parameter guidance, collection limits, DebugView guidance, and PII restrictions.</li>
<li>Separating browser-observable interactions from server-confirmed states and business-confirmed offline outcomes.</li>
<li>Reducing the catalog to events that change a reporting or QA decision.</li>
<li>Defining a trigger, required context, verification method, and explicit non-claim for each event.</li>
<li>Designing negative tests for duplicate firing, validation errors, endpoint failures, redirects, and unapproved parameters.</li>
</ol>
<p>No real visitor, client, CRM, call-tracking, or advertising data was used. The examples below use generic values and are a template, not recorded performance.</p>
<h3 id="three-evidence-levels">Three evidence levels</h3>
<p>Every event belongs to one evidence level. Reports should preserve the level instead of summing unlike actions into one unlabeled total.</p>
<table>
<thead>
<tr>
<th>Evidence level</th>
<th>What confirms it</th>
<th>Examples</th>
<th>What it does not prove</th>
</tr>
</thead>
<tbody><tr>
<td>Interface interaction</td>
<td>Browser click or focus handler</td>
<td>Phone-link click, text-link click</td>
<td>Connection, conversation, qualification, sale</td>
</tr>
<tr>
<td>System-accepted outcome</td>
<td>Application or API success response</td>
<td>Accepted lead form, onboarding handoff</td>
<td>Human review, lead quality, booked work</td>
</tr>
<tr>
<td>Business-confirmed stage</td>
<td>CRM or reviewed offline workflow</td>
<td>Qualified lead, working lead, closed lead</td>
<td>Causation, profit, or platform attribution alone</td>
</tr>
</tbody></table>
<p>This structure prevents a common reporting error: presenting the most easily counted action as if it were the most valuable confirmed outcome.</p>
<h3 id="event-dictionary-for-calls-texts-and-forms">Event dictionary for calls, texts, and forms</h3>
<p>The dictionary uses lowercase snake case and avoids Google's reserved event names. “GA4 type” distinguishes Google's recommended vocabulary from Mendola.Tech's proposed custom diagnostic events.</p>
<table>
<thead>
<tr>
<th>Event name</th>
<th>GA4 type</th>
<th>Fire exactly when</th>
<th>Approved parameters</th>
<th>Explicit non-claim</th>
</tr>
</thead>
<tbody><tr>
<td><code>click_to_call</code></td>
<td>Custom</td>
<td>A user activates a valid <code>tel:</code> link</td>
<td><code>link_location</code>, <code>service_context</code>, <code>destination_type</code></td>
<td>Does not prove a connected or answered call</td>
</tr>
<tr>
<td><code>click_to_text</code></td>
<td>Custom</td>
<td>A user activates a valid <code>sms:</code> link</td>
<td><code>link_location</code>, <code>service_context</code>, <code>destination_type</code></td>
<td>Does not prove a sent, delivered, or answered message</td>
</tr>
<tr>
<td><code>lead_form_submit_attempt</code></td>
<td>Custom diagnostic</td>
<td>Valid client-side input begins an actual request to the lead endpoint</td>
<td><code>form_id</code>, <code>form_location</code>, <code>service_context</code></td>
<td>Does not prove the endpoint accepted the request</td>
</tr>
<tr>
<td><code>lead_form_error</code></td>
<td>Custom diagnostic</td>
<td>An attempted request ends in a defined validation, network, or API error</td>
<td><code>form_id</code>, <code>form_location</code>, <code>error_class</code>, <code>service_context</code></td>
<td>Does not include raw error or user-entered text</td>
</tr>
<tr>
<td><code>generate_lead</code></td>
<td>Google recommended event</td>
<td>The receiving system confirms it accepted a form or information request</td>
<td><code>form_id</code>, <code>form_location</code>, <code>lead_channel</code>, <code>service_context</code></td>
<td>Does not prove qualification, contact, booking, or sale</td>
</tr>
<tr>
<td><code>onboarding_handoff</code></td>
<td>Custom</td>
<td>A user intentionally continues to an approved external onboarding route</td>
<td><code>link_location</code>, <code>destination_host</code>, <code>workflow_type</code></td>
<td>Does not prove onboarding completion</td>
</tr>
<tr>
<td><code>qualify_lead</code></td>
<td>Google recommended event</td>
<td>A reviewed downstream process marks a lead as meeting defined criteria</td>
<td>Controlled CRM-stage context only</td>
<td>Must not be inferred from a page view or elapsed time</td>
</tr>
<tr>
<td><code>working_lead</code></td>
<td>Google recommended event</td>
<td>A reviewed downstream process records active contact or work on the lead</td>
<td>Controlled CRM-stage context only</td>
<td>Does not prove a proposal, booking, or sale</td>
</tr>
<tr>
<td><code>close_convert_lead</code></td>
<td>Google recommended event</td>
<td>A reviewed downstream process marks the lead converted under its policy</td>
<td>Controlled CRM-stage context only</td>
<td>Does not by itself prove revenue, margin, or causation</td>
</tr>
</tbody></table>
<p>The later-stage recommended events are optional. Do not implement them until the business has written definitions, a reliable source system, access controls, deduplication, and a lawful data flow. A smaller truthful taxonomy is better than a complete-looking funnel assembled from guesses.</p>
<h3 id="parameter-allowlist">Parameter allowlist</h3>
<p>Parameters add context, but they also create privacy and reporting risk. This starter allowlist uses controlled values rather than visitor-entered text.</p>
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Example controlled values</th>
<th>Rule</th>
</tr>
</thead>
<tbody><tr>
<td><code>link_location</code></td>
<td><code>header</code>, <code>service_hero</code>, <code>contact_footer</code></td>
<td>Maintain a documented finite list</td>
</tr>
<tr>
<td><code>form_id</code></td>
<td><code>estimate_request</code>, <code>general_contact</code></td>
<td>Describe the interface, not the person</td>
</tr>
<tr>
<td><code>form_location</code></td>
<td><code>contact_page</code>, <code>service_page</code></td>
<td>Use a stable page role rather than a full URL with queries</td>
</tr>
<tr>
<td><code>lead_channel</code></td>
<td><code>web_form</code>, <code>offline_import</code></td>
<td>State how the record entered the workflow</td>
</tr>
<tr>
<td><code>service_context</code></td>
<td><code>painting</code>, <code>web_maintenance</code>, <code>general</code></td>
<td>Use broad controlled categories</td>
</tr>
<tr>
<td><code>destination_host</code></td>
<td><code>customer.example.com</code></td>
<td>Host only; strip paths and query strings</td>
</tr>
<tr>
<td><code>workflow_type</code></td>
<td><code>estimate</code>, <code>signup</code>, <code>support</code></td>
<td>Describe the workflow, not its contents</td>
</tr>
<tr>
<td><code>error_class</code></td>
<td><code>validation</code>, <code>network</code>, <code>server</code>, <code>rate_limit</code></td>
<td>Coarse diagnostic category; never a raw stack trace</td>
</tr>
<tr>
<td><code>destination_type</code></td>
<td><code>phone</code>, <code>sms</code></td>
<td>Avoid placing the actual phone number in Analytics</td>
</tr>
</tbody></table>
<p>Do not send names, email addresses, phone numbers, street addresses, form messages, CRM record IDs, invoice IDs, raw error messages, uploaded filenames, full redirect URLs, or latitude/longitude coordinates. Query strings and page titles also need review because visitor-entered values can leak into them.</p>
<h3 id="implementation-order">Implementation order</h3>
<p>An accepted lead event should follow the application state, not the visual click:</p>
<pre><code class="language-js">track('lead_form_submit_attempt', safeContext);

const response = await submitLead(approvedPayload);

if (!response.ok) {
  track('lead_form_error', {
    ...safeContext,
    error_class: classifyWithoutUserData(response),
  });
  return;
}

track('generate_lead', {
  ...safeContext,
  lead_channel: 'web_form',
});
</code></pre>
<p><code>track</code> is a placeholder for the site's approved analytics adapter. The example does not include user input in analytics calls. Production code still needs consent handling, retry/idempotency behavior, error boundaries, and a documented definition of an accepted response.</p>
<h3 id="qa-matrix">QA matrix</h3>
<p>Run the matrix in a non-production or clearly labeled test flow. Confirm browser behavior, the application/network result, the outgoing analytics payload, and the GA4 DebugView record separately.</p>
<table>
<thead>
<tr>
<th>Test case</th>
<th>Expected application result</th>
<th>Expected analytics result</th>
</tr>
</thead>
<tbody><tr>
<td>Activate phone link once</td>
<td>Device/browser opens phone handler</td>
<td>One <code>click_to_call</code>; no <code>generate_lead</code></td>
</tr>
<tr>
<td>Activate text link once</td>
<td>Device/browser opens messaging handler</td>
<td>One <code>click_to_text</code>; no <code>generate_lead</code></td>
</tr>
<tr>
<td>Submit invalid form</td>
<td>Validation blocks request</td>
<td>No accepted lead; optional validation diagnostic by policy</td>
</tr>
<tr>
<td>Submit valid form; API accepts</td>
<td>Confirmation state appears</td>
<td>One attempt followed by one <code>generate_lead</code></td>
</tr>
<tr>
<td>Submit valid form; API rejects</td>
<td>Honest error/retry state appears</td>
<td>One attempt and one coarse error; no <code>generate_lead</code></td>
</tr>
<tr>
<td>Double-click submit during request</td>
<td>Duplicate request is prevented</td>
<td>At most one accepted lead event for the accepted request</td>
</tr>
<tr>
<td>Refresh confirmation page</td>
<td>No new lead is created</td>
<td>No duplicate <code>generate_lead</code></td>
</tr>
<tr>
<td>Continue to external onboarding</td>
<td>Approved destination loads</td>
<td>One handoff; no onboarding-complete event</td>
</tr>
<tr>
<td>Inspect all payload parameters</td>
<td>No application change</td>
<td>Only approved keys and controlled values; no PII or message text</td>
</tr>
<tr>
<td>Disable or deny analytics by policy</td>
<td>Contact path still works</td>
<td>Site honors the applicable consent/configuration behavior</td>
</tr>
</tbody></table>
<p>Save the test date, site/build version, browser, device class, consent state, analytics property/environment, and result for every row. A screenshot of DebugView alone is insufficient if it cannot be tied to the triggering application state.</p>
<h3 id="reporting-rules">Reporting rules</h3>
<ul>
<li>Label phone and text actions as <strong>contact-link clicks</strong>, not calls or leads.</li>
<li>Label <code>generate_lead</code> as <strong>accepted information requests</strong> under the written trigger definition.</li>
<li>Report attempts and errors as operational diagnostics, not acquisition success.</li>
<li>Do not add events from different evidence levels into a single “total leads” figure without showing the components and deduplication rule.</li>
<li>If offline lead stages are imported, record the source system, stage definition, import delay, deduplication key, and correction policy.</li>
<li>Preserve event-definition changes with effective dates. Renaming an event does not rewrite historical collection.</li>
<li>Re-run the negative tests after changes to forms, tag configuration, routers, redirects, consent controls, or external onboarding links.</li>
</ul>
<h2 id="what-the-event-plan-cannot-prove">What the event plan cannot prove</h2>
<ul>
<li>This is a reference design, not a result from a representative sample of service-business websites.</li>
<li>A browser click cannot establish what happened in a phone or messaging application after the handoff.</li>
<li>A successful HTTP response must be defined carefully. A <code>200</code> response that silently discards a request is not meaningful acceptance.</li>
<li>GA4 DebugView and Realtime are implementation checks, not proof that every report, audience, or advertising integration is configured correctly.</li>
<li>Browser privacy controls, consent choices, extensions, network failures, and tag blockers can prevent collection even when the business action succeeds.</li>
<li>Offline events can be delayed, corrected, duplicated, or mapped differently by a CRM. Their governance is outside this web-only template.</li>
<li>Google can change recommended events, reserved names, limits, reports, and policy requirements. Recheck the linked documentation before implementation.</li>
<li>Privacy and consent obligations vary by jurisdiction, data flow, and business. This guide is technical and does not provide legal advice.</li>
<li>The taxonomy does not prove attribution, advertising incrementality, lead quality, booking rate, revenue, or return on investment.</li>
</ul>
<h2 id="put-the-event-plan-into-practice">Put the event plan into practice</h2>
<p>The evidence-level model keeps event names, success conditions, privacy-safe parameters, reporting limits, and negative test cases in one clear measurement plan.</p>
<p>Most event lists stop at “track calls and forms.” This template makes the boundary inspectable: contact-link clicks remain intent signals, the application confirms accepted requests, and people or controlled business systems confirm later lead stages. The same contract can be used during website development, analytics QA, reporting review, and future automation work without changing the meaning of historical events.</p>
<p>For related implementation examples, see Mendola.Tech's <a href="/work/">engineering work and case studies</a> and the <a href="/blog/">guides library</a>.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://support.google.com/analytics/answer/9267735" rel="noreferrer">GA4 recommended events</a> — Google Analytics Help; accessed 2026-08-10. Supports the current recommended lead-generation event vocabulary and DebugView verification guidance.</li>
<li><a href="https://support.google.com/analytics/answer/13316687" rel="noreferrer">GA4 event naming rules</a> — Google Analytics Help; accessed 2026-08-10. Supports case sensitivity, allowed characters, and reserved event names and prefixes.</li>
<li><a href="https://support.google.com/analytics/answer/13675006" rel="noreferrer">GA4 event parameters</a> — Google Analytics Help; accessed 2026-08-10. Supports using parameters as contextual key-value data and distinguishing collection from report dimensions and metrics.</li>
<li><a href="https://support.google.com/analytics/answer/9267744" rel="noreferrer">Event collection limits</a> — Google Analytics Help; accessed 2026-08-10. Supports the current event-name and parameter collection limits that constrain a taxonomy.</li>
<li><a href="https://support.google.com/analytics/answer/6366371" rel="noreferrer">Best practices to avoid sending personally identifiable information</a> — Google Analytics Help; accessed 2026-08-10. Supports excluding contact details, visitor-entered PII, sensitive URL values, and fine-grained location data from Analytics.</li>
<li><a href="https://support.google.com/analytics/answer/10085872" rel="noreferrer">Rename and generate new events</a> — Google Analytics Help; accessed 2026-08-10. Supports the warning that event changes do not apply retroactively and the need to avoid duplicate names.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>2026 Small-Business Website Performance Benchmark: What Will Be Measured</title>
      <link>https://mendola.tech/blog/managed-small-business-website-performance-benchmark-2026/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/managed-small-business-website-performance-benchmark-2026/</guid>
      <description>A practical measurement plan for comparing small-business website performance without mixing lab scores, field data, and unsupported conclusions.</description>
      <category>Research &amp; Benchmarks</category>
      <pubDate>Sun, 09 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<blockquote>
<p>This planned benchmark explains how managed small-business websites will be compared before any results are available. No performance measurements have been collected yet, and the tables say “pending” so readers are not asked to treat a plan as a result.</p>
</blockquote>
<p>Small-business website performance comparisons often collapse several different questions into one score. A lab run can help debug a page under simulated conditions. Chrome User Experience Report data summarizes eligible real-user experiences over a rolling period. A conversion report describes what visitors did after arriving. Those are all useful, but they are not interchangeable.</p>
<p>This study is designed to answer a narrower question: under a documented, repeatable protocol, how do a set of actively managed small-business websites behave across common page types on mobile and desktop, and which implementation characteristics explain the largest differences?</p>
<p>The goal is not to declare a universal “fastest platform.” The goal is to publish a dataset, repeatable collection method, and interpretation guide that a business owner or web operator can use to ask better questions about performance.</p>
<h2 id="what-matters-most">What matters most</h2>
<p>This is a pre-results draft, so the current findings concern measurement quality rather than site winners and losers:</p>
<ol>
<li><strong>A single lab score is not enough.</strong> Google documents that PageSpeed Insights includes both lab and field data, that they represent different conditions, and that datacenter/network conditions can vary. The study will use repeated lab runs and will not average lab and field metrics together.</li>
<li><strong>Core Web Vitals need percentile and population context.</strong> The “good” thresholds apply at the 75th percentile of real visits. A green lab score cannot prove that the 75th percentile of real users has a good experience.</li>
<li><strong>The unit of comparison must be defined.</strong> Comparing one homepage with another site's contact page would confound page purpose, content weight, and interaction design. This protocol groups like page types and reports each URL separately.</li>
<li><strong>Public pages are not automatically approved case-study material.</strong> Client names and site-level commentary will remain unpublished unless Rob records approval. If approval is not granted, the public article will use anonymized site identifiers or a Mendola.Tech-owned test fixture.</li>
</ol>
<p>No claim about relative speed, conversion impact, or business outcome will be added until the raw runs exist and the limitations are reviewed.</p>
<h2 id="how-the-benchmark-works">How the benchmark works</h2>
<h3 id="research-questions">Research questions</h3>
<p>The first release will answer five questions:</p>
<ol>
<li>What are the median mobile and desktop lab measurements for each tested URL?</li>
<li>How much does the same URL vary across repeated runs?</li>
<li>Which pages have eligible CrUX field data, and what does that field data show separately from the lab runs?</li>
<li>Which observable page characteristics—HTML size, JavaScript transfer, image transfer, request count, font loading, or third-party scripts—coincide with the largest lab differences?</li>
<li>Which recurring implementation changes appear most actionable for small-business sites?</li>
</ol>
<p>The study will not claim that performance caused a ranking, lead, or revenue change. Those would require different data and a stronger causal design.</p>
<h3 id="proposed-sample">Proposed sample</h3>
<p>The current Mendola.Tech public site lists six managed deployments. They are a logical operational sample because their architectures and maintenance context can be documented. Their inclusion in a named benchmark is still subject to approval.</p>
<table>
<thead>
<tr>
<th>Proposed site</th>
<th>Publicly listed service type</th>
<th>Benchmark inclusion status</th>
</tr>
</thead>
<tbody><tr>
<td>Camo Krew Aluminum</td>
<td>Managed website</td>
<td>Approval not yet recorded</td>
</tr>
<tr>
<td>A Able Painting Company</td>
<td>Managed website</td>
<td>Approval not yet recorded</td>
</tr>
<tr>
<td>Kaines Construction LLC</td>
<td>Managed website</td>
<td>Approval not yet recorded</td>
</tr>
<tr>
<td>Southern Drywall Services</td>
<td>Managed website</td>
<td>Approval not yet recorded</td>
</tr>
<tr>
<td>Mendola Painting</td>
<td>Managed website</td>
<td>Approval not yet recorded</td>
</tr>
<tr>
<td>You'll Hook 'Em</td>
<td>Managed website</td>
<td>Approval not yet recorded</td>
</tr>
</tbody></table>
<p>If one or more clients do not approve named inclusion, the study will either anonymize the identifiers or replace the sample with controlled, Mendola.Tech-owned fixtures. It will not quietly remove weak performers after seeing their results.</p>
<h3 id="page-selection">Page selection</h3>
<p>For each included site, select up to three canonical URLs that represent comparable user intent:</p>
<ul>
<li>Homepage</li>
<li>Primary service page</li>
<li>Contact or estimate page</li>
</ul>
<p>Record the exact canonical URL, HTTP status, test date, and any redirect. Exclude a URL only for a pre-registered reason such as an outage, access block, active deployment, or missing comparable page type. Keep an exclusion log.</p>
<h3 id="collection-protocol">Collection protocol</h3>
<p>For every URL and device profile:</p>
<ol>
<li>Confirm the canonical URL and final HTTP status.</li>
<li>Record the deployment/commit identifier when Mendola.Tech controls the code.</li>
<li>Run five PageSpeed Insights lab tests for mobile and five for desktop across at least two collection sessions.</li>
<li>Preserve the raw JSON response for every run rather than copying only the headline score.</li>
<li>Record Lighthouse version, test timestamp, strategy, reported location/environment, and category configuration.</li>
<li>Extract performance score, Largest Contentful Paint (LCP), Cumulative Layout Shift (CLS), Total Blocking Time (TBT), Speed Index, First Contentful Paint (FCP), and Time to First Byte (TTFB) where present.</li>
<li>Extract transfer size, request count, unused JavaScript diagnostics, and image-delivery diagnostics where available.</li>
<li>Record CrUX URL-level or origin-level field data separately, including whether the URL had sufficient eligible data.</li>
</ol>
<p>The primary lab statistic will be the median of the five runs. The dataset will also report minimum, maximum, and range so readers can see instability. A mean may be included as a secondary value, but it will not replace the individual runs.</p>
<h3 id="performance-thresholds">Performance thresholds</h3>
<p>The article will use Google's documented Core Web Vitals definitions and “good” thresholds on the final test date:</p>
<table>
<thead>
<tr>
<th>Field metric</th>
<th>Current “good” threshold to verify on test date</th>
<th>Interpretation</th>
</tr>
</thead>
<tbody><tr>
<td>LCP</td>
<td>At or below 2.5 seconds</td>
<td>Loading experience</td>
</tr>
<tr>
<td>INP</td>
<td>At or below 200 milliseconds</td>
<td>Interaction responsiveness</td>
</tr>
<tr>
<td>CLS</td>
<td>At or below 0.1</td>
<td>Visual stability</td>
</tr>
</tbody></table>
<p>These thresholds are evaluated at the 75th percentile in field data. Lighthouse's TBT is a lab diagnostic and will not be relabeled as field INP.</p>
<h3 id="results-will-be-added-after-measurements-are-complete">Results will be added after measurements are complete</h3>
<table>
<thead>
<tr>
<th>Site ID</th>
<th>Page type</th>
<th>Device</th>
<th>Median performance score</th>
<th>Median LCP</th>
<th>Median CLS</th>
<th>Median TBT</th>
<th>Field-data status</th>
</tr>
</thead>
<tbody><tr>
<td>Pending</td>
<td>Pending</td>
<td>Mobile</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not checked</td>
</tr>
<tr>
<td>Pending</td>
<td>Pending</td>
<td>Desktop</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not checked</td>
</tr>
</tbody></table>
<p>When measurements are complete, this guide will provide machine-readable CSV/JSON, raw reports, the collection script, a data dictionary, and the exclusion log. The supporting repository will include a command that can rerun the same checks against another URL list.</p>
<h3 id="interpretation-rules">Interpretation rules</h3>
<ul>
<li>Describe the measured URL and date, not an entire company or platform.</li>
<li>Use “in these runs” rather than turning a sample result into a universal claim.</li>
<li>Treat differences smaller than normal run-to-run variation cautiously.</li>
<li>Explain large payloads in context. A portfolio page with original photography serves a different job than a sparse contact page.</li>
<li>Separate implementation observations from causal claims.</li>
<li>Do not infer search ranking, conversion rate, or revenue from performance data alone.</li>
<li>If a live deployment changes during collection, rerun the affected set or document the version split.</li>
</ul>
<h2 id="what-the-benchmark-can-reveal">What the benchmark can reveal</h2>
<p>The most useful output is not a leaderboard. It is a pattern library. Examples of potentially actionable patterns include oversized hero images, render-blocking fonts, excessive third-party scripts, client-side rendering that delays primary content, missing intrinsic image dimensions, and slow server response.</p>
<p>Those remain candidate explanations until the measurements are collected. The final analysis will connect each observation to the raw diagnostic that supports it and, when practical, rerun the URL after a controlled fix.</p>
<h2 id="what-the-benchmark-cannot-prove">What the benchmark cannot prove</h2>
<ul>
<li>The proposed sample is a convenience sample of sites associated with one operator, not a representative sample of all small-business websites.</li>
<li>PageSpeed/Lighthouse lab results vary with test infrastructure, network conditions, page state, and tool versions.</li>
<li>CrUX field data may be unavailable for lower-traffic URLs and represents eligible Chrome users rather than all visitors.</li>
<li>Page types and content requirements are not perfectly identical across businesses.</li>
<li>A cross-sectional test cannot show long-term maintenance drift.</li>
<li>Performance measurements do not establish search, lead, or revenue outcomes.</li>
<li>A client's name and comparison results should appear only with approval, even when the pages and metrics are publicly observable.</li>
<li>The thresholds and tooling can change; any results must record versions and recheck documentation on the run date.</li>
</ul>
<h2 id="put-the-benchmark-into-practice">Put the benchmark into practice</h2>
<p>Useful benchmark results need operating context: multiple small-business page types, repeated runs instead of cherry-picked screenshots, a clear separation between field and lab data, version and date records, and notes about the implementation being measured.</p>
<p>The collection process and results template can also be applied to a business's own URL list. Mendola.Tech can help run that comparison, explain the most important findings, and turn confirmed performance problems into a prioritized improvement plan.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://web.dev/articles/defining-core-web-vitals-thresholds" rel="noreferrer">How the Core Web Vitals thresholds were defined</a> — Google/web.dev; accessed 2026-08-09. Supports the LCP, INP, and CLS thresholds and the 75th-percentile interpretation.</li>
<li><a href="https://developers.google.com/speed/docs/insights/v5/about" rel="noreferrer">About PageSpeed Insights</a> — Google for Developers; accessed 2026-08-09. Supports the distinction between lab and field data, the CrUX time window, and test-environment variability.</li>
<li><a href="https://web.dev/articles/vitals-tools" rel="noreferrer">Core Web Vitals workflows with Google tools</a> — Google/web.dev; accessed 2026-08-09. Supports separating field monitoring from lab diagnostics and using the tools for different stages of performance work.</li>
<li><a href="https://web.dev/articles/vitals" rel="noreferrer">Web Vitals</a> — Google/web.dev; accessed 2026-08-09. Supports the current stable Core Web Vitals set and metric lifecycle.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>AI Document Workflow Reliability: What Businesses Should Test Before Automation</title>
      <link>https://mendola.tech/blog/ai-document-workflow-reliability-benchmark/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/ai-document-workflow-reliability-benchmark/</guid>
      <description>A reproducible benchmark for AI-assisted document extraction that measures correctness, abstention, review burden, latency, cost, and safe failure.</description>
      <category>AI &amp; Automation</category>
      <pubDate>Sun, 09 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<blockquote>
<p>This planned benchmark explains how an AI-assisted document workflow should be tested before a business relies on it. No model has been selected and no results have been measured. The test data will be synthetic, and the model versions, prompts, code, outputs, prices, and dates will be recorded when testing begins.</p>
</blockquote>
<p>An AI document workflow can look excellent in a demo and still create more work than it removes. The model may extract most fields correctly while confidently corrupting a small number of consequential values. It may succeed on clean PDFs and fail on rotated photos. It may produce valid JSON while assigning a phone number to the wrong record. It may appear inexpensive per request while creating an expensive review queue.</p>
<p>This benchmark evaluates the complete document-to-record workflow: input handling, extraction, validation, abstention, human escalation, correction, and recovery. The initial task is intentionally narrow enough to reproduce with synthetic data.</p>
<h2 id="what-matters-most">What matters most</h2>
<p>The current findings are methodological and will remain separate from future measured results:</p>
<ol>
<li><strong>Aggregate accuracy is not a deployment decision.</strong> A workflow needs field-level correctness, consequential-error rates, abstention behavior, latency, cost, and human-review burden.</li>
<li><strong>The validator is part of the system.</strong> Schema checks, date/amount constraints, identifier patterns, duplicate detection, and cross-field rules can catch failures that a model-level score hides.</li>
<li><strong>Safe failure needs a measurable definition.</strong> “Human in the loop” is too vague. The benchmark must report which documents are escalated, how often bad records pass automatically, and how many correct records are needlessly reviewed.</li>
<li><strong>Synthetic data protects clients but narrows generalization.</strong> The first release can be open and privacy-safe, but it cannot prove performance on every real document distribution.</li>
</ol>
<p>No model ranking, accuracy percentage, price, or time saving will appear until the frozen harness has produced raw output.</p>
<h2 id="how-the-benchmark-works">How the benchmark works</h2>
<h3 id="task-definition">Task definition</h3>
<p>The proposed workflow converts a mixed-format small-business intake document into a structured record with these fields:</p>
<ul>
<li>Document type</li>
<li>Organization/person name</li>
<li>Email address</li>
<li>Phone number</li>
<li>Service or request category</li>
<li>Request date</li>
<li>Currency amount when present</li>
<li>Free-text summary</li>
<li>Source document identifier</li>
<li>Extraction confidence or abstention state</li>
</ul>
<p>The exact schema will be published as JSON Schema. Every output must either validate against it or enter an explicit failure state. The system may not silently drop an input.</p>
<h3 id="proposed-dataset">Proposed dataset</h3>
<p>Create 300 synthetic documents with deterministic ground-truth JSON records. No client or real-person data will be used.</p>
<table>
<thead>
<tr>
<th>Stratum</th>
<th>Proposed count</th>
<th>Purpose</th>
</tr>
</thead>
<tbody><tr>
<td>Clean digitally generated PDF</td>
<td>60</td>
<td>Establish baseline extraction behavior</td>
</tr>
<tr>
<td>Scanned PDF with moderate noise</td>
<td>60</td>
<td>Test OCR and layout degradation</td>
</tr>
<tr>
<td>Mobile photo with rotation/perspective</td>
<td>60</td>
<td>Test common field-capture conditions</td>
</tr>
<tr>
<td>Email-style plain text/HTML</td>
<td>60</td>
<td>Test less structured but machine-readable input</td>
</tr>
<tr>
<td>Adversarial/ambiguous cases</td>
<td>60</td>
<td>Test missing fields, conflicting values, prompt-like text, and malformed layouts</td>
</tr>
</tbody></table>
<p>The generator will vary names, phone formats, dates, currency formatting, field order, optional fields, duplicate documents, and plausible distractor values. Random generation will use a published seed so the corpus can be recreated.</p>
<p>The adversarial stratum is not a cybersecurity penetration test. It is a reliability set containing ambiguity and instruction-like document text that should not override the extraction task.</p>
<h3 id="systems-under-test">Systems under test</h3>
<p>The initial study may compare:</p>
<ul>
<li>A rules-only baseline</li>
<li>One or more current multimodal language-model APIs</li>
<li>A hybrid workflow using OCR/rules before a language model</li>
<li>The same model with and without deterministic validation/retry logic</li>
</ul>
<p>Final systems will be selected immediately before collection because models and pricing change. The article will record provider, exact model identifier, API version, region if relevant, request parameters, prompt/template hash, structured-output mode, retry policy, and public price source on the test date.</p>
<p>No provider will be described as the “best AI model.” The result applies to this task, corpus, configuration, and date.</p>
<h3 id="run-controls">Run controls</h3>
<ol>
<li>Freeze the dataset, ground truth, schema, scorer, and primary metrics before running models.</li>
<li>Use a clean API session and the same input representation for comparable systems.</li>
<li>Set deterministic parameters where the API supports them and record unsupported controls.</li>
<li>Run each document once for the primary cost/latency analysis.</li>
<li>Run a pre-registered stability subset multiple times to measure output variation.</li>
<li>Preserve raw requests/responses after removing credentials and provider-restricted data.</li>
<li>Log retries, timeouts, schema failures, refusals, and provider errors.</li>
<li>Price each run from measured token/image usage and the provider's dated public price—not from memory.</li>
<li>Manually review scorer disagreements before final aggregation without changing ground truth after seeing a model label.</li>
</ol>
<h3 id="primary-metrics">Primary metrics</h3>
<h4>Field exact-match accuracy</h4>
<p>For normalized fields such as phone, email, date, amount, and category:</p>
<pre><code class="language-text">fieldAccuracy = correct extracted fields / scorable ground-truth fields
</code></pre>
<p>Normalization rules are published in advance. For example, phone formatting punctuation may be ignored while digits and extension must match.</p>
<h4>Record perfect-match rate</h4>
<pre><code class="language-text">recordPerfectMatch = records with every required field correct / all records
</code></pre>
<p>This deliberately produces a stricter view than field-level accuracy.</p>
<h4>Undetected consequential error rate</h4>
<p>Define consequential fields before testing—for example identity, contact destination, date, and currency amount.</p>
<pre><code class="language-text">undetectedConsequentialError = bad consequential records accepted automatically
                               / records accepted automatically
</code></pre>
<p>This is the primary safety metric for an auto-entry decision. A workflow that escalates every record could have a low undetected-error rate while providing no automation value, so it must be read with review burden.</p>
<h4>Review burden</h4>
<pre><code class="language-text">reviewRate = records sent to human review / all records
falseReviewRate = fully correct records sent to review / fully correct records
</code></pre>
<p>The final artifact will also time a defined review procedure on a sample. It will not invent universal wage savings.</p>
<h4>Abstention quality</h4>
<p>Treat an explicit “cannot determine” or validation failure as abstention. Report:</p>
<ul>
<li>Recall of bad records into review</li>
<li>Precision of the review queue</li>
<li>Coverage: percentage accepted automatically</li>
<li>Risk-coverage curve as the confidence/review threshold changes</li>
</ul>
<h4>Latency and cost</h4>
<p>Report median, 95th percentile, minimum, and maximum end-to-end latency. Report measured API cost per document and per 1,000 documents for this corpus and date. Keep provider pricing inputs visible so the calculator can be updated.</p>
<h3 id="acceptance-scenarios">Acceptance scenarios</h3>
<p>Instead of one arbitrary pass/fail line, publish three user-editable scenarios:</p>
<table>
<thead>
<tr>
<th>Scenario</th>
<th>Consequential error tolerance</th>
<th>Review capacity</th>
<th>Intended use</th>
</tr>
</thead>
<tbody><tr>
<td>Draft assistance</td>
<td>User reviews every record</td>
<td>High</td>
<td>Summarization/data-entry aid</td>
</tr>
<tr>
<td>Guarded automation</td>
<td>Only flagged records reviewed</td>
<td>Medium</td>
<td>Low-risk operational intake</td>
</tr>
<tr>
<td>High-consequence workflow</td>
<td>Near-zero undetected error required</td>
<td>Variable</td>
<td>Not approved by this benchmark alone</td>
</tr>
</tbody></table>
<p>The benchmark will not certify a high-consequence deployment. It shows the tradeoff curve and the evidence a decision-maker would still need.</p>
<h3 id="results-will-be-added-after-testing-is-complete">Results will be added after testing is complete</h3>
<table>
<thead>
<tr>
<th>System</th>
<th>Field accuracy</th>
<th>Perfect records</th>
<th>Undetected consequential error</th>
<th>Review rate</th>
<th>Median latency</th>
<th>Cost/1,000</th>
</tr>
</thead>
<tbody><tr>
<td>Rules baseline</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
</tr>
<tr>
<td>AI workflow A</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
</tr>
<tr>
<td>Hybrid workflow</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
<td>Not measured</td>
</tr>
</tbody></table>
<p>Every aggregate will be accompanied by a breakdown for each input stratum. A strong clean-PDF result must not conceal failure on mobile photos or ambiguous documents.</p>
<h2 id="operational-decision-framework">Operational decision framework</h2>
<p>After results exist, a business can use four gates:</p>
<ol>
<li><strong>Validity:</strong> Does the workflow produce the required schema and preserve every input?</li>
<li><strong>Reliability:</strong> At the chosen automation coverage, is the undetected consequential-error rate acceptable for this task?</li>
<li><strong>Operability:</strong> Can the business handle the review queue, outages, retries, corrections, and audit records?</li>
<li><strong>Economics:</strong> Using its own labor inputs, does the measured review burden plus API/tooling cost improve the current process?</li>
</ol>
<p>Passing the first three gates does not prove the fourth. The companion calculator will use measured review minutes and user-entered labor values rather than claiming a universal ROI.</p>
<h2 id="what-the-benchmark-cannot-prove">What the benchmark cannot prove</h2>
<ul>
<li>Synthetic documents cannot represent every real layout, handwriting style, language, domain vocabulary, fraud pattern, or image condition.</li>
<li>A 300-document corpus may be too small to estimate rare failure rates precisely.</li>
<li>Model APIs, hidden system behavior, prices, and availability can change after the test date.</li>
<li>Repeated API calls may not be deterministic even when temperature or seed controls are available.</li>
<li>The benchmark measures one extraction workflow, not general reasoning ability.</li>
<li>The defined “consequential” fields reflect the proposed task and must change for other business processes.</li>
<li>A validator can catch malformed or implausible values but cannot guarantee that a plausible value belongs to the correct real-world entity.</li>
<li>Privacy, retention, contractual, legal, and sector-specific requirements are outside the benchmark and need separate review.</li>
<li>The study cannot authorize fully automatic use in financial, legal, medical, employment, safety, or other high-consequence decisions.</li>
</ul>
<h2 id="put-the-benchmark-into-practice">Put the benchmark into practice</h2>
<p>A useful AI evaluation needs an end-to-end reliability test built around business decisions rather than a model-demo score. That includes synthetic test documents, correct-answer records, a required output schema, recorded prompts and configurations where permitted, scoring rules, validation, and a clear threshold for human review.</p>
<p>AI is only one component in an automation system. API integration, schema validation, retries, human escalation, auditability, and failure recovery should be tested alongside the model response because those are the parts that determine whether the workflow can actually be operated. Mendola.Tech can help design and test that complete process before it reaches real customer documents.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://www.nist.gov/itl/ai-risk-management-framework" rel="noreferrer">NIST AI Risk Management Framework</a> — National Institute of Standards and Technology; accessed 2026-08-09. Supports lifecycle risk management and incorporating trustworthiness into AI design, use, and evaluation.</li>
<li><a href="https://airc.nist.gov/" rel="noreferrer">NIST AI Resource Center</a> — NIST; accessed 2026-08-09. Supports testing, evaluation, verification, and validation as operational AI practices.</li>
<li><a href="https://airc.nist.gov/airmf-resources/airmf/5-sec-core/" rel="noreferrer">NIST AI RMF Core</a> — NIST; accessed 2026-08-09. Supports repeatable/documented evaluation, reliability validation, limitation documentation, safe failure, monitoring, and contextual interpretation.</li>
<li><a href="https://nvlpubs.nist.gov/nistpubs/ai/NIST.AI.600-1.pdf" rel="noreferrer">Artificial Intelligence Risk Management Framework: Generative Artificial Intelligence Profile</a> — NIST AI 600-1; accessed 2026-08-09. Supports applying risk-management actions to generative-AI systems based on context, requirements, and risk tolerance.</li>
<li><a href="https://airc.nist.gov/airmf-resources/airmf/4-effectiveness/" rel="noreferrer">Effectiveness of the AI RMF</a> — NIST AI Resource Center; accessed 2026-08-09. Supports evaluating whether processes, indicators, measurements, and expected outcomes actually improve AI risk management.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>How to Calculate Small-Business Website Total Cost of Ownership</title>
      <link>https://mendola.tech/blog/small-business-website-total-cost-of-ownership-calculator/</link>
      <guid isPermaLink="true">https://mendola.tech/blog/small-business-website-total-cost-of-ownership-calculator/</guid>
      <description>A transparent five-year website cost model that separates launch price, recurring tools, labor, maintenance, measurement, and recovery readiness.</description>
      <category>Technology Operations</category>
      <pubDate>Sun, 09 Aug 2026 12:00:00 GMT</pubDate>
      <dc:creator>Rob Mendola</dc:creator>
      <content:encoded><![CDATA[<blockquote>
<p>Use this formula and worksheet to compare website operating responsibilities and costs with your own numbers. It does not claim a market-average price, client savings, or guaranteed return on investment.</p>
</blockquote>
<p>“How much does a small-business website cost?” is usually answered with a launch quote or a monthly plan. Neither number is useful on its own if the decision spans several years.</p>
<p>A website has to be created or migrated, hosted, secured, updated, measured, corrected, and recovered when something breaks. Someone also has to write changes, resize photos, answer provider questions, check forms, monitor search visibility, and decide what happens when the original builder is no longer available.</p>
<p>This calculator turns those responsibilities into visible inputs. It does not assume that a managed service is always cheaper than a one-time build or do-it-yourself platform. It makes the break-even conditions inspectable.</p>
<h2 id="what-matters-most">What matters most</h2>
<ol>
<li><strong>Launch cost and operating cost should be compared over the same period.</strong> A low initial price can coexist with high internal labor. A larger project can be economical when a business already has someone capable of operating the site. The calculator keeps those cases separate.</li>
<li><strong>Labor is a first-class input.</strong> Content changes, vendor coordination, troubleshooting, measurement, and routine checks consume time whether the work is done by an owner, employee, freelancer, or managed provider.</li>
<li><strong>Maintenance and recovery are not optional line items just because they are omitted from a quote.</strong> Software updates, access controls, backups, and recovery preparation are real operating responsibilities. The model records who owns them and what budget is assigned.</li>
<li><strong>No default can represent every business honestly.</strong> The published calculator should open with blank or clearly labeled illustrative inputs, never with an unexplained “industry average.”</li>
</ol>
<h2 id="how-the-calculator-works">How the calculator works</h2>
<h3 id="model-objective">Model objective</h3>
<p>The calculator compares website operating models over a user-selected horizon using the same responsibility categories. It is a planning model, not a survey of market prices.</p>
<p>The default horizon proposed for the interface is five years because it is long enough to expose recurring labor and rebuild assumptions. Users can change the horizon from one to ten years.</p>
<h3 id="core-formula">Core formula</h3>
<p>For a horizon of <code>Y</code> years:</p>
<pre><code class="language-text">TCO(Y) = Initial + Recurring(Y) + InternalLabor(Y) + PlannedChanges(Y)
       + Measurement(Y) + MaintenanceAndRecovery(Y) + Transition(Y)
</code></pre>
<p>Where:</p>
<pre><code class="language-text">Recurring(Y) = 12 × Y × monthly recurring fees

InternalLabor(Y) = Y × 52 × weekly internal hours × loaded hourly value

PlannedChanges(Y) = Y × annual planned change budget

Measurement(Y) = Y × annual analytics, reporting, and testing cost

MaintenanceAndRecovery(Y) = Y × annual maintenance, monitoring, backup,
                            and recovery-readiness cost

Transition(Y) = expected migration, rebuild, or provider-change cost
                within the selected horizon
</code></pre>
<p>The model does not add speculative “lost revenue from downtime” by default. A business can add a separate risk scenario, but it must enter its own downtime assumption and value rather than receiving a dramatic invented number.</p>
<h3 id="input-worksheet">Input worksheet</h3>
<table>
<thead>
<tr>
<th>Input</th>
<th>Definition</th>
<th>Unit</th>
<th>Evidence to use</th>
</tr>
</thead>
<tbody><tr>
<td>Initial design/build/setup</td>
<td>One-time cost to launch or migrate</td>
<td>Currency</td>
<td>Quote, invoice, or internal estimate</td>
</tr>
<tr>
<td>Monthly platform/provider fees</td>
<td>Hosting, builder, plugins, support, or managed plan</td>
<td>Currency/month</td>
<td>Current vendor pricing or contract</td>
</tr>
<tr>
<td>Weekly internal hours</td>
<td>Owner/employee time operating the site</td>
<td>Hours/week</td>
<td>Time log or conservative estimate</td>
</tr>
<tr>
<td>Loaded hourly value</td>
<td>Cost/value of the internal person's time</td>
<td>Currency/hour</td>
<td>Business-defined input</td>
</tr>
<tr>
<td>Planned change budget</td>
<td>Larger content, design, or feature work not covered elsewhere</td>
<td>Currency/year</td>
<td>Historical invoices or plan</td>
</tr>
<tr>
<td>Analytics/testing cost</td>
<td>Reporting tools, event implementation, experiments</td>
<td>Currency/year</td>
<td>Current tools and scoped labor</td>
</tr>
<tr>
<td>Maintenance/recovery cost</td>
<td>Updates, monitoring, backups, security basics, recovery drills</td>
<td>Currency/year</td>
<td>Contract or implementation plan</td>
</tr>
<tr>
<td>Transition cost</td>
<td>Migration/rebuild/provider handoff expected in horizon</td>
<td>Currency</td>
<td>Quote or scenario estimate</td>
</tr>
<tr>
<td>Included responsibility flags</td>
<td>Which costs are already included in another input</td>
<td>Yes/no</td>
<td>Scope document</td>
</tr>
</tbody></table>
<p>The interface must prevent double counting. For example, if hosting and routine maintenance are included in a managed monthly plan, the user marks those responsibility rows as included rather than entering them again.</p>
<h3 id="operating-models">Operating models</h3>
<p>The calculator will provide blank comparison columns for:</p>
<ul>
<li>Do it yourself</li>
<li>One-time build with internal operation</li>
<li>Project-based freelancer</li>
<li>Agency retainer</li>
<li>Mendola.Tech managed website</li>
<li>Custom model</li>
</ul>
<p>These labels do not carry hidden cost assumptions. Users enter the actual quote or operating record for each option. Mendola.Tech's current public price may be prefilled only if it is pulled from the same repository source used by the pricing page and dated in the result.</p>
<h3 id="responsibility-matrix">Responsibility matrix</h3>
<p>A cost comparison is incomplete unless it also shows ownership. The downloadable worksheet will require an owner for each responsibility:</p>
<table>
<thead>
<tr>
<th>Responsibility</th>
<th>Business</th>
<th>Builder/provider</th>
<th>Separate vendor</th>
<th>Unassigned</th>
</tr>
</thead>
<tbody><tr>
<td>Domain and DNS access</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Hosting and TLS</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Routine content updates</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Software/dependency updates</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Monitoring and broken-form checks</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Backups and recovery</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Technical/on-page SEO</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Local listings and reputation workflow</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Analytics and lead-event QA</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Accessibility checks</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Provider transition/runbook</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody></table>
<p>An “unassigned” responsibility is not automatically converted to money. It appears as an operating gap next to the TCO result.</p>
<h3 id="output-metrics">Output metrics</h3>
<p>The calculator will produce:</p>
<ul>
<li>Total cost over the selected horizon</li>
<li>Equivalent monthly cost over that horizon</li>
<li>Initial cash requirement</li>
<li>Recurring cash fees</li>
<li>Internal labor hours and modeled value</li>
<li>Percentage of total assigned to labor, tools/provider fees, planned changes, and resilience</li>
<li>Count of unassigned responsibilities</li>
<li>Break-even point between two selected models, when one exists</li>
<li>A print/download summary containing all inputs, formulas, scope flags, and calculation date</li>
</ul>
<h3 id="break-even-formula">Break-even formula</h3>
<p>For two models with initial costs <code>I₁</code> and <code>I₂</code> and monthly operating costs <code>M₁</code> and <code>M₂</code>, the simple cash break-even month is:</p>
<pre><code class="language-text">breakEvenMonth = (I₂ - I₁) / (M₁ - M₂)
</code></pre>
<p>This is shown only when the denominator is non-zero and the result is positive. The full calculator also includes internal labor and annual costs converted to a monthly equivalent. It will label the result as a planning estimate, not a guaranteed saving.</p>
<h2 id="how-to-use-the-result">How to use the result</h2>
<p>The lowest TCO is not automatically the best decision. A business may deliberately pay more for faster support, less owner time, clearer accountability, stronger recovery preparation, or access to deeper engineering. Another business may prefer a low-cash DIY model because the owner enjoys the work and already has the skill.</p>
<p>Use the result to ask four questions:</p>
<ol>
<li>Which responsibilities are actually included?</li>
<li>Whose time is being consumed?</li>
<li>What happens after the launch period?</li>
<li>What happens when the site breaks or the provider relationship ends?</li>
</ol>
<p>The calculator is successful if it makes those tradeoffs visible, even when the user chooses a competitor or a DIY option.</p>
<h2 id="what-the-calculator-cannot-prove">What the calculator cannot prove</h2>
<ul>
<li>This is a deterministic planning model, not a forecast of leads, rankings, revenue, or business growth.</li>
<li>User-entered labor value and time estimates can dominate the result and may be uncertain.</li>
<li>Taxes, financing, inflation, discounts, and time value of money are excluded from the simple version.</li>
<li>Complex e-commerce, regulated systems, custom applications, and paid campaigns need separate models.</li>
<li>Recovery and security costs do not guarantee that an incident will be prevented or successfully resolved.</li>
<li>Vendor prices and Mendola.Tech scope can change; every saved result must include its calculation date.</li>
<li>The model does not assign universal market-average prices because no single average fits scope, geography, platform, or service level.</li>
</ul>
<h2 id="put-the-calculator-into-practice">Put the calculator into practice</h2>
<p>This responsibility-based calculator reflects how websites are actually operated. Instead of hiding assumptions or announcing a predetermined winner, it shows the formula, lets you change every value, flags double counting, and identifies operational work that no one owns.</p>
<p>The responsibility matrix comes from the overlap between website development, ongoing web operations, SEO/local visibility, analytics, infrastructure, and direct support in the Mendola.Tech service. The same worksheet can be used to evaluate Mendola.Tech, an agency, a freelancer, a builder platform, or an internal team.</p>
<h2 id="official-references">Official references</h2>
<ul>
<li><a href="https://www.cisa.gov/small-and-medium-sized-business-resources" rel="noreferrer">Small and Medium-Sized Business Resources</a> — U.S. Cybersecurity and Infrastructure Security Agency; accessed 2026-08-09. Supports treating software updates, account security, and resilience as operational responsibilities rather than optional marketing features.</li>
<li><a href="https://www.cisa.gov/sites/default/files/publications/CISA%20Insights_Guidance-for-MSPs-and-Small-and-Mid-sized-Businesses_S508C.pdf" rel="noreferrer">Mitigations and Hardening Guidance for MSPs and Small- and Mid-sized Businesses</a> — CISA; accessed 2026-08-09. Supports including backups, access control, and provider/customer responsibility in the operating model.</li>
<li><a href="https://www.w3.org/WAI/WCAG22/quickref/" rel="noreferrer">Web Content Accessibility Guidelines (WCAG) 2.2 Quick Reference</a> — W3C Web Accessibility Initiative; accessed 2026-08-09. Supports accessibility as an ongoing quality responsibility rather than a purely visual launch task.</li>
<li><a href="https://developers.google.com/search/docs/fundamentals/seo-starter-guide" rel="noreferrer">SEO Starter Guide</a> — Google Search Central; accessed 2026-08-09. Supports the inclusion of crawlable structure, useful content, and ongoing search-quality work in the responsibility map.</li>
<li><a href="https://developers.google.com/speed/docs/insights/v5/about" rel="noreferrer">About PageSpeed Insights</a> — Google for Developers; accessed 2026-08-09. Supports separating measurement/diagnostics from unsupported guarantees about real-user outcomes.</li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>