Skip to content
Easy Websites LOGO
Call Now
  • HomeExpand
    • Results
    • Real Results
  • DigiCard
  • Contact
  • Blog
Easy Websites LOGO
One template · six services · repeatable system
1
Content foundation
Create once per service
Blog post
Short (300–400w) or medium (700–900w)
Hero image
1 core image · repurpose across all channels
Social posts
LinkedIn (professional) · Facebook (conversational)
Key message
One sentence: problem solved + outcome
2
Lead magnet (hook/offer)
Service-specific — must be genuinely useful
Option A
Checklist (fastest to create)
Option B
Short guide or tip sheet (PDF)
Option C
Mini video or screencast walkthrough
The freebie is the entry point to your email sequence — a weak one kills the chain. Make it specific to the service, not generic.
3
Email sequence (3–4 emails)
ClientsProspects
Existing clients
Email 1 · Warm check-in + soft intro
Email 2 · Value proof (results/case study)
Email 3 · Direct offer + upsell angle
Email 4 · Final nudge + easy reply CTA
Prospects
Email 1 · Problem-first hook + lead magnet
Email 2 · Educate (how it works, why it matters)
Email 3 · Social proof + credibility
Email 4 · Offer + low-friction CTA
Subtle differences: clients get shorter, warmer copy; prospects need more education and trust-building before the offer.
4
Landing page
One per service
Above the fold
Strong hook headline · sub-headline · CTA button
Social proof
1–2 testimonials or results (add this — it converts)
What you get
3–4 bullet benefits · not features
Second CTA
Bottom of page · repeat the offer
5
Suggested rollout order
Don’t launch all at once
Week 1
Pick your highest-margin service · build full template
Week 2–3
Publish blog + social · launch email sequence
Week 4
Review results · adapt · roll out to next service
One service done well beats six done poorly. Once the template is built, each new service takes a fraction of the time.
const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, Header, AlignmentType, LevelFormat, HeadingLevel, BorderStyle, WidthType, ShadingType, VerticalAlign, PageBreak, ExternalHyperlink } = require(‘docx’); const fs = require(‘fs’); const BRAND = “4472C4”; // blue const ACCENT = “2E75B6”; const LIGHT = “D6E4F7”; const GRAY = “595959”; const LGRAY = “F2F2F2”; const WHITE = “FFFFFF”; const border = { style: BorderStyle.SINGLE, size: 1, color: “CCCCCC” }; const borders = { top: border, bottom: border, left: border, right: border }; const noBorder = { style: BorderStyle.NONE, size: 0, color: “FFFFFF” }; const noBorders = { top: noBorder, bottom: noBorder, left: noBorder, right: noBorder }; function hRule(color = BRAND) { return new Paragraph({ border: { bottom: { style: BorderStyle.SINGLE, size: 12, color, space: 1 } }, spacing: { before: 0, after: 240 }, children: [] }); } function h1(text) { return new Paragraph({ heading: HeadingLevel.HEADING_1, spacing: { before: 480, after: 120 }, children: [new TextRun({ text, font: “Arial”, size: 36, bold: true, color: BRAND })] }); } function h2(text) { return new Paragraph({ heading: HeadingLevel.HEADING_2, spacing: { before: 360, after: 120 }, children: [new TextRun({ text, font: “Arial”, size: 28, bold: true, color: ACCENT })] }); } function h3(text) { return new Paragraph({ spacing: { before: 240, after: 80 }, children: [new TextRun({ text, font: “Arial”, size: 24, bold: true, color: GRAY })] }); } function body(text, opts = {}) { return new Paragraph({ spacing: { before: 80, after: 120 }, children: [new TextRun({ text, font: “Arial”, size: 22, color: “333333”, …opts })] }); } function italic(text) { return new Paragraph({ spacing: { before: 60, after: 80 }, children: [new TextRun({ text, font: “Arial”, size: 22, italics: true, color: GRAY })] }); } function bullet(text, ref = “bullets”) { return new Paragraph({ numbering: { reference: ref, level: 0 }, spacing: { before: 60, after: 60 }, children: [new TextRun({ text, font: “Arial”, size: 22, color: “333333” })] }); } function label(text) { return new Paragraph({ spacing: { before: 160, after: 40 }, children: [new TextRun({ text: text.toUpperCase(), font: “Arial”, size: 18, bold: true, color: BRAND })] }); } function spacer(n = 1) { return Array.from({ length: n }, () => new Paragraph({ children: [new TextRun(“”)] })); } function pageBreak() { return new Paragraph({ children: [new PageBreak()] }); } function shadeBox(children, fill = LIGHT) { return new Table({ width: { size: 9360, type: WidthType.DXA }, columnWidths: [9360], rows: [new TableRow({ children: [new TableCell({ borders: noBorders, width: { size: 9360, type: WidthType.DXA }, shading: { fill, type: ShadingType.CLEAR }, margins: { top: 160, bottom: 160, left: 240, right: 240 }, children })] })] }); } function twoCol(left, right, leftW = 4500, rightW = 4860) { return new Table({ width: { size: 9360, type: WidthType.DXA }, columnWidths: [leftW, rightW], rows: [new TableRow({ children: [ new TableCell({ borders: noBorders, width: { size: leftW, type: WidthType.DXA }, margins: { top: 80, bottom: 80, left: 0, right: 200 }, children: left }), new TableCell({ borders: noBorders, width: { size: rightW, type: WidthType.DXA }, margins: { top: 80, bottom: 80, left: 200, right: 0 }, children: right }) ] })] }); } function emailBox(num, subject, audience, lines) { const headerCell = new TableCell({ borders: noBorders, width: { size: 9360, type: WidthType.DXA }, shading: { fill: BRAND, type: ShadingType.CLEAR }, margins: { top: 120, bottom: 120, left: 200, right: 200 }, children: [ new Paragraph({ children: [new TextRun({ text: `Email ${num} | ${audience}`, font: “Arial”, size: 20, bold: true, color: WHITE })] }), new Paragraph({ children: [new TextRun({ text: `Subject: ${subject}`, font: “Arial”, size: 22, bold: true, color: “DEECFF”, italics: true })] }), ] }); const bodyChildren = lines.map(l => { if (l === ”) return new Paragraph({ children: [new TextRun({ text: “” })] }); if (l.startsWith(‘• ‘)) return bullet(l.slice(2)); if (l.startsWith(‘**’) && l.endsWith(‘**’)) return new Paragraph({ spacing: { before: 100, after: 60 }, children: [new TextRun({ text: l.slice(2, -2), font: “Arial”, size: 22, bold: true, color: GRAY })] }); return body(l); }); const bodyCell = new TableCell({ borders, width: { size: 9360, type: WidthType.DXA }, shading: { fill: “FAFAFA”, type: ShadingType.CLEAR }, margins: { top: 160, bottom: 160, left: 240, right: 240 }, children: bodyChildren }); return new Table({ width: { size: 9360, type: WidthType.DXA }, columnWidths: [9360], rows: [ new TableRow({ children: [headerCell] }), new TableRow({ children: [bodyCell] }) ] }); } // ─── COVER PAGE ─────────────────────────────────────────────────────────────── const cover = [ …spacer(4), new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: “EASYWEBSITES.CO.ZA”, font: “Arial”, size: 36, bold: true, color: BRAND })] }), new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 120, after: 120 }, children: [new TextRun({ text: “Service Promotion Template”, font: “Arial”, size: 28, color: GRAY })] }), hRule(), new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 200, after: 80 }, children: [new TextRun({ text: “GOOGLE BUSINESS PROFILE MANAGEMENT”, font: “Arial”, size: 44, bold: true, color: “222222” })] }), new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 80, after: 400 }, children: [new TextRun({ text: “Complete Campaign Kit · Version 1.0”, font: “Arial”, size: 22, italics: true, color: GRAY })] }), shadeBox([ new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: “Blog Post · Social Media Copy · Lead Magnet · Email Sequences · Landing Page Copy”, font: “Arial”, size: 22, color: ACCENT })] }) ]), …spacer(3), new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: “Stretch Fletcher | 067-861-4534 | easywebsites.co.za | Durban, KZN”, font: “Arial”, size: 20, color: GRAY })] }), pageBreak() ]; // ─── SECTION 1: BLOG POST ───────────────────────────────────────────────────── const blog = [ h1(“01 — Blog Post”), body(“Publish this on your website blog. It serves as evergreen content, boosts your SEO, and gives your social posts something to link back to. Use the short version for a quick post; the medium version if you want stronger Google ranking.”), hRule(ACCENT), h2(“SHORT VERSION (300–400 words)”), label(“Headline”), shadeBox([ new Paragraph({ children: [new TextRun({ text: “Is Your Durban Business Invisible on Google? Here’s What It’s Costing You.”, font: “Arial”, size: 24, bold: true, color: “222222” })] }) ]), …spacer(1), label(“Body”), body(“If someone in Durban searches for your service right now, do you show up?”), body(“If you don’t have a Google Business Profile (GBP) — or yours is unclaimed, unverified, or sitting empty — the honest answer is: probably not. And that invisibility has a price tag.”), body(“Research shows that up to 70% of local searchers choose a business directly from Google Maps or search results, without ever clicking through to a website. They see the name, the reviews, the phone number, and they call. If you’re not in that map pack, those calls go to your competitors.”), h3(“What a fully optimised GBP actually does for you:”), bullet(“Puts you in the ‘Map Pack’ — the top 3 results for searches like ‘web designer Durban’ or ‘digital marketing Durban'”), bullet(“Lets customers call you, get directions, or send a message directly from Google — no website visit needed”), bullet(“Displays your reviews, photos, and posts, which build instant trust”), bullet(“Shows you exactly how many people searched for you, viewed your profile, and took action”), body(“The setup is free. The results are not.”), body(“Most business owners either don’t have a profile, or set one up years ago and never touched it again. That’s almost as bad as having nothing — Google rewards profiles that are active, complete, and consistently updated.”), body(“I set up and manage Google Business Profiles for Durban businesses. Setup takes under an hour. Ongoing management means your profile stays active, your reviews get responded to, and your ranking keeps climbing.”), body(“If you want to know where you currently stand on Google — or what it would take to fix it — reply to this post or give me a call. No obligation, no jargon.”), body(“Stretch Fletcher | 067-861-4534 | easywebsites.co.za”, { bold: true }), …spacer(1), hRule(ACCENT), h2(“MEDIUM VERSION (700–900 words)”), label(“Headline”), shadeBox([ new Paragraph({ children: [new TextRun({ text: “The Free Tool Most Durban Businesses Are Ignoring — And Why It’s Their Biggest Marketing Mistake”, font: “Arial”, size: 24, bold: true, color: “222222” })] }) ]), …spacer(1), label(“Intro”), body(“There’s a free, powerful marketing tool that Google literally hands to every business — and most small businesses in Durban either haven’t claimed it, set it up incorrectly, or abandoned it after the first week.”), body(“It’s called Google Business Profile (GBP), and it might be the single highest-ROI thing you can do for your local visibility right now.”), h3(“What is Google Business Profile?”), body(“GBP is the listing that appears on Google Maps and in the sidebar when someone searches for a local business. It shows your name, address, phone number, hours, photos, reviews, and more. It’s what people see before they even decide to visit your website.”), body(“When someone searches ‘accountant Durban’ or ‘electrician near me’, Google shows a map with three listings at the top — called the Map Pack. Those three businesses get the lion’s share of the clicks, calls, and customers. Everyone below them gets the scraps.”), h3(“Why most businesses are losing leads they don’t even know about”), body(“Here’s the uncomfortable truth: if your GBP is missing, unclaimed, or poorly set up, you are actively losing customers every single day — and you’ll never know who they were or how many there were.”), body(“Up to 70% of local searchers make a decision directly from the search results page. They don’t click through to websites. They see a profile with good reviews, a clear phone number, and recent activity — and they call. If that profile isn’t yours, the call goes to whoever’s profile is better.”), h3(“What a properly managed GBP does”), bullet(“Gets you into the Map Pack for relevant local searches”), bullet(“Generates direct calls, direction requests, and messages from Google — no website needed”), bullet(“Displays your reviews prominently, building trust before a prospect even contacts you”), bullet(“Lets you post offers, updates, and news that appear directly in search results”), bullet(“Gives you a dashboard showing exactly how many people searched for your business, viewed your profile, and took action”), h3(“The difference between ‘set up’ and ‘optimised'”), body(“Many business owners set up a basic profile and think they’re done. But Google’s algorithm rewards profiles that are active and complete. That means:”), bullet(“Regular posts (at least once a week)”), bullet(“Responding to every review — positive and negative”), bullet(“Updated photos, offers, and business information”), bullet(“Correct categories and service descriptions”), body(“A neglected profile actually hurts you — Google interprets inactivity as a sign the business may have closed or isn’t serious. Consistent activity can boost your Map Pack ranking by 2–3x over a few months.”), h3(“What I do for you”), body(“I set up Google Business Profiles from scratch and manage them on an ongoing basis for Durban businesses. Setup — including full optimisation — takes under an hour. Then I handle the ongoing management: posts, review responses, photo updates, and monthly reporting so you can see exactly what’s working.”), body(“The cost is a fraction of what a single new client is worth. And unlike paid ads, the results compound — a well-managed profile keeps climbing in rankings over time.”), h3(“Next step”), body(“If you want a free check on your current Google visibility — or you’re starting from scratch — get in touch. I’ll tell you exactly where you stand and what it would take to fix it.”), body(“Stretch Fletcher | 067-861-4534 | easywebsites.co.za”, { bold: true }), label(“Author Bio (for blog footer)”), italic(“Stretch Fletcher is a Durban-based web developer and digital marketer. He helps local businesses get found online through Google Business Profile management, SEO, and web design. easywebsites.co.za”), pageBreak() ]; // ─── SECTION 2: SOCIAL MEDIA ────────────────────────────────────────────────── const social = [ h1(“02 — Social Media Copy”), body(“Write the post, add your image, and schedule it. LinkedIn posts should be posted as plain text with line breaks — no hashtag spam. Facebook allows a slightly warmer, more casual tone. Each post below includes a ‘hook’ line designed to stop the scroll.”), hRule(ACCENT), h2(“LINKEDIN POSTS”), label(“Post 1 — Problem/Cost hook (best for cold audiences)”), shadeBox([ body(“If someone searched for your service in Durban right now — would they find you?”), body(“Not your website. Your Google listing.”), body(“Because 70% of local searchers never click through to a website. They find a business on Google Maps, see the reviews, see the phone number, and call.”), body(“If your Google Business Profile is missing, unclaimed, or sitting empty — those calls are going to someone else.”), body(“I set up and manage GBPs for Durban businesses. Setup is free from Google. My management fee pays for itself with one new client.”), body(“Reply or DM me if you want to know where you currently stand. Happy to take a look at no charge.”), body(“#DurbanBusiness #GoogleBusinessProfile #LocalSEO #DigitalMarketing #EasyWebsites”), ]), …spacer(1), label(“Post 2 — Results/credibility hook”), shadeBox([ body(“Most small businesses in Durban are missing from Google Maps entirely.”), body(“Not because they don’t exist. Because their Google Business Profile is unclaimed, incomplete, or never set up.”), body(“Here’s what a fully optimised GBP delivers:”), body(“→ You appear in the Map Pack for local searches”), body(“→ Customers can call you directly from Google”), body(“→ Reviews build trust before they even visit your site”), body(“→ Google shows you how many people found you and what they did next”), body(“And it’s free from Google. You just have to claim it, set it up properly, and keep it active.”), body(“That last part — keeping it active — is where most people give up. I manage it for you.”), body(“DM me or visit easywebsites.co.za if you want to get started.”), body(“#DurbanBusiness #GoogleMaps #LocalMarketing #SmallBusiness #GBP”), ]), …spacer(1), label(“Post 3 — Short punchy version (for engagement)”), shadeBox([ body(“Google gives every business a free marketing tool.”), body(“Most businesses never use it properly.”), body(“It’s called Google Business Profile.”), body(“It gets you onto Google Maps. It generates calls. It builds trust with reviews. It’s completely free from Google.”), body(“The only cost is the time to set it up and keep it updated — which is what I do for my clients.”), body(“If your business isn’t showing up on Google Maps, let’s fix that. Comment below or send me a message.”), body(“#Durban #GoogleBusinessProfile #LocalSEO”), ]), …spacer(1), hRule(ACCENT), h2(“FACEBOOK POSTS”), label(“Post 1 — Conversational/direct”), shadeBox([ body(“Quick question for Durban business owners…”), body(“Have you Googled your own business lately? Not searched for your website — Googled it the way a customer would, like ‘your business name + Durban.'”), body(“What comes up?”), body(“If there’s no Google Maps listing, no reviews, no phone number — that’s a problem. Because that’s how most local customers decide who to call.”), body(“Google Business Profile fixes this. It’s free, it works, and it generates real local leads.”), body(“I set it up and manage it for you. DM me or call 067-861-4534 to find out more. 👇”), ]), …spacer(1), label(“Post 2 — Story/social proof angle”), shadeBox([ body(“I sent an email to a local business owner last week about Google Business Profile.”), body(“Her reply: ‘Just what I need — run with it.'”), body(“That’s how simple this is. Most business owners know they’re missing something online. GBP is usually a big part of what’s missing.”), body(“Once it’s set up and verified, you appear on Google Maps, customers can call you directly, and your reviews start building a reputation that works for you 24/7.”), body(“If you want the same — message me or visit easywebsites.co.za. Happy to chat. 🙌”), ]), …spacer(1), label(“Post 3 — Offer/urgency angle”), shadeBox([ body(“📍 Durban business owners — this one’s for you.”), body(“If you don’t have a verified Google Business Profile, you’re invisible to anyone searching on Google Maps.”), body(“This month I’m helping a handful of local businesses get set up properly. Full setup + first month of management included.”), body(“Takes less than an hour of your time. Results can start within days of verification.”), body(“Drop a comment or send me a message to find out if there’s a spot available. ✅”), ]), label(“Image brief (for all posts)”), body(“One core image works across all channels. Suggested: a clean split graphic showing a Google Maps result on one side and a phone with an incoming call on the other, with the text ‘Is your Durban business on Google Maps?’ Alternatively, a screenshot of a real GBP listing (anonymised) showing the call/directions/message buttons.”), pageBreak() ]; // ─── SECTION 3: LEAD MAGNET ─────────────────────────────────────────────────── const leadMagnet = [ h1(“03 — Lead Magnet”), body(“The lead magnet is what you offer in exchange for an email address. It also warms up prospects before the email sequence. For GBP, a checklist is the fastest to create and very high perceived value. Below is the complete copy — format it as a branded PDF.”), hRule(ACCENT), h2(“Lead Magnet: Free Checklist”), shadeBox([ new Paragraph({ children: [new TextRun({ text: “\”The Durban Business Owner’s Google Visibility Checklist\””, font: “Arial”, size: 26, bold: true, color: BRAND })] }), new Paragraph({ spacing: { before: 80 }, children: [new TextRun({ text: “10 things to check — and fix — so local customers can actually find you on Google”, font: “Arial”, size: 22, italics: true, color: GRAY })] }) ]), …spacer(1), label(“Intro copy (top of the checklist PDF)”), body(“If you’ve ever wondered why your competitor shows up on Google Maps and you don’t — this checklist will tell you exactly why. Work through each item below. Every tick is money left on the table if it’s not done.”), …spacer(1), h3(“The 10-Point Checklist”), bullet(“Your Google Business Profile is claimed and verified (not just created — verified)”), bullet(“Your business name matches your real-world signage and website exactly”), bullet(“Your primary business category is as specific as possible (not just ‘company’)”), bullet(“Your business description is complete, uses local keywords, and is at least 250 characters”), bullet(“Your profile has at least 5 high-quality photos (exterior, interior, team, product/service)”), bullet(“Your hours are correct — including public holiday hours”), bullet(“You have at least 5 Google reviews, and you’ve responded to every one”), bullet(“You’ve posted an update, offer, or news item in the last 30 days”), bullet(“Your services/products are listed with descriptions and pricing (if applicable)”), bullet(“Your website URL and phone number match exactly what’s on your website”), …spacer(1), label(“Scoring guide (bottom of the PDF)”), body(“8–10 ticks: You’re in good shape. Focus on staying consistent.”), body(“5–7 ticks: You’re leaving real leads on the table. Start with items 1 and 7.”), body(“0–4 ticks: Your profile is either missing or invisible. Let’s fix this.”), …spacer(1), label(“CTA at the bottom of the PDF”), shadeBox([ new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: “Want me to run through this checklist on your profile — for free?”, font: “Arial”, size: 22, bold: true, color: BRAND })] }), new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 80 }, children: [new TextRun({ text: “Call 067-861-4534 or visit easywebsites.co.za”, font: “Arial”, size: 22, color: GRAY })] }) ]), …spacer(1), label(“Where to offer this checklist”), bullet(“On your landing page (main CTA — ‘Download Free Checklist’)”), bullet(“In all three LinkedIn and Facebook posts (link in first comment or bio)”), bullet(“In Email 1 of both sequences as the opening hook”), bullet(“As a direct DM/email response when someone enquires”), pageBreak() ]; // ─── SECTION 4: EMAIL SEQUENCES ─────────────────────────────────────────────── const emails = [ h1(“04 — Email Sequences”), body(“Two parallel sequences: one for existing clients (warmer, shorter, upsell angle), one for prospects (more education, more trust-building). Each is 4 emails. Send emails 2–3 days apart. Personalise the [NAME] fields before sending.”), hRule(ACCENT), h2(“SEQUENCE A — EXISTING CLIENTS”), body(“Tone: warm, collegial, assumes a relationship. Focus on adding value to what they already do with you, or opening a conversation about what they’re missing.”), …spacer(1), emailBox(1, “Quick question about your Google listing, [NAME]”, “Existing Clients”, [ “Hi [NAME],”, “”, “Hope things are going well on your end.”, “”, “Quick one: have you ever checked how your business shows up on Google Maps? Not your website — your actual Google Business Profile listing.”, “”, “I ask because I’ve been auditing a few local businesses recently and the results are eye-opening. Some well-established companies are completely invisible on Maps, or have listings with wrong hours, no photos, and zero reviews.”, “”, “I’ve put together a short checklist that takes about 5 minutes to go through:”, “”, “**→ [LINK] Download: The Durban Business Owner’s Google Visibility Checklist**”, “”, “Have a look and see how you score. If anything jumps out, I’m happy to take a look with you — no charge for existing clients.”, “”, “Stretch” ] ), …spacer(1), emailBox(2, “What your Google profile is (or isn’t) doing right now”, “Existing Clients”, [ “Hi [NAME],”, “”, “Did you get a chance to go through the checklist I sent last week?”, “”, “Here’s something worth knowing: Google Business Profile is one of the few marketing tools where being active matters more than being big. A small local business with a well-managed profile consistently outranks bigger competitors who’ve left theirs to gather dust.”, “”, “What ‘well-managed’ looks like in practice:”, “• Weekly posts (offers, updates, news)”, “• Responding to every review within 48 hours”, “• Fresh photos regularly”, “• Correct and complete service listings”, “”, “Most business owners set up a profile once and never touch it again. Google sees that and quietly drops the ranking.”, “”, “I manage this ongoing for a number of clients in Durban — it’s affordable, hands-off for you, and the results show up in actual calls and leads, not just vanity metrics.”, “”, “If this sounds like something worth exploring for your business, just reply and we’ll set up a time to talk.”, “”, “Stretch” ] ), …spacer(1), emailBox(3, “A quick example — what this looks like in practice”, “Existing Clients”, [ “Hi [NAME],”, “”, “A client I recently set up on Google Business Profile was getting zero calls from Google. Within 6 weeks of a complete setup and consistent management — posts, reviews, photos, the works — they were receiving 3–5 enquiry calls a week directly from their Google listing.”, “”, “No paid ads. No website changes. Just a properly set up and actively managed GBP.”, “”, “I’d like to do the same for your business.”, “”, “Here’s what’s included in my GBP Management service:”, “• Full setup or audit of your existing profile”, “• Verification (I handle the whole process — including follow-up if the postcard is delayed)”, “• Monthly posts, review management, and photo updates”, “• Monthly report showing calls, profile views, and search terms”, “”, “Investment: [YOUR PRICE] per month. Month-to-month, no lock-in.”, “”, “Given that a single new client is worth far more than that in most industries, it tends to pay for itself quickly.”, “”, “Want to get started? Just reply to this email or call me on 067-861-4534.”, “”, “Stretch” ] ), …spacer(1), emailBox(4, “Last note on this — then I’ll leave it with you”, “Existing Clients”, [ “Hi [NAME],”, “”, “I’ll keep this short.”, “”, “I’ve been in touch about Google Business Profile management over the last few weeks. If it’s not the right time or the right fit, no worries at all — just let me know and I won’t mention it again.”, “”, “But if you’ve been meaning to look into it and just haven’t gotten around to it — that’s exactly the kind of thing I take off your plate. You reply with a yes, I handle everything from there.”, “”, “Call or reply anytime: 067-861-4534 | easywebsites.co.za”, “”, “Stretch” ] ), …spacer(1), hRule(ACCENT), h2(“SEQUENCE B — PROSPECTS”), body(“Tone: professional but accessible. More educational — assume they know less. Build trust before the offer. The lead magnet should arrive with Email 1 if they opted in via a form; include the link either way.”), …spacer(1), emailBox(1, “Your free checklist — plus one thing most Durban businesses get wrong”, “Prospects”, [ “Hi [NAME],”, “”, “Thanks for your interest — here’s your checklist:”, “”, “**→ [LINK] The Durban Business Owner’s Google Visibility Checklist**”, “”, “Print it out, work through it, and see where you land.”, “”, “The one thing I see most often when I audit a local business profile: it exists, but it’s never been verified. An unverified profile is like a shop with no sign — Google won’t show it prominently, and customers can’t trust that it’s current.”, “”, “Verification is free. It just requires a bit of patience — especially in South Africa, where the postal service means the PIN postcard can take time to arrive. (I have a process for chasing this when it gets delayed — more on that later.)”, “”, “I’ll follow up in a few days with more on what a fully optimised profile looks like in practice.”, “”, “Stretch Fletcher”, “067-861-4534 | easywebsites.co.za | Durban, KZN” ] ), …spacer(1), emailBox(2, “What Google actually looks for in a local business listing”, “Prospects”, [ “Hi [NAME],”, “”, “Following up from my last email.”, “”, “Google ranks local business profiles based on three things: relevance, distance, and prominence.”, “”, “You can’t control distance. But relevance and prominence are entirely within your control — and that’s where most businesses fall short.”, “”, “**Relevance** means your profile clearly says what you do, in the words people actually search for. Not vague — specific. ‘Web designer Durban’ not just ‘digital services.'”, “”, “**Prominence** is built over time through reviews, regular posts, complete information, and profile activity. Google treats an active profile the same way it treats a busy shop — as a signal that the business is legitimate and worth recommending.”, “”, “The good news: you don’t need a big budget to rank well locally. A well-managed GBP from a small independent business will regularly outrank larger companies who’ve neglected theirs.”, “”, “Next email I’ll show you what this looks like in a real example.”, “”, “Stretch” ] ), …spacer(1), emailBox(3, “Real results from a managed Google Business Profile”, “Prospects”, [ “Hi [NAME],”, “”, “A Durban business I work with went from invisible on Google Maps to receiving 3–5 enquiry calls per week — in under two months.”, “”, “No paid advertising. No big budget. Just a properly set up, consistently managed Google Business Profile.”, “”, “Here’s what I did:”, “• Claimed and fully completed the profile”, “• Handled verification (including follow-up when the postcard took time)”, “• Added high-quality photos and a keyword-rich business description”, “• Set up a posting schedule — one post per week”, “• Responded to all reviews within 24 hours”, “”, “The result: Google started ranking the profile in the Map Pack for local searches. Customers found it, saw the reviews, and called.”, “”, “This is what I do for businesses in Durban. I handle everything so you don’t have to think about it.”, “”, “I’ll share the details of my service in my next email. If you’d rather chat now, call me on 067-861-4534.”, “”, “Stretch” ] ), …spacer(1), emailBox(4, “Here’s what it costs — and what you get”, “Prospects”, [ “Hi [NAME],”, “”, “Here’s what my Google Business Profile Management service includes:”, “”, “• Full profile setup or audit of your existing listing”, “• Verification — I manage the whole process including any delays”, “• Weekly posts to keep your profile active and ranking”, “• Review monitoring and responses”, “• Photo and content updates”, “• Monthly report: calls received, profile views, search terms used to find you”, “”, “Investment: [YOUR PRICE] per month. No contract, cancel anytime.”, “”, “To give you a sense of the value: most businesses in Durban convert one new client worth R3,000–R10,000+ per month from their Google profile once it’s properly set up. The management fee pays for itself with a single enquiry.”, “”, “If you’d like to get started — or just have questions — reply to this email or call me directly:”, “”, “067-861-4534 | easywebsites.co.za”, “”, “Looking forward to getting you visible.”, “”, “Stretch Fletcher”, “Web Developer & Digital Marketer | Durban, KZN” ] ), pageBreak() ]; // ─── SECTION 5: LANDING PAGE ────────────────────────────────────────────────── const landing = [ h1(“05 — Landing Page Copy”), body(“This is the full copy for a single-service landing page. Your web developer (or you, if using a page builder) drops this into a template. The structure follows the proven sequence: Hook → Problem → Solution → Proof → Offer → CTA. The page should have one goal: get an enquiry or a download.”), hRule(ACCENT), h2(“PAGE STRUCTURE & COPY”), label(“Section 1 — Hero (above the fold)”), shadeBox([ new Paragraph({ children: [new TextRun({ text: “HEADLINE:”, font: “Arial”, size: 20, bold: true, color: BRAND })] }), new Paragraph({ spacing: { before: 60 }, children: [new TextRun({ text: “Is Your Durban Business Invisible on Google Maps?”, font: “Arial”, size: 28, bold: true, color: “111111” })] }), new Paragraph({ spacing: { before: 120 }, children: [new TextRun({ text: “SUB-HEADLINE:”, font: “Arial”, size: 20, bold: true, color: BRAND })] }), new Paragraph({ spacing: { before: 60 }, children: [new TextRun({ text: “I set up and manage your Google Business Profile so local customers find you first — not your competitors.”, font: “Arial”, size: 22, color: GRAY })] }), new Paragraph({ spacing: { before: 120 }, children: [new TextRun({ text: “PRIMARY CTA BUTTON:”, font: “Arial”, size: 20, bold: true, color: BRAND })] }), new Paragraph({ spacing: { before: 60 }, children: [new TextRun({ text: “Get My Free Visibility Checklist →”, font: “Arial”, size: 22, bold: true, color: ACCENT })] }), new Paragraph({ spacing: { before: 60 }, children: [new TextRun({ text: “SECONDARY CTA (below button):”, font: “Arial”, size: 18, bold: true, color: BRAND })] }), new Paragraph({ spacing: { before: 40 }, children: [new TextRun({ text: “Or call Stretch directly: 067-861-4534”, font: “Arial”, size: 20, italics: true, color: GRAY })] }), ]), …spacer(1), label(“Section 2 — The Problem”), shadeBox([ new Paragraph({ children: [new TextRun({ text: “HEADLINE: Up to 70% of local customers never visit your website.”, font: “Arial”, size: 22, bold: true, color: “111111” })] }), new Paragraph({ spacing: { before: 100 }, children: [new TextRun({ text: “They search on Google. They see the Map results. They call whoever shows up.”, font: “Arial”, size: 22, color: GRAY })] }), new Paragraph({ spacing: { before: 80 }, children: [new TextRun({ text: “If your Google Business Profile is missing, unverified, or sitting empty — those calls are going to someone else. Every day.”, font: “Arial”, size: 22, color: GRAY })] }), ]), …spacer(1), label(“Section 3 — The Solution”), shadeBox([ new Paragraph({ children: [new TextRun({ text: “HEADLINE: I fix that. Completely. So you don’t have to think about it.”, font: “Arial”, size: 22, bold: true, color: “111111” })] }), new Paragraph({ spacing: { before: 100 }, children: [new TextRun({ text: “Here’s what you get:”, font: “Arial”, size: 22, bold: true, color: GRAY })] }), new Paragraph({ spacing: { before: 60 }, children: [new TextRun({ text: “✓ Full profile setup or audit of your existing listing”, font: “Arial”, size: 22, color: GRAY })] }), new Paragraph({ children: [new TextRun({ text: “✓ Verification — including follow-up if the postcard doesn’t arrive”, font: “Arial”, size: 22, color: GRAY })] }), new Paragraph({ children: [new TextRun({ text: “✓ Weekly posts to keep your ranking climbing”, font: “Arial”, size: 22, color: GRAY })] }), new Paragraph({ children: [new TextRun({ text: “✓ Review monitoring and professional responses”, font: “Arial”, size: 22, color: GRAY })] }), new Paragraph({ children: [new TextRun({ text: “✓ Monthly report showing calls, views, and search terms”, font: “Arial”, size: 22, color: GRAY })] }), ]), …spacer(1), label(“Section 4 — Social Proof”), shadeBox([ new Paragraph({ children: [new TextRun({ text: “HEADLINE: What clients say”, font: “Arial”, size: 22, bold: true, color: “111111” })] }), new Paragraph({ spacing: { before: 80 }, children: [new TextRun({ text: “TESTIMONIAL 1 (placeholder — replace with a real one):”, font: “Arial”, size: 18, bold: true, color: BRAND })] }), new Paragraph({ spacing: { before: 40 }, children: [new TextRun({ text: “\”Stretch set up our Google profile and within a few weeks we were getting calls we’d never had before. Simple, affordable, and it actually works.\””, font: “Arial”, size: 22, italics: true, color: GRAY })] }), new Paragraph({ spacing: { before: 40 }, children: [new TextRun({ text: “— [Client Name], [Business Type], Durban”, font: “Arial”, size: 20, color: GRAY })] }), new Paragraph({ spacing: { before: 120 }, children: [new TextRun({ text: “TESTIMONIAL 2 (placeholder):”, font: “Arial”, size: 18, bold: true, color: BRAND })] }), new Paragraph({ spacing: { before: 40 }, children: [new TextRun({ text: “\”I had no idea how many people were searching for my service and not finding me. Once Stretch fixed my listing, the difference was immediate.\””, font: “Arial”, size: 22, italics: true, color: GRAY })] }), new Paragraph({ spacing: { before: 40 }, children: [new TextRun({ text: “— [Client Name], [Business Type], Durban”, font: “Arial”, size: 20, color: GRAY })] }), new Paragraph({ spacing: { before: 120 }, children: [new TextRun({ text: “NOTE: Add real testimonials as soon as you have them. Even one strong testimonial significantly improves conversion. Faeeza Govender will be a strong candidate once her profile is live and results are visible.”, font: “Arial”, size: 18, italics: true, color: BRAND })] }), ]), …spacer(1), label(“Section 5 — The Offer”), shadeBox([ new Paragraph({ children: [new TextRun({ text: “HEADLINE: Ready to start showing up on Google?”, font: “Arial”, size: 22, bold: true, color: “111111” })] }), new Paragraph({ spacing: { before: 100 }, children: [new TextRun({ text: “Two ways to get started:”, font: “Arial”, size: 22, bold: true, color: GRAY })] }), new Paragraph({ spacing: { before: 80 }, children: [new TextRun({ text: “Option 1 — Free Checklist”, font: “Arial”, size: 22, bold: true, color: ACCENT })] }), new Paragraph({ spacing: { before: 40 }, children: [new TextRun({ text: “Download the free 10-point Google Visibility Checklist and see exactly where you stand — before you spend a cent.”, font: “Arial”, size: 22, color: GRAY })] }), new Paragraph({ spacing: { before: 80 }, children: [new TextRun({ text: “Option 2 — Let’s Talk”, font: “Arial”, size: 22, bold: true, color: ACCENT })] }), new Paragraph({ spacing: { before: 40 }, children: [new TextRun({ text: “Call or message me directly. I’ll take a look at your current Google visibility and tell you what it would take to fix it. No jargon, no pressure.”, font: “Arial”, size: 22, color: GRAY })] }), ]), …spacer(1), label(“Section 6 — Final CTA (bottom of page)”), shadeBox([ new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: “Get your business on Google Maps — and keep it there.”, font: “Arial”, size: 26, bold: true, color: “111111” })] }), new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 100 }, children: [new TextRun({ text: “BUTTON: Download Free Checklist →”, font: “Arial”, size: 22, bold: true, color: ACCENT })] }), new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 80 }, children: [new TextRun({ text: “Or call 067-861-4534 | easywebsites.co.za | Durban, KZN”, font: “Arial”, size: 20, color: GRAY })] }), ]), pageBreak() ]; // ─── SECTION 6: NOTES & NEXT STEPS ─────────────────────────────────────────── const notes = [ h1(“06 — Notes & Next Steps”), hRule(ACCENT), h2(“Rollout order”), body(“Do not try to launch everything at once. The recommended order:”), bullet(“Week 1: Create the checklist PDF (lead magnet). This unlocks everything else.”, “numbers”), bullet(“Week 1: Publish the short blog post on your website.”, “numbers”), bullet(“Week 2: Post LinkedIn Post 1 and Facebook Post 1 with a link to the checklist.”, “numbers”), bullet(“Week 2: Send Email 1 to your prospect list and Email 1 to your client list.”, “numbers”), bullet(“Week 3–4: Continue email sequences 2–4, 2–3 days apart.”, “numbers”), bullet(“Week 4: Launch the landing page once you have at least one real testimonial.”, “numbers”), …spacer(1), h2(“Pricing placeholder”), body(“This template uses [YOUR PRICE] as a placeholder in the email sequences and landing page. Set your price before sending. A common approach for Durban: R800–R1,500/month for ongoing management, with a once-off setup fee of R500–R1,000. Adjust based on your margin and market.”), …spacer(1), h2(“Testimonials”), body(“This is the one gap in this kit right now. The landing page placeholders are deliberate — do not publish the page with placeholder testimonials. Your first real testimonial from a managed client (Faeeza Govender is the obvious first candidate) unlocks the full landing page. Ask for it 4–6 weeks after their profile goes live and results are visible.”), …spacer(1), h2(“Repeating this template for your other services”), body(“Once this GBP version is complete and live, the template for your next service (Website Design, SEO, etc.) follows the exact same structure:”), bullet(“Replace the service name, problem, and benefits throughout”), bullet(“New lead magnet relevant to that service”), bullet(“New email sequences with the same 4-email arc”), bullet(“New landing page with the same 6-section structure”), body(“Each repeat takes roughly half the time of the original once you have the system working.”), …spacer(2), hRule(BRAND), new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 120 }, children: [new TextRun({ text: “Stretch Fletcher · 067-861-4534 · easywebsites.co.za · Durban, KZN”, font: “Arial”, size: 20, color: GRAY })] }) ]; // ─── ASSEMBLE DOCUMENT ──────────────────────────────────────────────────────── const doc = new Document({ styles: { default: { document: { run: { font: “Arial”, size: 22 } } }, paragraphStyles: [ { id: “Heading1”, name: “Heading 1”, basedOn: “Normal”, next: “Normal”, quickFormat: true, run: { size: 36, bold: true, font: “Arial”, color: BRAND }, paragraph: { spacing: { before: 480, after: 120 }, outlineLevel: 0 } }, { id: “Heading2”, name: “Heading 2”, basedOn: “Normal”, next: “Normal”, quickFormat: true, run: { size: 28, bold: true, font: “Arial”, color: ACCENT }, paragraph: { spacing: { before: 360, after: 120 }, outlineLevel: 1 } }, ] }, numbering: { config: [ { reference: “bullets”, levels: [{ level: 0, format: LevelFormat.BULLET, text: “•”, alignment: AlignmentType.LEFT, style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] }, { reference: “numbers”, levels: [{ level: 0, format: LevelFormat.DECIMAL, text: “%1.”, alignment: AlignmentType.LEFT, style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] }, ] }, sections: [{ properties: { page: { size: { width: 12240, height: 15840 }, margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } } }, children: [ …cover, …blog, …social, …leadMagnet, …emails, …landing, …notes ] }] }); Packer.toBuffer(doc).then(buf => { fs.writeFileSync(“/home/claude/GBP_Campaign_Kit_EasyWebsites.docx”, buf); console.log(“Done.”); });

Facebook Twitter
  • Home
  • Services
  • Privacy
  • Biz Domain
  • Payment Options- Domain + Email Hosting

© 2026 Easy Websites Powered by Easy Websites 

Scroll to top
  • Home
    • Results
    • Real Results
  • DigiCard
  • Contact
  • Blog
We use cookies to ensure that we give you the best experience on our website. If you continue to use this site we will assume that you are happy with it.