// blog.jsx, Purna Web blog (data + components)
// Body type taxonomy: p | h2 | h3 | ul | ol | callout | quote

const BLOG_POSTS = [
  {
    slug: "why-your-website-isnt-getting-you-clients-and-what-actually-works-for-therapists-coaches",
    title: "Why your website isn't getting you clients (and what actually works for therapists & coaches)",
    publishDate: "2026-02-13",
    updatedDate: "2026-02-13",
    category: "Conversion",
    readingMinutes: 8,
    author: "Purna Web team",
    heroImage: "images/hero-healthcare.png",
    excerpt: "Most therapist and coach sites lose inquiries in the same three places. Fix the headline, the trust placement, and the form, and qualified inquiries lift 30–60% in 30 days.",
    tldr: "Most therapist and coach websites lose clients in three predictable places: a headline that doesn't say who you help, a booking flow that asks for too much before earning trust, and missing proof at the exact moment someone decides to inquire. Fixing those three, without a full redesign, typically lifts qualified inquiries 30–60% inside 30 days.",
    keyTakeaways: [
      "A 'who-you-help, what-changes' headline above the fold beats any clever brand line.",
      "Trust signals belong next to the CTA, not on a separate Reviews page.",
      "The booking form should ask for the smallest set of fields that lets you reply.",
      "Add an AI chat agent if your phone goes unanswered more than once a week.",
      "Audit your site like a lead, not a designer, open it on cellular data, on a phone you don't own.",
    ],
    body: [
      { type: "h2", text: "Your homepage isn't the problem. Your homepage's first sentence is." },
      { type: "p", text: "The single most common bug we see on therapist and coach sites isn't slow load time, ugly fonts, or weak SEO. It's the first sentence. Visitors land, scan for two seconds, and ask one question silently: \"Is this person for me?\" If your headline reads like a tagline, \"Healing journeys, reimagined\", they leave. If it reads like a label, \"Trauma-informed therapy for high-achieving women in their 30s\", they keep reading." },
      { type: "p", text: "The fix is simpler than people think. Replace your hero headline with the answer to two stacked questions: who do you help, and what changes for them after they work with you? That's it. You don't need a brand line above it. You don't need a hero video. You need clarity." },
      { type: "p", text: "Most coaches argue the brand line \"tells our story.\" It doesn't. A name on the door tells your story. The headline is for the visitor, not for you." },

      { type: "h2", text: "Why the \"Schedule a Discovery Call\" button doesn't get clicked" },
      { type: "p", text: "You wrote a great offer. You put it behind a button. The button says \"Schedule a Discovery Call.\" Almost no one clicks. Why?" },
      { type: "p", text: "Because the button is asking for a 30-minute commitment from someone who hasn't yet decided you're worth a 30-second commitment. There's a hidden ladder of micro-yeses every visitor needs to climb before they pick up the phone, and most websites skip the bottom rungs entirely." },
      { type: "p", text: "A useful framing: every CTA should match the temperature of the visitor. Cold visitors need low-friction next steps, read a guide, take a self-assessment, watch a 90-second video. Warm visitors get medium friction, download a worksheet, opt into an email series. Only hot visitors, who've consumed your content and read your reviews, are ready for a call. If your only CTA is \"book a call,\" you're throwing 90% of your traffic away." },

      { type: "h2", text: "Where to put trust, and where most sites get it wrong" },
      { type: "p", text: "Open most therapist sites and you'll find the testimonials on a page called Reviews. Open that page and you'll find six glowing quotes. Then click the back button and try to find a single one of those quotes anywhere near the booking button. They're not there." },
      { type: "p", text: "This is backwards. Trust signals don't work in isolation, they work at the moment of doubt. The moment of doubt is the moment your visitor's finger hovers over the Book button. Move at least one specific, named, situation-specific testimonial to within 200 pixels of every CTA. The conversion lift is usually larger than any other single change you can make." },
      { type: "p", text: "\"Specific\" is the operative word. \"Sarah is amazing!\" doesn't move anyone. \"I'd done six months of therapy elsewhere and felt stuck. After 8 sessions with Sarah, I'd named the pattern I was repeating with my mother. My anxiety attacks are now monthly instead of daily., Lauren, school principal, Toronto\" moves people." },

      { type: "h2", text: "The booking form that's quietly killing your conversions" },
      { type: "p", text: "Most therapist booking forms ask for: name, email, phone, preferred date, preferred time, insurance details, presenting issue, how you found us, additional notes. Nine fields. Each field cuts your conversion rate by roughly 4–7%. You're asking for a 35% discount on your inbound flow before you've earned a reply." },
      { type: "p", text: "The form you actually need has three fields: name, email, and \"what's going on?\" That's enough for you to write a thoughtful reply that includes a calendar link. You can collect insurance details and intake information after they've said yes, not before." },
      { type: "p", text: "If you're worried about tire-kickers, your filter shouldn't be the form, it should be your reply. Reply quickly with a question that requires real engagement. Tire-kickers don't reply. Real prospects do, and now you have a conversation instead of a form submission." },

      { type: "callout", title: "Try this in 30 minutes", text: "Open your homepage on cellular data, on a phone that isn't yours. Time how long until the page is usable. Read the headline out loud. Find the booking button without scrolling more than once. If any of those takes more than 5 seconds, you've found your first fix." },

      { type: "h2", text: "Where AI fits, without making you sound like a chatbot" },
      { type: "p", text: "Therapists and coaches are right to be cautious about AI on their site. The wrong implementation reads as cold and brand-damaging. The right implementation looks like a junior assistant who never sleeps, never goes on vacation, and never sounds robotic, because they were trained on how you actually answer first-touch questions." },
      { type: "p", text: "A well-tuned AI chat agent does three useful things on a coaching or therapy site. It answers the same five questions you've answered a thousand times, fees, sliding scale, in-person vs. virtual, your modality, whether you take a particular insurance. It captures contact details for visitors who'd never fill out a form but will type a question. And it offers a calendar slot to people who are ready, while triaging emergency wording to a human escalation path." },
      { type: "p", text: "What it shouldn't do is pretend to be you. Make sure your agent introduces itself as an assistant, hands off cleanly when asked, and never offers a clinical opinion. That distinction is the difference between an asset and a liability." },

      { type: "h2", text: "A 30-day fix list that actually moves the number" },
      { type: "p", text: "If you do nothing else this month, do these in order. Each takes under an hour. Together they typically move qualified inquiries up 30–60% with no traffic change." },
      { type: "ol", items: [
        "Rewrite your hero headline as a who-you-help, what-changes statement.",
        "Add one specific, named testimonial within 200 pixels of every CTA.",
        "Cut your booking form to three fields.",
        "Add a soft CTA (free guide, self-assessment, or short video) for cold visitors.",
        "Audit your site on cellular data on a phone you don't own. Fix anything that takes longer than 5 seconds to be usable.",
      ]},
      { type: "p", text: "That's the work. None of it requires a new website. None of it requires a designer. All of it works." },
    ],
    faq: [
      { q: "How long does this take to show results?", a: "Conversion fixes show inside 7–14 days in your inquiry inbox. Traffic-side changes (SEO, content) take 60–90 days. Start with conversion, it's faster, cheaper, and the lift compounds with whatever traffic you already have." },
      { q: "I'm a solo therapist with no marketing budget. Where do I start?", a: "Headline rewrite, testimonial placement, and form trim. All three are free, and together account for most of the lift you'd see from a paid project." },
      { q: "Should I add a chat agent to my therapy site?", a: "Yes if you regularly miss calls or your contact form sits unanswered for more than 4 hours. No if you can already reply in under an hour during business hours and your booking flow already converts well. The chat agent's job is to close the gap when you can't be there." },
      { q: "My site looks dated. Should I redesign?", a: "Probably not yet. Visitors care about clarity, speed, and trust, not whether your hero is on-trend. A clear, fast, trust-rich 2018-style site converts better than a beautiful 2026 site that buries the offer. Redesign for clarity, not for novelty." },
    ],
  },

  {
    slug: "stop-chasing-clients-content-marketing-for-coaches-that-does-the-heavy-lifting-for-your-business",
    title: "Stop chasing clients: content marketing for coaches that does the heavy lifting",
    publishDate: "2026-01-23",
    updatedDate: "2026-01-23",
    category: "Content",
    readingMinutes: 9,
    author: "Purna Web team",
    heroImage: "images/hero-professional-services.png",
    excerpt: "Cold DMs are dead. The replacement isn't more content, it's a small library of evergreen, decision-stage answers that compound in Google AND get cited by ChatGPT, Perplexity, and Gemini.",
    tldr: "Cold outreach has collapsed in conversion across coaching. The replacement isn't more content, it's a small library of evergreen, decision-stage answers that compound in Google search AND get cited by ChatGPT, Perplexity, Gemini, and Claude. Three pillar posts beat 30 thin ones.",
    keyTakeaways: [
      "The number of posts you publish doesn't matter. The depth of answers does.",
      "Write for the question your buyer types when they're ready to pay, not the question they ask when they're curious.",
      "AEO (answer-engine optimization) is the new SEO, structure your posts as answers, not articles.",
      "Three pillar pieces with FAQ schema outperform a year of weekly thin posts.",
      "Repurpose every pillar piece into 6 social assets and 1 email sequence, once, then forever.",
    ],
    body: [
      { type: "h2", text: "Why DMs and cold outreach stopped working" },
      { type: "p", text: "Five years ago a coach could send 50 cold DMs a day, book three discovery calls, and close one client a week. Today the same script gets ignored, marked as spam, or quietly throttled by the platform. The behavior didn't change because coaches got worse at writing DMs. It changed because everyone is doing it, AI made personalization look fake, and the platforms now penalize accounts that send too many similar messages." },
      { type: "p", text: "Outbound isn't dead, it's just no longer asymmetric. To make it work today you need a researcher, a writer, a sender, and a CRM, and you'll still get sub-1% reply rates. For a solo coach that math doesn't pencil." },
      { type: "p", text: "The asymmetric channel now is content that compounds, published once, indexed forever, cited in answer engines, and shared by your existing clients to people they think it'll help. The work is heavier upfront and lighter for the rest of the year." },

      { type: "h2", text: "The myth of \"more content\"" },
      { type: "p", text: "The most common content advice given to coaches is also the most damaging: post every day, build a system, stay consistent. What this produces is a feed full of generic motivational quotes, recycled tips, and posts that look identical to every other coach in your niche. Volume is a hedge against having nothing to say. It is not a strategy." },
      { type: "p", text: "What actually works is the opposite: publish less, but make each piece a definitive answer to a question your buyer is asking at the moment they're ready to spend money. One 2,500-word essay on \"how to choose a leadership coach when your CEO has lost the room\" outperforms a quarter's worth of daily posts on \"3 morning habits of confident leaders.\"" },
      { type: "p", text: "The reason is simple. The first piece gets read by exactly the people who are about to hire someone. The second gets liked by other coaches." },

      { type: "h2", text: "Decision-stage content vs. curiosity-stage content" },
      { type: "p", text: "Buyers read three different kinds of content over the course of a hire. Awareness content (\"is this even a problem?\"), evaluation content (\"what kinds of solutions exist?\"), and decision content (\"who do I hire and how do I know they're right?\"). Most coaches publish almost exclusively in the first category. The money is in the third." },
      { type: "p", text: "Decision content looks like: comparison frameworks, pricing transparency, what-to-expect-in-the-first-90-days, real client transformations with the messy parts left in, and the questions you wish people would ask before they hire you. It's the content other coaches won't write because it requires admitting trade-offs and naming who you don't work with. That's exactly what makes it convert." },

      { type: "h2", text: "Answer-engine optimization (AEO): the channel that didn't exist 18 months ago" },
      { type: "p", text: "When someone asks ChatGPT, Perplexity, Gemini, or Claude \"what's the difference between a life coach and a therapist?\" or \"how do I find a leadership coach for a CEO,\" the answer is assembled from web content the engine has read. Your content can be the source it cites, or the answer can come from somebody else's article that took your spot." },
      { type: "p", text: "AEO is the discipline of writing pages that answer engines find easy to lift from. The mechanics are concrete:" },
      { type: "ul", items: [
        "Open every piece with a 2–3 sentence direct answer to the post's question. Don't tease.",
        "Use H2 headings phrased as the question someone would actually type or speak.",
        "Embed a structured FAQ at the bottom, this is the section LLMs cite most often.",
        "Use specific numbers, named examples, and dated claims. LLMs penalize vague hedging.",
        "Add Article + FAQPage schema to your HTML. Both Google and answer engines read it.",
      ]},
      { type: "p", text: "We've watched coach clients go from zero answer-engine citations to being the named source for their primary buying question inside 90 days, by retrofitting four existing posts to the AEO pattern. No new content. Just restructured." },

      { type: "h2", text: "The pillar-and-cluster system that outperforms a year of weekly posts" },
      { type: "p", text: "If you have time to write four serious essays a year, here's the leverage that beats weekly posting." },
      { type: "ol", items: [
        "Pick four buying questions your best clients asked in the 30 days before they hired you. Not curiosity questions, buying questions.",
        "Write a 2,000–3,000 word pillar piece for each. Answer-first, scannable, with named examples and specific numbers.",
        "For each pillar, write 4–6 short cluster posts that answer adjacent sub-questions and link back to the pillar.",
        "Repurpose each pillar into 6 social posts, one email sequence, and one short video.",
        "Update the pillar every 6 months with new examples. Date the update at the top.",
      ]},
      { type: "p", text: "That's 4 pillars + 20 cluster posts + 24 social posts + 4 email sequences + 4 videos a year. About 30 hours of focused writing. It will outperform a daily-posting coach within 9 months and keep compounding indefinitely after that." },

      { type: "callout", title: "The simplest way to find your four pillar questions", text: "Look at your last 20 client emails before they signed. Not your sales calls, the messages they sent before the call. The questions in those emails are your pillars. They're already validated by the fact that the people who asked them paid you." },

      { type: "h2", text: "Distribution without the algorithm chase" },
      { type: "p", text: "A pillar that nobody reads is just an essay in a drawer. Distribution doesn't require playing algorithm games, it requires three durable channels:" },
      { type: "p", text: "Search and answer engines. With AEO baked in, this is the slow-cooker channel. It takes 60–90 days to start, then compounds for years. Most of your leads in year two will come from this." },
      { type: "p", text: "Your email list. Send each pillar to your list with a short note about why you wrote it. Old subscribers reply with thanks. New subscribers see what you actually believe. Both produce inbound." },
      { type: "p", text: "Your existing clients. People who've worked with you have an exact picture of who else you can help. A pillar piece is something they can forward without it feeling like a sales pitch. Ask explicitly: \"if this would help someone you know, please send it.\" Most won't. Some will. That's how the best clients arrive." },

      { type: "h2", text: "How to know it's working before the leads start" },
      { type: "p", text: "Content marketing's hardest part is the gap between writing and revenue. Six months can pass before the first inquiry attributable to a pillar piece. During that gap you'll be tempted to abandon the strategy. Don't." },
      { type: "p", text: "Track these leading indicators instead, and you'll see the engine warming up before any leads arrive: search-console impressions on the pillar's primary query (rises by week 6), citations in answer engines (test monthly with the exact buying question), referral traffic from your client emails, and time-on-page above 4 minutes (proves the content is being read, not just clicked)." },
      { type: "p", text: "When all four are trending up, leads are 30–60 days behind. The system is working." },
    ],
    faq: [
      { q: "How often should I publish?", a: "Quality over cadence. Four serious pillar pieces a year plus 20 cluster posts beats a weekly publishing schedule of thin content. If you must commit to a cadence, commit to one new piece per month and 3 updates of existing pieces per month." },
      { q: "Do I need to be on social media?", a: "Not as a primary channel. Social is a distribution layer for content you've already written, not a content strategy itself. If you don't enjoy social, repurpose pillars into 6 posts each and schedule them, that's enough." },
      { q: "What's the difference between SEO and AEO?", a: "SEO optimizes for ranking on a Google results page. AEO optimizes for being cited inside an answer the AI gives directly. Both matter. AEO requires answer-first structure, FAQ schema, and concrete numbers, habits that also help SEO. So doing AEO well gets you both." },
      { q: "Can AI write the content for me?", a: "Use AI for outlining, editing, and repurposing. Don't use it for the first draft of a pillar piece. The thing that makes pillars convert is the specific point of view and named examples only you have. AI flattens both." },
    ],
  },

  {
    slug: "why-your-landing-page-isnt-converting-a-practical-guide-to-higher-conversion-rates",
    title: "Why landing pages fail silently, and what high-converting pages do differently",
    publishDate: "2026-01-16",
    updatedDate: "2026-01-16",
    category: "Conversion",
    readingMinutes: 8,
    author: "Purna Web team",
    heroImage: "images/landing-page.html",
    excerpt: "A landing page rarely 'breaks.' It just doesn't convert, and you don't notice for weeks. Five silent failures cost the most, each fixable in under an hour.",
    tldr: "A landing page rarely \"breaks.\" It just doesn't convert, and you don't notice for weeks while traffic and ad spend pile up. Five silent failures cost the most: a vague hero, hidden CTA, slow mobile, missing proof at the offer, and a form that asks for too much. Each is fixable in under an hour.",
    keyTakeaways: [
      "Landing pages don't crash, they leak. Track the leak, not the symptom.",
      "Mobile load time over 3 seconds quietly kills 32% of paid traffic.",
      "If a 5-year-old can't tell you what the page is selling in 5 seconds, the headline is broken.",
      "Proof has to live next to the CTA, not in a separate testimonials carousel.",
      "Form length is the cheapest, fastest conversion lever you have.",
    ],
    body: [
      { type: "h2", text: "The hardest part of a broken landing page is that it doesn't look broken" },
      { type: "p", text: "An e-commerce checkout that throws an error pages someone within an hour. A landing page running at 0.4% conversion when it should hit 4% sits there for weeks. Traffic shows up, ad spend goes out, and your only signal is a slow drip of dread when you check the dashboard. That's the trap of silent failure: the page isn't down, it's just under-performing, and there's no alarm." },
      { type: "p", text: "The good news is that silent failures cluster around five specific causes. Once you know the causes, diagnosing them takes under 30 minutes per page. Fixing them takes under an hour. The five we see most often, in rough order of damage:" },

      { type: "h2", text: "Failure 1: A hero section that doesn't say what the page is selling" },
      { type: "p", text: "The blink test is real. A visitor decides whether to stay or leave inside the first 3–5 seconds. They make that decision based on the largest text on the page. If your largest text is a brand line, \"Reimagining what's possible\", they leave because they don't know what \"this\" is." },
      { type: "p", text: "A working hero answers three questions in one to two sentences: who is this for, what specifically does it do, and what changes after they get it. \"Spring HVAC tune-up: $89, 20-point inspection, same-week scheduling for Phoenix homeowners\" beats \"Bringing comfort home\" by an order of magnitude, every time, in every market we've tested." },
      { type: "p", text: "The fix is brutal but free. Read your headline out loud. If it could appear on any company's site in your industry, it's broken. Replace it with a sentence so specific that it could only describe what you're actually selling." },

      { type: "h2", text: "Failure 2: A CTA that's hidden, plural, or both" },
      { type: "p", text: "We audit landing pages weekly and find two opposite extremes. One: there's no visible CTA above the fold and the visitor has to scroll three screens to find a button. Two: there are eight CTAs, book a call, get a quote, download the guide, see pricing, schedule a tour, watch the demo, learn more, and contact us, all competing for the same click." },
      { type: "p", text: "Both kill conversion through the same mechanism: choice paralysis. The brain handles \"yes/no\" decisions in milliseconds. It handles \"which of seven things should I do?\" by closing the tab." },
      { type: "p", text: "A converting landing page has one CTA, repeated three to five times down the page, with the same exact button text every time. \"Book my $89 tune-up\" appearing five times beats five different button labels every single time. Pick the highest-value action and commit to it." },

      { type: "h2", text: "Failure 3: Mobile load time over 3 seconds" },
      { type: "p", text: "Run your page through PageSpeed Insights from a real cellular connection, not your office Wi-Fi. The number that matters is Largest Contentful Paint on the mobile slow-3G profile. If it's over 3 seconds, you are losing about a third of your paid traffic before they see your headline. They're gone, and your CRM doesn't know they were ever there." },
      { type: "p", text: "The two most common culprits are unoptimized hero images (a 4MB JPG behind every fold-1 image is depressingly common) and third-party scripts (chat widgets, analytics tools, A/B testing libraries) that block the page from rendering. Compress your hero to under 200KB and audit which scripts are loading synchronously. That's usually 80% of the fix." },

      { type: "callout", title: "The 5-second test you can run today", text: "Open your landing page on a phone you don't own, on cellular, after closing all your apps. Hand the phone to someone in another room. Ask them: \"What is this selling, and what would I do if I wanted it?\" If they can't answer both in 5 seconds, you've found your problem, and probably saved yourself a quarter of wasted ad spend." },

      { type: "h2", text: "Failure 4: Proof that lives nowhere near the offer" },
      { type: "p", text: "Visitors don't doubt the headline. They doubt the offer. The moment of doubt is the moment they hover over the button, and that's the only moment proof matters. A glowing testimonial three screens above the CTA is a memory; a glowing testimonial one inch below the CTA is a decision-changer." },
      { type: "p", text: "Move at least one specific, named, situation-matched piece of proof into the same visual frame as every CTA. \"382 5-star reviews on Google,\" or a one-line quote with a real name and city, or a logo of a recognizable client. The lift is consistent across industries: 12–28% conversion improvement from a single proof relocation, with no other changes." },
      { type: "p", text: "Generic proof, \"trusted by hundreds of customers\", does almost nothing. Specific proof, \"Booked $4,200 in emergency replacements in our first 30 days., Mike at Phoenix HVAC\", does almost everything." },

      { type: "h2", text: "Failure 5: A form that asks for too much, too early" },
      { type: "p", text: "Every form field beyond the third costs you 4–7% of your conversion rate. We've watched a roofing client double their inbound leads, overnight, by removing five fields they were collecting \"just in case.\" The fields were: roof age, current insurance carrier, ownership status, square footage, preferred callback time. All useful information. All collectable in the reply email." },
      { type: "p", text: "The principle: collect the minimum you need to start the conversation. Everything else gets gathered after the lead has said yes, when they have psychological skin in the game and won't drop off because of one more question." },
      { type: "p", text: "If you're worried that short forms produce low-quality leads, you're solving the wrong problem with the wrong tool. The form's job is to start the conversation. Your reply's job is to qualify. AI agents and a thoughtful first-touch email do qualifying better than any form ever has." },

      { type: "h2", text: "What high-converting pages actually look like" },
      { type: "p", text: "After fixing those five failures, the patterns of pages that consistently convert in the 4–9% range share five other traits worth copying:" },
      { type: "ul", items: [
        "One offer, one audience, one CTA, repeated.",
        "A 2-minute demo or single hero image that visualizes the outcome, not the process.",
        "A pricing block that's transparent, even if it says \"starting at\" or \"depends on scope.\"",
        "A scarcity or time element that's true (\"24 spots this month\", not fake countdowns).",
        "A risk-reversal that takes the worst-case off the table (money-back, free trial, no-credit-card-required).",
      ]},
      { type: "p", text: "None of this is novel. All of it is rare. The reason most landing pages don't converge on this template isn't ignorance, it's that internal stakeholders insist on adding things. Your job, as the person who actually sees the conversion data, is to subtract." },

      { type: "h2", text: "A 60-minute landing page audit you can run right now" },
      { type: "ol", items: [
        "Run the page through PageSpeed Insights on the mobile profile. If LCP is over 3s, fix the hero image first.",
        "Read the headline out loud. Could it appear on a competitor's site? If yes, rewrite it as a who-what-what-changes statement.",
        "Count the CTAs. If more than one distinct action, consolidate to one and repeat it 3–5 times with identical text.",
        "Find the closest piece of proof to your primary CTA. If it's more than one screen away, move it.",
        "Count your form fields. If more than three on a top-of-funnel page, cut to three.",
      ]},
      { type: "p", text: "60 minutes. No designer. No developer. The conversion lift typically lands inside the first week of doing this, long before you have time to second-guess yourself." },
    ],
    faq: [
      { q: "What's a good conversion rate for a landing page?", a: "It depends entirely on the temperature of the traffic and the value of the offer. For a paid-traffic landing page selling a low-commitment offer (free guide, $89 tune-up, 14-day trial), 4–9% is healthy. For a high-commitment offer (book a sales call, request a quote), 1.5–3% is healthy. If you're below the bottom of those ranges, you have at least one of the five silent failures above." },
      { q: "How long should a landing page be?", a: "As long as the offer requires and not one paragraph longer. A $89 tune-up needs a short page. A $50,000 enterprise contract needs a long one. Length is dictated by how much friction the buyer needs to overcome, and high-stakes buyers need more proof, more detail, and more risk reversal. Don't use length as a proxy for thoroughness." },
      { q: "Should I A/B test my changes?", a: "Eventually, yes. But not for the five fixes above, those are well-established enough that you'd be testing whether gravity works. Make the fixes, watch the next 7–14 days of conversion data, then move into A/B testing on smaller variables (headline phrasing, button color, social proof choice) where the lift is less obvious." },
      { q: "What about adding video to my landing page?", a: "A 90-second video that visualizes the outcome can lift conversion meaningfully. A 5-minute founder story usually doesn't, and often hurts because it pushes the CTA further down the page. If you add video, autoplay it muted with captions on, and make sure the page works perfectly without it." },
    ],
  },

  {
    slug: "the-truth-about-highconverting-landing-pages",
    title: "The ultimate guide to high-converting landing pages",
    publishDate: "2026-01-09",
    updatedDate: "2026-01-09",
    category: "Conversion",
    readingMinutes: 11,
    author: "Purna Web team",
    heroImage: "images/landing-page.html",
    excerpt: "A high-converting landing page is a single argument, end to end. Headline, proof, offer, risk-reversal, CTA repeated three times. Length is irrelevant; ambiguity is fatal.",
    tldr: "A high-converting landing page is a single argument, end to end. The eight-section anatomy that consistently converts: a specific headline (the promise), proof at the fold, the offer (what + why now), risk reversal, an objection-killer FAQ, a recap, the CTA repeated, and a credibility footer. Length is irrelevant; ambiguity is fatal.",
    keyTakeaways: [
      "Every section of a converting page answers one question the visitor would otherwise leave with.",
      "Specificity beats cleverness in every position on the page.",
      "Proof, offer, and CTA each appear at least twice, once early, once late.",
      "Risk reversal is the section most teams skip and the section that lifts conversion most.",
      "Build the page as a single argument, then test only after the argument is sound.",
    ],
    body: [
      { type: "h2", text: "What \"high-converting\" actually means" },
      { type: "p", text: "Before we get to anatomy, a quick reset. A high-converting landing page is one that converts a high share of relevant traffic into the next action. The two qualifiers matter. \"Relevant traffic\" excludes the bot traffic, the misclicks, the people who landed because the ad was wrong. \"The next action\" depends on the offer, sometimes it's a $89 booking, sometimes it's a calendar invite for a $50K conversation. There's no universal good number. There's only the number that's healthy for your offer." },
      { type: "p", text: "What is universal is the structure. Across thousands of pages we've audited, the pages that consistently outperform their category share an identical eight-section anatomy. The pages that consistently underperform are missing two or three of those sections. Anatomy is not opinion. It's pattern." },

      { type: "h2", text: "Section 1: the headline that promises one specific outcome" },
      { type: "p", text: "The headline is not a slogan. The headline is the single sentence a visitor would use to describe your offer to a friend over text. \"Spring HVAC tune-up: $89, 20-point inspection, same-week scheduling in Phoenix.\" That's a headline. \"Bringing comfort home, one home at a time.\" That's a slogan. Slogans belong on trucks. Headlines belong above the fold." },
      { type: "p", text: "A workable test: if you delete every other word on the page and only the headline remains, can a stranger still understand what's being sold and to whom? If yes, the headline is doing its job." },

      { type: "h2", text: "Section 2: subhead that names the buyer and removes the first objection" },
      { type: "p", text: "Right under the headline, in 1–2 sentences, do two things at once: name the buyer ruthlessly, and disarm the most common objection." },
      { type: "p", text: "\"For Phoenix homeowners with units 5+ years old. No credit card required to book, pay after the inspection.\" The first sentence tells the wrong-fit visitors to leave (which is good, they would have hurt your conversion data anyway). The second sentence eliminates the most common reason to abandon, the assumption that you're going to ask for payment up front." },

      { type: "h2", text: "Section 3: proof at the fold, not in a carousel three screens down" },
      { type: "p", text: "We covered this in the silent-failure piece, but it's worth repeating because it's the cheapest lift in the book. Inside the first viewport, what the visitor sees without scrolling, there should be at least one specific piece of proof. Not a logo strip of every press mention you've ever gotten. One specific thing." },
      { type: "p", text: "Best options, in order: a real testimonial with a name and a number (\"Booked $4,200 in our first 30 days., Mike, Phoenix HVAC\"), a recognizable client logo with a one-line result, or a quantified outcome (\"$18,400 recovered for our average client in 30 days\"). Anything specific. Nothing generic." },

      { type: "h2", text: "Section 4: the offer, with what and why now" },
      { type: "p", text: "The offer section explains what they get and why they should act before tomorrow. Not in a manipulative way, in a true way." },
      { type: "p", text: "What they get: list it. \"20-point inspection. Coil cleaning. Drain flush. Refrigerant top-off if needed. Same-week scheduling.\" The list does two jobs: it makes the offer concrete, and it lets visitors verify they're getting the right thing." },
      { type: "p", text: "Why now: a true, time-bounded reason to act. Seasonal pricing that ends on a real date. Limited capacity (\"24 spring slots, first-come\"). A bonus that drops on a published date. The why-now is not optional, without it, even interested buyers will close the tab and never come back. Just don't fake it. Visitors smell fake countdowns from a mile away, and the brand damage outweighs the conversion bump." },

      { type: "callout", title: "The why-now test", text: "If a visitor asked you \"why should I do this today instead of next month?\", could you answer truthfully in one sentence? If no, your offer is missing the why-now. If yes, that sentence belongs on the page in plain language." },

      { type: "h2", text: "Section 5: risk reversal, the most-skipped, highest-leverage section" },
      { type: "p", text: "Most landing pages skip this section entirely. The teams that include it consistently outperform the teams that don't, by 15–35% on conversion." },
      { type: "p", text: "Risk reversal answers one question: \"what's the worst thing that can happen if I say yes?\" If you can take the worst-case off the table, you remove the last brake the visitor's brain is pumping. The mechanisms are well-known: money-back guarantee, no-questions-asked refund, free trial period, satisfaction guarantee, performance guarantee (\"if we don't recover X in your first 30 days, we keep working free\"). Pick the strongest one you can deliver on truthfully and put it in its own visual block." },
      { type: "p", text: "The teams that resist this section usually have legal or finance reasons. Most of those reasons soften when they see what the absence is costing. A 25% conversion lift on a $5,400 offer means a lot more refunds you can comfortably afford to honor." },

      { type: "h2", text: "Section 6: the FAQ that kills the next eight objections" },
      { type: "p", text: "After you've offered + reduced risk, the visitor still has questions. Some of them are dealbreakers. The FAQ is where you handle the eight most common dealbreakers in the words real prospects actually use." },
      { type: "p", text: "Sources for your FAQ: your last 30 sales-call transcripts, the questions in your inbox before bookings, the objections your salespeople hear most often. Do not invent FAQs to look thorough. Invented FAQs get skipped; real ones get read top-to-bottom." },
      { type: "p", text: "An underused bonus: well-structured FAQs (with FAQPage schema markup) are the section most often cited by AI answer engines. Visitors using ChatGPT and Perplexity to research vendors are now an arriving cohort, and a good FAQ section gets you in front of them." },

      { type: "h2", text: "Section 7: recap + the CTA, repeated for the third time" },
      { type: "p", text: "By the bottom of the page, the visitor has been informed, persuaded, and reassured. Don't waste their attention by ending on a generic \"contact us\" footer. End on a recap of the offer (one sentence), a final piece of proof (different from the one above the fold), and the same CTA you used at the top, with the exact same button text." },
      { type: "p", text: "The repetition isn't redundant, it's load-bearing. Some visitors are scrollers (they scan to the bottom first); some are linear readers; some bounce in and out of sections. The CTA at the top, the CTA in the middle, and the CTA at the bottom catch all three." },

      { type: "h2", text: "Section 8: credibility footer + accessibility footer" },
      { type: "p", text: "The footer is your last chance to anchor credibility. Three useful slots: trust badges (BBB, accreditations, awards that are real and verifiable), small-print transparency (refund policy, full pricing if relevant, contact info), and accessibility/legal links (privacy, terms). Don't bury the footer with marketing, keep it functional. Visitors who reach the footer skeptical have one last reason to look up. Make sure what they see is solid." },

      { type: "h2", text: "What to test, and what not to" },
      { type: "p", text: "Once the eight sections are in place and the page is converting in a healthy range, A/B testing is the right move. Two principles will save you wasted cycles." },
      { type: "p", text: "First: test one variable at a time. Multivariate tests look smart but rarely produce statistically clean answers at the traffic levels small businesses run. Single-variable tests are slow but actually conclusive." },
      { type: "p", text: "Second: test the variables that move conversion most, in roughly this order: hero headline, primary CTA copy, proof position, offer framing, risk reversal language. Don't burn 4 weeks A/B testing button color. Buttons matter; copy matters more by an order of magnitude." },
    ],
    faq: [
      { q: "Should the landing page have navigation?", a: "Almost always no. A dedicated landing page exists to convert visitors on one offer. Navigation gives them places to leak away to. The exception is a long-form sales page where in-page anchor links to sections genuinely help readers, but those should be anchor links to the same page, not navigation to your full site." },
      { q: "How long should the page be?", a: "As long as the offer requires. Low-commitment offers ($89 tune-up, free guide) work as short single-screen pages. High-commitment offers (consulting engagement, enterprise software, $5,400+ packages) typically need 8–12 screens. Length should be a function of how much proof and information the buyer requires to act, not a stylistic preference." },
      { q: "Where do I add my AI chat agent?", a: "Bottom-right corner, opening to a friendly first message that references the offer on the page. The agent's job on a landing page is to answer the questions your FAQ didn't anticipate, and to capture contact details from visitors who'd never fill a form but will type a question. Don't auto-open it, let visitors invoke it. Auto-open hurts conversion." },
      { q: "Do testimonial videos really matter?", a: "When real, yes, significantly. A 30-second video of an actual client saying what changed for them outperforms text testimonials by 20–40%. The catch: it has to be unscripted, in the client's actual voice, with clear audio. A polished, scripted testimonial reads as advertising and converts worse than a plain-text quote." },
    ],
  },

  {
    slug: "how-to-define-your-ideal-client-persona-template-step-by-step-guide",
    title: "Who is your ideal client? A practical persona template for small businesses",
    publishDate: "2025-12-26",
    updatedDate: "2025-12-26",
    category: "Strategy",
    readingMinutes: 9,
    author: "Purna Web team",
    heroImage: "images/hero-professional-services.png",
    excerpt: "Demographic personas don't predict buying. Use a jobs-to-be-done frame: trigger event, the job they hire you for, three competing alternatives, two objections, and the emotion at decision.",
    tldr: "Demographic personas, \"35–45, urban, household income $80K+\", don't predict who buys. A useful persona answers six questions: what trigger event made them search today, what job are they hiring you for, what three alternatives are they comparing, what two objections will stall the decision, what emotion is driving the choice, and what does success look like 90 days in. Six answers fit on one page and feed your AI agents directly.",
    keyTakeaways: [
      "Demographic detail is descriptive; jobs-to-be-done is predictive.",
      "Trigger events explain timing, without them, you can't show up at the right moment.",
      "Naming the alternatives forces honesty about what makes you genuinely different.",
      "Objections written down become offer copy, not internal documents.",
      "The persona that lives in your AI chat agent's prompt produces 10x more value than the one that lives in a slide deck.",
    ],
    body: [
      { type: "h2", text: "Why most personas don't predict anything" },
      { type: "p", text: "Walk into most marketing teams and you'll find a persona document. It will list \"Sarah, 38, two kids, lives in a city, household income $90,000, drives a Subaru, listens to podcasts on weekends.\" It will not contain a single piece of information that predicts whether Sarah will pay you money. That's not Sarah's fault, it's the document's." },
      { type: "p", text: "The reason demographic personas don't predict buying is that two Sarahs with identical demographics make completely different purchase decisions. One Sarah just had her HVAC fail at 2 AM. The other Sarah's HVAC is fine. Same demographics, opposite buying behavior. The data point that matters is the trigger event, not the income bracket." },
      { type: "p", text: "A persona that's actually useful for marketing answers a different question: not \"who is my customer in general?\" but \"what's true about a customer in the moment they're about to buy?\" That second question generates content, ad copy, landing-page headlines, and AI-agent training data. The first question generates a slide deck nobody opens twice." },

      { type: "h2", text: "The 6-question persona that fits on one page" },
      { type: "p", text: "We've used this six-question template across dozens of clients in HVAC, plumbing, healthcare, coaching, and professional services. It works because every question maps to a specific marketing decision you'll make this week." },

      { type: "h3", text: "1. What was the trigger event in the 7 days before they searched?" },
      { type: "p", text: "Buying isn't random. Something happened, a unit failed, a deadline hit, a new diagnosis, a bad quarter, a partner got fed up. The trigger explains timing, which explains where to find them and what to say. \"Their AC failed at 2 AM during a heatwave\" tells you the headline (\"Same-day AC repair, including after-hours\"), the channel (Google search for emergency terms, not Facebook display), and the offer (an $89 emergency-priced tune-up to lock in a relationship before the next failure)." },

      { type: "h3", text: "2. What is the job they're hiring you to do?" },
      { type: "p", text: "Not the service category. The job. People don't hire a therapist, they hire a therapist to stop their relationship from ending. People don't hire an HVAC contractor, they hire an HVAC contractor to make their kid stop crying about the heat. The job is emotional and specific. The category is generic. Your marketing converts when it speaks to the job, not the category." },

      { type: "h3", text: "3. What three alternatives are they actively comparing?" },
      { type: "p", text: "Buyers don't compare you to nobody. They compare you to three things: another vendor like you, a different category that solves the same job, and doing nothing. List all three by name. \"They're comparing us to Ace HVAC, to the YouTube DIY route, and to just suffering through the heatwave.\" Each alternative requires a different counter-position in your copy." },

      { type: "h3", text: "4. What two objections will stall the decision?" },
      { type: "p", text: "Every buyer has a brake pedal. Two objections are usually enough to stall a purchase. \"They worry the contractor will upsell\" and \"they don't trust same-day pricing.\" Once you've written down the objections, the offer page writes itself: a transparent menu of prices and a no-upsell guarantee become headline-worthy material instead of small-print legalese." },

      { type: "h3", text: "5. What emotion is at the decision?" },
      { type: "p", text: "Most buying decisions are emotional and rationalized after the fact. The emotion at decision is rarely \"excitement.\" It's usually fear (this might get worse), guilt (I should have handled this sooner), exhaustion (I just need someone to make this go away), or hope (maybe this time will be different). Your copy needs to acknowledge the emotion before it can sell the solution. \"Most homeowners delay this until the second 95° day. We get it, the call list is long, and the hunch is that the unit will hold. That's exactly when units fail.\"" },

      { type: "h3", text: "6. What does success look like 90 days after they buy?" },
      { type: "p", text: "Buyers imagine a future state. The clearer that future state, the easier the buying decision. \"In 90 days you've had two service visits, your unit is running 12% more efficiently, and you didn't think about it once during the heatwave.\" That sentence belongs on your offer page, not in your testimonials, not in your follow-up emails, but on the offer page itself, before they buy." },

      { type: "callout", title: "The one-page persona test", text: "Print your finished persona. Hand it to a salesperson who's never met your team. Ask: could you write a sales reply to a new lead using only this page? If yes, the persona is doing its job. If no, you've described a person, not a buyer." },

      { type: "h2", text: "How to actually generate the answers (without making them up)" },
      { type: "p", text: "The mistake most teams make is filling out a persona template from imagination. Imagined answers produce imagined customers. The real answers exist in three places, and each takes about an hour to mine." },
      { type: "ol", items: [
        "Read the last 20 emails from prospects in the 7 days before they bought. Look for trigger words (\"finally,\" \"can't take it anymore,\" \"my partner said,\" \"after the storm\"). Those are your trigger events.",
        "Listen to 5 sales call recordings. Note every sentence that starts with \"I'm worried that…\" or \"What I really need is…\" Those are your objections and your job-to-be-done.",
        "Interview 3 customers who bought 90 days ago. Ask: what was happening in your life the week before you searched? What other options did you consider? What were you afraid of when you signed? Those answers map cleanly to all six questions.",
      ]},
      { type: "p", text: "Three hours of research. One page of output. The output drives copy, ads, and AI agents for the next year. The math is good." },

      { type: "h2", text: "Feeding the persona to your AI agents" },
      { type: "p", text: "If you're running an AI chat or voice agent on your site, the persona document goes directly into the agent's system prompt. The agent now knows the trigger events to listen for, the alternatives to acknowledge gracefully, the objections to handle directly, and the emotion to mirror back. The result is an agent that sounds like a thoughtful junior salesperson instead of a generic assistant." },
      { type: "p", text: "Concretely: when a prospect types \"I keep getting different quotes,\" an untrained agent says \"thanks for reaching out, can I get your name?\" A persona-trained agent says \"yeah, that's the most common reason people end up here. Most quotes vary because they include different scope items. Want me to send you the menu so you can compare apples to apples? Takes 30 seconds.\" One feels like a wall. The other feels like progress." },

      { type: "h2", text: "What to do with the persona document this week" },
      { type: "ol", items: [
        "Audit your hero headline. Does it speak to the job or to the category? If category, rewrite it.",
        "Audit your offer page. Are the two top objections answered before the buyer encounters them, or buried in the FAQ?",
        "Audit your AI agent's system prompt. Add the trigger events and the objections.",
        "Audit your ad copy. Does it match the emotion at decision? If your top ad reads \"Save 20% on tune-ups,\" but the emotion is fear of unit failure, your ad is solving the wrong problem.",
        "Schedule the next 3 customer interviews. The persona drifts every 6–12 months as your market changes. Re-mine it.",
      ]},
    ],
    faq: [
      { q: "How many personas should I have?", a: "One per distinct job-to-be-done. Most small businesses serve 2–3 distinct jobs even if they think they serve one. Don't go beyond 3, at that point you're describing your market, not your customers, and the document loses precision." },
      { q: "Do I need to give the persona a name and a stock photo?", a: "No, and the practice often backfires. A name and stock photo make the persona feel cute and forgettable. A trigger event and a job-to-be-done make it feel sharp and actionable. Use the structure, skip the cosplay." },
      { q: "How often should I update the persona?", a: "Re-interview customers every 6 months. Major shifts (a new product, a new market, a competitor change, a macro event like a recession or new technology) reset the persona faster, within 60–90 days. The persona is a living document, not a slide in a deck." },
      { q: "Can AI generate the persona for me?", a: "AI can synthesize a draft from your customer interview transcripts, support emails, and sales calls. AI cannot generate the persona from your description of who you think your customers are, that just produces a more confident version of your existing assumptions. Feed AI real data; let it draft. Edit by hand." },
    ],
  },

  {
    slug: "voice-tone-messaging-how-to-sound-consistent-and-trustworthy-online-and-offline",
    title: "Brand voice, tone & messaging: how to sound consistent and trustworthy online and offline",
    publishDate: "2025-12-19",
    updatedDate: "2025-12-19",
    category: "Brand",
    readingMinutes: 8,
    author: "Purna Web team",
    heroImage: "images/hero-cleaning-restoration.png",
    excerpt: "Voice is the things you always say. Tone shifts by context. Messaging is the proof that supports your promise. AI agents now amplify all three 24/7, codify them before you train an agent on a single message.",
    tldr: "Voice is the things you always say no matter what. Tone is how voice shifts based on context, cheerful for an order confirmation, careful for a refund request. Messaging is the proof that supports your brand promise. With AI agents now generating 60–80% of customer-facing content, codifying voice in 5 written rules before you train an agent prevents your brand from drifting into generic chatbot-speak.",
    keyTakeaways: [
      "Voice is constant; tone is contextual; messaging is the evidence layer.",
      "Five written rules beat a 40-page brand guide nobody reads.",
      "AI agents inherit your voice from a prompt, write the prompt deliberately.",
      "Tone shifts are the most under-documented part of brand work.",
      "Audit voice quarterly by reading random customer messages out loud, they should still sound like you.",
    ],
    body: [
      { type: "h2", text: "The three things people confuse with each other" },
      { type: "p", text: "Voice, tone, and messaging are used interchangeably in most marketing conversations, which is why they don't get implemented. They're three different things, doing three different jobs, at three different layers of your communication." },
      { type: "p", text: "Voice is the constant. It's the thing that's true about how your brand talks regardless of context, whether you're answering a complaint, sending a launch email, or writing a job posting. Voice is identity. It doesn't change." },
      { type: "p", text: "Tone is the variable. Tone shifts based on the situation. Your voice might be \"warm, direct, and a little dry\", but the tone of an order confirmation is cheerful, the tone of a refund response is careful, and the tone of a service-outage announcement is serious. Same voice, different tone." },
      { type: "p", text: "Messaging is the evidence. The brand promise (\"we make AC repair feel painless\") is only as believable as the proof that backs it up. Messaging is the layer where claims become specific: the warranty, the response time guarantee, the service-area coverage, the named tech with the 4.9-star average. Without messaging, voice and tone are unsupported assertions." },

      { type: "h2", text: "Five rules beat a 40-page brand guide" },
      { type: "p", text: "Most brand-voice documents are 40 pages of mood boards, font specimens, and personality adjectives. They sit in a Drive folder unread. The voice document that actually gets used is one page with five rules and an example next to each. Here's the format we use with clients:" },
      { type: "ul", items: [
        "Always say… (the words and phrases that are recognizably ours)",
        "Never say… (the words and phrases that read as generic or off-brand)",
        "We sound like… (one comparable brand or person, plus the specific trait we're borrowing)",
        "We don't sound like… (one comparable brand or person, plus the specific trait we're avoiding)",
        "When in doubt… (the default, usually \"shorter, more specific, less hedged\")",
      ]},
      { type: "p", text: "Five rules. One page. A brand-new copywriter, a junior salesperson, or an AI agent can produce on-voice copy from this single page. A 40-page guide is a vanity artifact. A one-pager is a tool." },

      { type: "h2", text: "How to write the \"always say\" and \"never say\" rules" },
      { type: "p", text: "Both rules come from data, not preference. To populate \"always say,\" pull 30 of your highest-performing pieces of content (emails with the highest reply rates, ads with the highest CTR, support replies with the warmest reactions). Highlight the phrases that show up repeatedly. Those are your voice in action, already validated by results." },
      { type: "p", text: "To populate \"never say,\" pull 30 pieces of content from your three most-direct competitors. Highlight the phrases that read as generic or interchangeable. \"Innovative solutions.\" \"Best-in-class.\" \"Customer-centric.\" \"Excellence.\" Those phrases are your competitors' voice as much as yours, which means none of you stand out. Add them to the never-say list and your copy immediately differentiates." },

      { type: "h2", text: "The tone matrix nobody writes, and should" },
      { type: "p", text: "Voice without tone produces robotic communication that's technically on-brand but emotionally flat. Tone is the layer where good brands feel human." },
      { type: "p", text: "The fastest way to document tone is a small matrix: list the 6–8 communication contexts you handle most often, and write one sentence describing how the tone shifts in each. Common contexts and tone shifts:" },
      { type: "ul", items: [
        "Order/booking confirmation: warm, brief, anticipatory.",
        "Reminder before an appointment: friendly, helpful, low-friction.",
        "Refund or complaint reply: careful, accountable, no defensive language.",
        "Service outage or apology: direct, factual, plan-forward.",
        "Sales follow-up: useful, low-pressure, specific.",
        "Marketing email to existing customers: insider-y, shorthand, less explanation.",
        "Marketing email to cold list: clearer, more context, lower assumptions.",
        "Internal team Slack: looser, more emoji, fewer formalities.",
      ]},
      { type: "p", text: "8 sentences. One matrix. Now your team, and your AI agents, know exactly how the same voice should bend in each situation." },

      { type: "callout", title: "The voice audit you can run today", text: "Pull 5 customer-facing messages your team sent this week, pick at random. Read each one out loud. Could a stranger tell they came from the same brand? If three of the five sound like generic business communication, your voice is drifting and your one-page guide isn't being used. Re-circulate it." },

      { type: "h2", text: "Messaging: the layer where claims become believable" },
      { type: "p", text: "Brand promises are easy. Believable brand promises require messaging, the specific, dated, named evidence that backs the claim." },
      { type: "p", text: "If your promise is \"we respond fast,\" the messaging is \"average first response under 3 minutes during business hours, under 30 minutes after hours, measured weekly and posted on our status page.\" If your promise is \"we don't upsell,\" the messaging is \"every quote is itemized, no work begins without your written sign-off, and our techs are paid a flat rate, not commission.\" If your promise is \"we get results,\" the messaging is \"our average client recovers $18,400 in their first 30 days; here are three named case studies with the math.\"" },
      { type: "p", text: "The pattern: brand promise → measurable proof → named example → published commitment. Each layer makes the next one more credible. A promise without proof is marketing. A promise with proof is messaging." },

      { type: "h2", text: "How AI agents change voice work, and why you need to codify it now" },
      { type: "p", text: "Two years ago a brand's voice lived in the heads of about a dozen people: founders, marketers, salespeople, support reps. They each absorbed the voice through proximity. New hires picked it up by osmosis. The system was inefficient but it worked." },
      { type: "p", text: "Today, between 60 and 80 percent of customer-facing content for many small businesses is being generated or assisted by AI. Chat agents handle first-touch. Voice agents handle overflow calls. Email composers draft replies. Ad-copy tools generate variants. Every one of those AI tools is going to inherit a voice, either yours, or the LLM's default \"helpful corporate assistant\" voice. Default loses." },
      { type: "p", text: "The fix is concrete. The same one-page voice document and tone matrix you'd hand a new copywriter goes directly into the system prompt of every AI agent you deploy. The result is agents that sound recognizably like you, not like every other small business running the same off-the-shelf chatbot." },
      { type: "p", text: "We've watched HVAC clients deploy chat agents that customers later told them they thought were the owner replying personally. That's the upper bound of what voice-aware AI looks like. The lower bound is the generic chatbot voice that costs you trust. The difference is one page of writing, copied into the right place." },

      { type: "h2", text: "A 60-minute voice + tone + messaging sprint you can run today" },
      { type: "ol", items: [
        "Pull your top 30 customer-facing messages and your competitors' top 30. Build the always-say and never-say lists. (20 minutes)",
        "Write the one-pager: 5 rules + one example each. (15 minutes)",
        "Build the tone matrix: 6–8 contexts, one sentence each. (10 minutes)",
        "Pick your top 3 brand promises. Write the proof-and-named-example for each. (10 minutes)",
        "Paste the one-pager and tone matrix into the system prompt of every AI agent you run. Test with three sample messages. (5 minutes)",
      ]},
      { type: "p", text: "60 minutes. The output: a voice your team and your agents can both produce on-demand. The brand stops drifting." },
    ],
    faq: [
      { q: "Should we hire a copywriter to define our voice?", a: "Only if you have someone in-house who's already producing the highest-converting customer-facing content. The voice exists in their writing, a copywriter's job is to extract it, not invent it. If your top performer is a salesperson and not a marketer, the salesperson's emails are where to start. If you don't have anyone whose writing converts well, hiring a copywriter to define a voice from scratch usually produces a voice that doesn't sound like you." },
      { q: "How do we keep voice consistent across team members?", a: "Three mechanisms work in combination: the one-page voice document (so everyone has the rules), a shared library of approved phrases (\"swap these for these\"), and a 15-minute weekly review where the team reads each other's customer-facing messages and flags drift. The drift catches itself once the team is looking for it." },
      { q: "What about social media, do we need a different voice there?", a: "Same voice, different tone. The voice that's recognizably you should appear on every platform. The tone shifts: punchier on X/Twitter, more visual on Instagram, more conversational on LinkedIn, longer-form on a blog. Voice is what makes you recognizable; tone is what makes you fit the platform." },
      { q: "How do we make sure our AI agents stay on-voice over time?", a: "Audit randomly each month. Pull 10 random transcripts from each AI agent and read them out loud. Score each on a 1–5 voice-match scale. Anything below 4 means the system prompt needs an update, usually one new always-say or never-say rule based on what's drifted. Voice is maintained, not set-and-forget." },
    ],
  },
];

// ─── Body renderer ────────────────────────────────────────────────────────

function BlogBody({ body }) {
  return (
    <div className="blog-body">
      {body.map((b, i) => {
        if (b.type === "h2") return <h2 key={i} className="blog-h2">{b.text}</h2>;
        if (b.type === "h3") return <h3 key={i} className="blog-h3">{b.text}</h3>;
        if (b.type === "p")  return <p key={i} className="blog-p">{b.text}</p>;
        if (b.type === "ul") return <ul key={i} className="blog-ul">{b.items.map((it, j) => <li key={j}>{it}</li>)}</ul>;
        if (b.type === "ol") return <ol key={i} className="blog-ol">{b.items.map((it, j) => <li key={j}>{it}</li>)}</ol>;
        if (b.type === "callout") return (
          <aside key={i} className="blog-callout">
            {b.title && <span className="blog-callout-title">{b.title}</span>}
            <p>{b.text}</p>
          </aside>
        );
        if (b.type === "quote") return (
          <blockquote key={i} className="blog-quote">
            <p>{b.text}</p>
            {b.cite && <cite>- {b.cite}</cite>}
          </blockquote>
        );
        return null;
      })}
    </div>
  );
}

// ─── Date helpers ─────────────────────────────────────────────────────────

function formatPublishDate(iso) {
  const d = new Date(iso + "T12:00:00Z");
  return d.toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric" });
}

// ─── Index page ──────────────────────────────────────────────────────────

function BlogIndexPage() {
  useReveal();
  const sorted = [...BLOG_POSTS].sort((a, b) => b.publishDate.localeCompare(a.publishDate));
  const featured = sorted[0];
  const rest = sorted.slice(1);

  return (
    <>
      <Nav active="blog"/>

      <section className="blog-hero">
        <div className="container">
          <span className="eyebrow">Field-notes from the Purna Web team</span>
          <h1 className="h1">Practical playbooks for AI-era growth.</h1>
          <p className="lead">Short essays on conversion, content, and AI workflows, from the team that ships them. Written for owners, marketers, and clinicians, not for SEO.</p>
        </div>
      </section>

      <section className="sec sec-tight">
        <div className="container">
          <a href={`blog/${featured.slug}`} className="blog-feature reveal">
            <div className="blog-feature-img" style={{backgroundImage: `linear-gradient(135deg, rgba(11,46,77,0.30), rgba(11,46,77,0.55)), url(${featured.heroImage})`}}/>
            <div className="blog-feature-body">
              <div className="blog-meta">
                <span className="blog-meta-cat">{featured.category}</span>
                <span className="blog-meta-dot">·</span>
                <span>{formatPublishDate(featured.publishDate)}</span>
                <span className="blog-meta-dot">·</span>
                <span>{featured.readingMinutes} min read</span>
              </div>
              <h2 className="blog-feature-title">{featured.title}</h2>
              <p className="blog-feature-excerpt">{featured.excerpt}</p>
              <span className="blog-feature-link">Read the post <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 7h10M8 3l4 4-4 4" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round"/></svg></span>
            </div>
          </a>

          <div className="blog-grid">
            {rest.map((p, i) => (
              <a key={p.slug} href={`blog/${p.slug}`} className="blog-card reveal" style={{transitionDelay: `${i * 60}ms`}}>
                <div className="blog-card-img" style={{backgroundImage: `linear-gradient(135deg, rgba(11,46,77,0.20), rgba(11,46,77,0.50)), url(${p.heroImage})`}}/>
                <div className="blog-card-body">
                  <div className="blog-meta">
                    <span className="blog-meta-cat">{p.category}</span>
                    <span className="blog-meta-dot">·</span>
                    <span>{formatPublishDate(p.publishDate)}</span>
                  </div>
                  <h3 className="blog-card-title">{p.title}</h3>
                  <p className="blog-card-excerpt">{p.excerpt}</p>
                  <span className="blog-card-link">{p.readingMinutes} min · Read →</span>
                </div>
              </a>
            ))}
          </div>
        </div>
      </section>

      <CTABanner/>
      <Footer/>
    </>
  );
}

// ─── Single post page ────────────────────────────────────────────────────

function BlogPostPage() {
  useReveal();
  const params = new URLSearchParams(window.location.search);
  const slug = params.get("slug");
  const post = BLOG_POSTS.find(p => p.slug === slug) || BLOG_POSTS[0];

  React.useEffect(() => {
    document.title = `${post.title}, Purna Web`;
    const desc = document.querySelector('meta[name="description"]');
    if (desc) desc.setAttribute("content", post.excerpt);
    const can = document.querySelector('link[rel="canonical"]');
    if (can) can.setAttribute("href", `https://purnaweb.ca/blog/${post.slug}`);

    document.querySelectorAll('script[data-blog-jsonld]').forEach(s => s.remove());
    const article = document.createElement("script");
    article.type = "application/ld+json";
    article.setAttribute("data-blog-jsonld", "1");
    article.textContent = JSON.stringify({
      "@context": "https://schema.org",
      "@type": "Article",
      "headline": post.title,
      "description": post.excerpt,
      "image": `https://purnaweb.ca/${post.heroImage}`,
      "datePublished": post.publishDate,
      "dateModified": post.updatedDate || post.publishDate,
      "author": { "@type": "Organization", "name": post.author || "Purna Web team" },
      "publisher": {
        "@type": "Organization",
        "name": "Purna Web Agency",
        "logo": { "@type": "ImageObject", "url": "https://purnaweb.ca/crmlogo.png" },
      },
      "mainEntityOfPage": {
        "@type": "WebPage",
        "@id": `https://purnaweb.ca/blog/${post.slug}`,
      },
    });
    document.head.appendChild(article);

    if (post.faq && post.faq.length) {
      const faq = document.createElement("script");
      faq.type = "application/ld+json";
      faq.setAttribute("data-blog-jsonld", "1");
      faq.textContent = JSON.stringify({
        "@context": "https://schema.org",
        "@type": "FAQPage",
        "mainEntity": post.faq.map(f => ({
          "@type": "Question",
          "name": f.q,
          "acceptedAnswer": { "@type": "Answer", "text": f.a },
        })),
      });
      document.head.appendChild(faq);
    }
  }, [post.slug]);

  const related = BLOG_POSTS.filter(p => p.slug !== post.slug).slice(0, 3);

  return (
    <>
      <Nav active="blog"/>

      <article className="post-shell">
        <div className="container container-narrow">
          <div className="post-meta-top">
            <a href="blog.html" className="post-back">← All posts</a>
            <span className="post-meta-cat">{post.category}</span>
          </div>
          <h1 className="post-h1">{post.title}</h1>
          <div className="post-meta">
            <span>By {post.author}</span>
            <span className="blog-meta-dot">·</span>
            <time dateTime={post.publishDate}>{formatPublishDate(post.publishDate)}</time>
            <span className="blog-meta-dot">·</span>
            <span>{post.readingMinutes} min read</span>
          </div>
        </div>

        <div className="post-hero" style={{backgroundImage: `linear-gradient(135deg, rgba(11,46,77,0.20), rgba(11,46,77,0.55)), url(${post.heroImage})`}}/>

        <div className="container container-narrow">
          <aside className="post-tldr">
            <span className="post-tldr-label">TL;DR</span>
            <p>{post.tldr}</p>
          </aside>

          <aside className="post-takeaways">
            <span className="post-takeaways-label">Key takeaways</span>
            <ul>
              {post.keyTakeaways.map((t, i) => <li key={i}>{t}</li>)}
            </ul>
          </aside>

          <BlogBody body={post.body}/>

          {post.faq && post.faq.length > 0 && (
            <section className="post-faq">
              <h2 className="blog-h2">Frequently asked questions</h2>
              {post.faq.map((f, i) => (
                <details key={i} className="post-faq-item">
                  <summary>{f.q}</summary>
                  <p>{f.a}</p>
                </details>
              ))}
            </section>
          )}

          <div className="post-cta">
            <h3>Want help applying this to your business?</h3>
            <p>30-minute discovery call. No pitch deck. We&rsquo;ll review your current funnel and project the recovery you&rsquo;d see in your first 30 days.</p>
            <a href="booking.html" className="btn btn-primary btn-arr">
              Book a discovery call
              <svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 7h10M8 3l4 4-4 4" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round"/></svg>
            </a>
          </div>
        </div>
      </article>

      <section className="sec sec-tight">
        <div className="container">
          <h2 className="h3" style={{marginBottom: 24}}>Keep reading</h2>
          <div className="blog-grid">
            {related.map((p, i) => (
              <a key={p.slug} href={`blog/${p.slug}`} className="blog-card reveal" style={{transitionDelay: `${i * 60}ms`}}>
                <div className="blog-card-img" style={{backgroundImage: `linear-gradient(135deg, rgba(11,46,77,0.20), rgba(11,46,77,0.50)), url(${p.heroImage})`}}/>
                <div className="blog-card-body">
                  <div className="blog-meta">
                    <span className="blog-meta-cat">{p.category}</span>
                    <span className="blog-meta-dot">·</span>
                    <span>{formatPublishDate(p.publishDate)}</span>
                  </div>
                  <h3 className="blog-card-title">{p.title}</h3>
                  <p className="blog-card-excerpt">{p.excerpt}</p>
                </div>
              </a>
            ))}
          </div>
        </div>
      </section>

      <Footer/>
    </>
  );
}

Object.assign(window, { BlogIndexPage, BlogPostPage, BLOG_POSTS });
