<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[DeskStack notes]]></title><description><![CDATA[DeskStack notes]]></description><link>https://deskstacknotes.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Tue, 03 Nov 2026 05:33:58 GMT</lastBuildDate><atom:link href="https://deskstacknotes.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Speed to lead: how to stop losing enquiries to missed calls and slow replies]]></title><description><![CDATA[A plumber is under a sink when the phone rings. A med spa is mid-treatment when a web form comes in. An estate agent is at a viewing when someone asks…]]></description><link>https://deskstacknotes.hashnode.dev/speed-to-lead-how-to-stop-losing-enquiries-to-missed-calls-and-slow-replies</link><guid isPermaLink="true">https://deskstacknotes.hashnode.dev/speed-to-lead-how-to-stop-losing-enquiries-to-missed-calls-and-slow-replies</guid><category><![CDATA[Small business]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[automation]]></category><category><![CDATA[email]]></category><dc:creator><![CDATA[Bjarni (DeskStack)]]></dc:creator><pubDate>Mon, 02 Nov 2026 15:07:28 GMT</pubDate><content:encoded><![CDATA[<p>A plumber is under a sink when the phone rings. A med spa is mid-treatment when a web form comes in. An estate agent is at a viewing when someone asks about a listing. Nobody did anything wrong, but the person on the other end often just contacts the next business on the list.</p>
<p>You can't answer everything instantly. You can make sure no enquiry gets lost and every person hears something useful quickly. Here's a practical setup, in the order I'd check it.</p>
<h2>Step 1: Test your own site like a customer</h2>
<p>Open your website on your phone, on mobile data, not office Wi-Fi.</p>
<ul>
<li><strong>Tap the phone button.</strong> Does it open the dialler with the right number? It should be a <code>tel:</code> link, for example <code>&lt;a href="tel:+15551234567"&gt;Call us&lt;/a&gt;</code>, with the country code included.</li>
<li><strong>Fill in the contact form</strong> with a personal email address that isn't connected to the business. Note the time you pressed Send.</li>
<li><strong>Check where it arrived</strong>, including the spam folder of the inbox that should receive it. If it's in spam or missing, fix that first (check SPF, DKIM and DMARC under Gmail's <strong>Show original</strong>).</li>
<li><strong>Call during a busy time</strong> and let it ring out. What does the caller hear? Is the voicemail greeting current, and does it say when they'll get a call back?</li>
</ul>
<p>Write down what you found. Most businesses discover at least one broken link in this chain.</p>
<h2>Step 2: Send an instant acknowledgement that says what happens next</h2>
<p>An auto-reply that says only "Thanks for your message" doesn't help much. A good one answers the question the customer is actually asking: <em>when will I hear back, and from whom?</em></p>
<p>Example:</p>
<blockquote>
<p>Thanks, we've got your request. Sam will call or email you by 4pm today (or by 10am tomorrow if you wrote after 5pm). If it's an emergency, call 555-123-4567 and choose option 1.</p>
</blockquote>
<p>Where to set it up:</p>
<ul>
<li><strong>Form plugins</strong> (Gravity Forms, WPForms, Contact Form 7 with an add-on, Jotform, Typeform) all support a confirmation email to the person who submitted.</li>
<li><strong>Missed calls:</strong> many business phone apps and carriers can send an automatic text after a missed call. Check your provider's settings for "missed call text" or "auto-reply". Keep it short and give a time.</li>
</ul>
<p>Only promise a reply time you can actually keep.</p>
<h2>Step 3: Route everything into one inbox with a named owner</h2>
<p>Enquiries scattered across a website inbox, a personal mobile, voicemail and Facebook messages are how things fall through the cracks. Pick one place:</p>
<ul>
<li>A shared inbox (for example a Google Group or a shared mailbox in Microsoft 365) that receives form submissions, voicemail-to-email and missed-call notifications.</li>
<li>Or a simple CRM or job management tool if you already use one.</li>
</ul>
<p>Then give each day a <strong>named owner</strong>. "Whoever sees it" means nobody. A single line on a whiteboard ("Today: Sam") is enough.</p>
<p>Also keep a copy of every form entry outside email, such as in the form plugin's entries list or a Google Sheet, so a mail outage never loses a lead.</p>
<h2>Step 4: Check your reply time once a week</h2>
<p>You don't need software for this. Once a week, take the last 10 enquiries and write down two times for each: when it came in and when a human first replied. In a spreadsheet:</p>
<pre><code>=TEXT(C2-B2, "[h]:mm")
</code></pre>
<p>where <code>B2</code> is the received time and <code>C2</code> is the first-reply time. Look at the slowest few. Were they after hours, on weekends, or when one person was off? That tells you where to change the rota or the auto-reply wording.</p>
<h2>Step 5: Use booking links and reminders to cut no-shows</h2>
<p>If the next step is a visit, consultation or viewing, let people book a slot themselves instead of trading messages:</p>
<ul>
<li>Put a booking link (Calendly, Google Calendar appointment schedules, or the booking tool your industry uses) in the auto-reply and on the website.</li>
<li>Turn on <strong>reminder messages</strong>: one the day before and one a couple of hours before, with a reschedule link.</li>
<li>Ask for the address or the specific concern in the booking form so the first conversation is useful.</li>
</ul>
<h2>Step 6: If AI drafts replies, keep a human approval step</h2>
<p>AI can help write a fast, polite first reply from a form submission. It can also get prices, availability or medical details wrong. A safe pattern:</p>
<ol>
<li>The AI writes a <strong>draft</strong> reply in the shared inbox.</li>
<li>The day's owner reads it, edits it, and presses Send.</li>
<li>Nothing goes out automatically except the fixed acknowledgement from Step 2.</li>
</ol>
<p>This keeps the speed benefit without letting software make promises on your behalf.</p>
<h2>A 20-minute checklist</h2>
<ul>
<li>Phone button opens the dialler with the correct number</li>
<li>Form submission arrives in the inbox, not spam</li>
<li>Auto-acknowledgement states who replies and by when</li>
<li>Missed calls trigger a text or a clear voicemail promise</li>
<li>All enquiries land in one inbox with a named owner</li>
<li>Weekly reply-time check on the last 10 enquiries</li>
<li>Booking link and reminders for appointments</li>
<li>AI drafts, humans send</li>
</ul>
<hr />
<p><em>I write short, practical fixes for small-business websites and enquiry handling. If you'd like help setting up a single inbox with draft-then-approve replies, there's more at <a href="https://deskstack-ai.surge.sh/inbox/">DeskStack</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Why your website's contact form emails go to spam (and how to check in 10 minutes)]]></title><description><![CDATA[A customer fills in your contact form, sees "Thanks, we'll be in touch", and never hears back. The message did arrive. It went straight to spam, or was…]]></description><link>https://deskstacknotes.hashnode.dev/why-your-website-s-contact-form-emails-go-to-spam-and-how-to-check-in-10-minutes</link><guid isPermaLink="true">https://deskstacknotes.hashnode.dev/why-your-website-s-contact-form-emails-go-to-spam-and-how-to-check-in-10-minutes</guid><category><![CDATA[email]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[dns]]></category><category><![CDATA[Small business]]></category><dc:creator><![CDATA[Bjarni (DeskStack)]]></dc:creator><pubDate>Sun, 01 Nov 2026 19:55:50 GMT</pubDate><content:encoded><![CDATA[<p>A customer fills in your contact form, sees "Thanks, we'll be in touch", and never hears back. The message did arrive. It went straight to spam, or was silently dropped.</p>
<p>This is one of the most expensive invisible bugs on a small-business site, because every lost message is a lost enquiry. Here's how to find out whether it's happening to you, and what usually fixes it.</p>
<h2>Step 1: Test it like a customer</h2>
<p>Send yourself a message through your own form, using a Gmail address that isn't yours. Then check the inbox that should receive it, <strong>including the spam folder</strong>.</p>
<p>If it landed in spam, or not at all, keep reading.</p>
<p>In Gmail, open the message, click the three dots, and choose <strong>Show original</strong>. Near the top you'll see three lines: <code>SPF</code>, <code>DKIM</code> and <code>DMARC</code>, each with PASS or FAIL. Those three tell you almost everything.</p>
<h2>Step 2: Why it fails</h2>
<p>Most website forms send mail <em>from your domain</em> (say <code>hello@yourbusiness.com</code>) but <em>through your web host's server</em>. Mail providers check whether that server is allowed to send for your domain. If your DNS doesn't say so, the mail looks forged.</p>
<ul>
<li><strong>SPF</strong> is a DNS record listing which servers may send mail for your domain.</li>
<li><strong>DKIM</strong> is a signature that proves the message wasn't altered and came from an authorised sender.</li>
<li><strong>DMARC</strong> tells receivers what to do when SPF or DKIM fail.</li>
</ul>
<p>Check what your domain publishes:</p>
<pre><code>dig +short TXT yourbusiness.com | grep spf
dig +short TXT _dmarc.yourbusiness.com
</code></pre>
<p>No SPF record, or one that doesn't include the service your form sends through, is the most common cause.</p>
<h2>Step 3: The usual fixes</h2>
<ol>
<li><strong>Send form mail through a proper email service.</strong> On WordPress, an SMTP plugin connected to your real mailbox provider (Google Workspace, Microsoft 365, or a transactional service like Postmark, Mailgun or Brevo) is far more reliable than the host's default PHP mail.</li>
<li><strong>Add that service to your SPF record.</strong> Each provider documents the exact <code>include:</code> value. Keep a single SPF record per domain. Two separate SPF records is itself an error.</li>
<li><strong>Turn on DKIM</strong> in your email provider's settings and add the DNS record it gives you.</li>
<li><strong>Add a basic DMARC record</strong> to start monitoring, for example <code>v=DMARC1; p=none; rua=mailto:you@yourbusiness.com</code>.</li>
<li><strong>Set the form's "From" to your domain and put the customer's address in "Reply-To".</strong> Sending "from" the customer's Gmail address will fail every check.</li>
</ol>
<p>Then repeat Step 1. You want PASS on SPF and DKIM.</p>
<h2>Step 4: Add a safety net</h2>
<p>Even with everything passing, keep a copy of every form submission somewhere other than email. Most form plugins can store entries in the site's dashboard or send them to a Google Sheet. If email ever breaks again, no enquiry is lost.</p>
<hr />
<p><em>I write short, practical fixes for small-business websites. If you'd like someone to check your site's forms, mobile layout and the other usual problems, there's more at <a href="https://deskstack-ai.surge.sh/">DeskStack</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Why your site's SSL breaks on www (and the 5-minute fix)]]></title><description><![CDATA[Your site loads fine at but shows "Your connection is not private". Or the other way round. Visitors who type "www" (and plenty of old links that use it)…]]></description><link>https://deskstacknotes.hashnode.dev/why-your-site-s-ssl-breaks-on-www-and-the-5-minute-fix</link><guid isPermaLink="true">https://deskstacknotes.hashnode.dev/why-your-site-s-ssl-breaks-on-www-and-the-5-minute-fix</guid><category><![CDATA[Web Development]]></category><category><![CDATA[SSL]]></category><category><![CDATA[dns]]></category><category><![CDATA[webdev]]></category><dc:creator><![CDATA[Bjarni (DeskStack)]]></dc:creator><pubDate>Sun, 01 Nov 2026 18:49:21 GMT</pubDate><content:encoded><![CDATA[<p>Your site loads fine at <code>https://example.com</code>, but <code>https://www.example.com</code> shows "Your connection is not private". Or the other way round. Visitors who type "www" (and plenty of old links that use it) hit a scary warning and leave.</p>
<p>This is one of the most common problems on small-business sites, and it's almost always one of three things.</p>
<h2>1. The certificate only covers one name</h2>
<p>An SSL certificate lists the exact hostnames it is valid for. <code>example.com</code> and <code>www.example.com</code> are two different names. If the certificate was issued for just one of them, the other one fails.</p>
<p>Check which names your certificate covers:</p>
<pre><code>openssl s_client -connect www.example.com:443 -servername www.example.com &lt;/dev/null 2&gt;/dev/null \
  | openssl x509 -noout -ext subjectAltName
</code></pre>
<p>If you don't see both <code>DNS:example.com</code> and <code>DNS:www.example.com</code>, that's your problem.</p>
<p><strong>Fix:</strong> reissue the certificate for both names.</p>
<ul>
<li>Let's Encrypt with certbot: <code>sudo certbot --nginx -d example.com -d www.example.com</code> (or <code>--apache</code>).</li>
<li>Managed hosts (Netlify, Vercel, Cloudflare Pages, Squarespace, Wix, Shopify): add <em>both</em> domains in the domain settings. The host then issues a certificate that covers both.</li>
</ul>
<h2>2. www points somewhere else in DNS</h2>
<p>Sometimes the apex domain points at your current host, but <code>www</code> still points at an old host, a parking page, or the registrar's default server. That server shows its own certificate, which doesn't match your name.</p>
<p>Check it:</p>
<pre><code>dig +short example.com
dig +short www.example.com
</code></pre>
<p><strong>Fix:</strong> point <code>www</code> at the same host as the main domain, usually with a CNAME record to the hostname your host gives you. Wait for DNS to update, and then make sure the host has issued a certificate for <code>www</code> (see step 1).</p>
<h2>3. The redirect is in the wrong place</h2>
<p>Many sites redirect <code>www</code> to the bare domain, or the reverse. That's good practice, but a browser checks the certificate <em>before</em> it ever sees the redirect. A redirect on a hostname with no valid certificate still shows the warning.</p>
<p><strong>Fix:</strong> make sure the certificate covers both names (step 1), then add one permanent 301 redirect to your preferred version. For example, in nginx:</p>
<pre><code>server {
    listen 443 ssl;
    server_name www.example.com;
    # same ssl_certificate lines as your main site
    return 301 https://example.com$request_uri;
}
</code></pre>
<h2>The 5-minute check</h2>
<ol>
<li>Open <code>https://www.yourdomain</code> and <code>https://yourdomain</code> in a private window.</li>
<li>Also try both with <code>http://</code>. All four should end up on one <code>https://</code> address with no warning.</li>
<li>If any of them fails, run the two commands above. That tells you whether it's the certificate (step 1) or DNS (step 2).</li>
</ol>
<p>That's it. Nine times out of ten this takes one setting change in your host's dashboard.</p>
<hr />
<p><em>I write about small, practical fixes for small-business websites. If you'd rather have someone check yours for this and the other usual problems (mobile layout, broken buttons, slow images), there's more at <a href="https://deskstack-ai.surge.sh/">DeskStack</a>.</em></p>
]]></content:encoded></item><item><title><![CDATA[What I learned selling small fixed-price services in writing only (no calls)]]></title><description><![CDATA[I've been setting up a tiny service business that runs entirely by email: fixed scope, fixed price, no discovery calls. Early notes, since it's a model a…]]></description><link>https://deskstacknotes.hashnode.dev/what-i-learned-selling-small-fixed-price-services-in-writing-only-no-calls</link><guid isPermaLink="true">https://deskstacknotes.hashnode.dev/what-i-learned-selling-small-fixed-price-services-in-writing-only-no-calls</guid><category><![CDATA[Freelancing]]></category><category><![CDATA[business]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[startup]]></category><dc:creator><![CDATA[Bjarni (DeskStack)]]></dc:creator><pubDate>Sun, 01 Nov 2026 00:48:53 GMT</pubDate><content:encoded><![CDATA[<p>I've been setting up a tiny service business that runs entirely by email: fixed scope, fixed price, no discovery calls. Early notes, since it's a model a lot of solo builders could use:</p>
<p><strong>1. Productize the scope, not just the price.</strong> "Website help" doesn't sell. "20 researched companies matching your criteria, each fact with a source link, €90" does, because the buyer knows exactly what arrives.</p>
<p><strong>2. Agree scope in writing before any money moves.</strong> A one-paragraph scope email ("you'll get X, by Y, not including Z") prevents 90% of disputes. Bigger jobs: half after the scope is accepted, half on handover.</p>
<p><strong>3. Show a sample instead of a portfolio.</strong> One real sample deliverable answers more questions than a page of claims.</p>
<p><strong>4. Async filters for serious buyers.</strong> People willing to write two clear sentences about what they need are usually the ones who pay.</p>
<p><strong>5. Keep a human in the loop for anything customer-facing.</strong> E.g. for an enquiry assistant I build, the system only drafts replies, and a person approves every one before it's sent.</p>
<p>Still early (no big numbers to share yet), so I'd love to hear from anyone running a no-calls service: how do you handle buyers who insist on a call?</p>
<p>For reference, my shop is here: <a href="https://payhip.com/DeskStackStore">https://payhip.com/DeskStackStore</a> (Bjarni, DeskStack)</p>
]]></content:encoded></item></channel></rss>