<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>Dullu Digital Daily</title>
<link>https://blog.dullugroup.co.ke/</link>
<atom:link href="https://blog.dullugroup.co.ke/feed.xml" rel="self" type="application/rss+xml"/>
<description>Daily field notes from Dr. Dullu, founder of Dullu Digital (DDi) in Nairobi, Kenya. What actually got built, sold, broken and fixed each day while growing a web development and marketing agency.</description>
<language>en</language>
<lastBuildDate>Fri, 06 Nov 2026 21:37:17 +0300</lastBuildDate>
<generator>dullz-blog</generator>
<item>
<title>Rebuilding My Agency Site and Rethinking Our Pricing</title>
<link>https://blog.dullugroup.co.ke/posts/agency-pricing-site-rebuild/</link>
<guid isPermaLink="true">https://blog.dullugroup.co.ke/posts/agency-pricing-site-rebuild/</guid>
<pubDate>Fri, 06 Nov 2026 18:00:00 +0300</pubDate>
<description>Agency pricing math, a domain move for the DDi site, three rejected design proposals for a games studio client, and the cost-to-serve numbers behind it all.</description>
<content:encoded><![CDATA[<p>Today started with me poking a hole in my own offer. We sell content at one post a day, and I could not explain why. That one question turned into a full day of agency pricing math, a new domain for the DDi site, and three design proposals a client has not seen yet.</p>
<h2 id="where-our-agency-pricing-math-actually-broke">Where our agency pricing math actually broke</h2>
<p>One piece of content a day is not aggression, it is a habit. If a client is paying for reach, three a day is closer to honest. So I pulled the packages apart and looked at what the numbers really say.</p>
<p>Forty five thousand shillings one off plus eight thousand a month is ninety six thousand in year one. Thirty thousand a month is three hundred and sixty thousand. Those are not the same business. The retainer tier is where the agency lives, and I had been treating it like the cheap option with extras bolted on.</p>
<p>Then I did something I should have done months ago and worked out cost to serve. Not vibes, actual inputs:</p>
<ul><li>Token spend on the AI tooling I run every day, which is now a real line item, not a rounding error</li><li>Internet at roughly two hundred to three hundred shillings a day</li><li>Electricity, which in Nairobi is never a flat number</li><li>My own hours, which I had never priced properly</li></ul>
<p>The hourly baseline came from an odd place. I mentor a student into this line of work, an hour and a half a week, twenty thousand shillings paid in three instalments because she is salaried and that is what she can manage. I teach for a month. Four sessions, six hours, twenty thousand. That is a real hourly rate, revealed by what somebody will actually pay. Once I had that number, a one week job at twenty five thousand (ten thousand deposited, fifteen pending) stopped looking like a win and started looking like what it was, which is me proving myself. Fine. But you cannot build a price list out of proving yourself.</p>
<p>The other thing I decided: stop paywalling the basics. SEO is not premium. It is table stakes. If the paid tiers are going to mean anything, they need to contain things a client genuinely cannot get for free. We are a full service marketing agency with a specialty in web development, and the packages should read that way instead of hiding ordinary work behind a gate.</p>
<h2 id="taking-the-old-ddi-site-down-and-buying-a-new-domain">Taking the old DDi site down and buying a new domain</h2>
<p>I do not like the current site. A client told me plainly that there is too much happening at once, and once you hear that you cannot unhear it. So I bought a new domain and decided to rebuild from scratch rather than patch.</p>
<p>I spent a chunk of the morning trying to shortcut it by remixing a reference template. Bad call. The remix path was slow and it kept producing half work, so I killed it and switched to studying the reference and coding our own. That cost me maybe an hour and a half of nothing. Worth saying out loud.</p>
<p>The plan that survived:</p>
<ul><li>New primary domain for DDi, with the CRM left where it currently sits so nothing breaks</li><li>Full code wiring, including routing email properly to DDi specific addresses</li><li>Old site goes dark only after every piece of the new wiring is tested</li><li>Brand colour direction tightened, because the heavy orange look I had been admiring elsewhere actually works and ours does not</li><li>Testimonials pulled from our public reviews for now, real ones added later</li><li>A work section built from concept designs we have already done, with every identifying detail stripped out</li></ul>
<p>That last one matters. I want a portfolio section, and I do have a retail client project worth showing, but I am not putting a client's logo and work on our site on a whim. That is a conversation to have with them, not a decision to make at nine in the morning.</p>
<h2 id="advising-a-retail-client-on-a-december-campaign">Advising a retail client on a December campaign</h2>
<p>In the middle of the site work, a conversation came back on WhatsApp. A retail client is willing to change approach if it brings real money, and a partner was pushing for a big marketing push with premium targets attached.</p>
<p>My first draft of advice was generic, and I caught it. Generic strategy is worse than no strategy, because it sounds like work. The client is a middleman. That changes everything. He does not need brand awareness, he needs demand he can fulfil and a margin he can defend.</p>
<p>So the campaign got concrete. Three strong pieces of video content, not one, so there is footage to cut and repurpose. Push them from 21 November to 10 January, which is the whole buying season here. Paid support across the big ad platforms. And critically, start from the revenue target and work backwards into the ad spend, rather than picking a budget and hoping. I also gave him the production investment estimate so he could see the real shape of it before saying yes.</p>
<h2 id="three-proposals-for-a-games-studio-client-none-of-them-landi">Three proposals for a games studio client, none of them landing</h2>
<p>The last stretch of the day was the hardest. A games studio client wants a blog first site that says <em>we are young, we are wild, we are doing this</em>, carrying over everything already on their current site, with zero AI texture.</p>
<p>I tried a magazine style reference and it was wrong. A magazine template is a magazine, not a game development studio. Then I tried building our own with that reference as inspiration and it still came out flat. Generic cards, cold colours, scroll behaviour that felt like a demo instead of a studio. By evening I deleted the reference approach entirely and started from first principles instead: who the studio actually works with, what their competitors are serving, what the industry vibe is, what pages the brief genuinely demands. A ten plus point checklist for what the homepage has to do before anyone writes a line of layout.</p>
<p>What I have now is proposal one. Not approved, not loved, just honest enough to show. We are giving them three. Also worth noting I pushed back on putting public prices on their site, because they do not publish prices and inventing that is not design, it is making things up.</p>
<p>Last thing before I closed the laptop: I set up this blog. Automated, SEO built in, publishing every day off the actual record of what I do. No reminders needed.</p>
<h2 id="what-i-would-tell-another-founder">What I would tell another founder</h2>
<p>Work out your cost to serve before you touch your price list, and include the boring inputs: internet, power, tokens, your own hours at a rate someone has actually paid you. The number will probably embarrass you, which is the point. And when you catch yourself remixing a template to save time, check whether you are actually saving time or just avoiding the part where you have to decide what the thing should be.</p>]]></content:encoded>
<category>pricing</category><category>web design</category><category>client work</category><category>agency</category><category>nairobi</category>
</item><item>
<title>Shipping a Car Hire Site Without GitHub Access</title>
<link>https://blog.dullugroup.co.ke/posts/shipping-client-site-cloudflare-admin/</link>
<guid isPermaLink="true">https://blog.dullugroup.co.ke/posts/shipping-client-site-cloudflare-admin/</guid>
<pubDate>Tue, 03 Nov 2026 18:00:00 +0300</pubDate>
<description>Shipping a client car hire site to Cloudflare without GitHub access, building a full admin panel, and logging the work in our own CRM at day&#x27;s end.</description>
<content:encoded><![CDATA[<p>Tuesday was supposed to be a quiet prep day. Instead I spent most of it shipping a client site to Cloudflare the hard way, because the phone with my GitHub two factor codes was sitting at home while I was at the office. The site went live anyway, with a full admin panel on top, and I ended the day logging the hours into our own CRM.</p>
<h2 id="the-crm-gap-i-found-in-my-own-tool">The CRM gap I found in my own tool</h2>
<p>I started the morning not on client work but on our CRM. I went to edit the contact details on a lead and could not. There was no way to fix a phone number once a prospect had been promoted to a lead, and no way to push someone back down from lead to prospect if the deal cooled off.</p>
<p>That is a stupid gap, and it is my own fault for building a one way pipeline. Real sales is not one way. People go quiet, come back, change numbers, change decision makers. If the tool only moves forward, you end up keeping the truth in your head or in WhatsApp instead of in the system. That defeats the whole point of having a CRM.</p>
<p>So that got fixed first. Editable contact fields on leads, and a reverse move back to prospect. Small change, half the day's annoyance gone.</p>
<h2 id="shipping-a-client-site-to-cloudflare-with-no-github-codes">Shipping a client site to Cloudflare with no GitHub codes</h2>
<p>The main job was a car hire and travel site for a retail client. The files were sitting locally, built but not deployed. The plan was the usual one we use for everything: GitHub repo, wired to Cloudflare, push to deploy, done.</p>
<p>Two things went sideways.</p>
<p>First, I had to stop and check whose Cloudflare account was being used. For a second I thought the work was landing in my own account, which would have been a mess to untangle later. It was not, but I made the boundary explicit: the client's domain lives in the client's Cloudflare account. Their domain, their billing, their account. Our GitHub, because the code is ours until the handover is agreed. I gave permissions for the client account setup with one condition, do not log me out of my own.</p>
<p>That is not paranoia. Agency work goes bad when ownership is fuzzy. If a client ever leaves, they should be able to take their domain and their hosting without me having to surgically remove my own account from the middle of it.</p>
<p>Second, the GitHub two factor problem. The repo push needed a code from my phone and the phone was at home. I burned maybe forty minutes on token setup, where the token goes, what to remove, before I accepted that I was solving the wrong problem. The question was not "how do I get into GitHub from here". It was "do I need GitHub to make this site live today".</p>
<p>The answer was no. Cloudflare will take a direct upload. So:</p>
<ul><li>Built the production files locally</li><li>Deployed straight to Cloudflare, no repo in the middle</li><li>Connected the client's domain in their own account</li><li>Dropped the WordPress plan entirely, the site did not need it</li><li>Left the GitHub wiring as a follow up for when I am home with the phone</li></ul>
<p>The site was live. The GitHub connection is a convenience for future deploys, not a requirement for the first one. I had conflated the two because that is how we always do it.</p>
<h2 id="building-an-admin-panel-so-the-client-stops-calling-me">Building an admin panel so the client stops calling me</h2>
<p>A live site with no admin is a site that generates support messages. The client sells cars, stays, transfers and tours. If they cannot add a new car themselves, every single listing becomes a message to me, and I become a very expensive content editor.</p>
<p>So the brief grew, correctly. Admin for every content type on the site, not just cars:</p>
<ul><li>Cars, add, edit, remove, with prices</li><li>Stays, same</li><li>Transfers and tours, same</li><li>The about page content</li><li>Clients and bookings</li></ul>
<p>Prices included everywhere, because a listing without an editable price is useless to them. That was the one thing I made sure of, since pricing is exactly what changes most often and exactly what they will never want to wait on me for.</p>
<p>Then came a stretch of me being short tempered with the process. I kept asking whether the admin was on the main domain yet, whether the change had actually applied, what the final link was. Part of that was my own fault for not writing down what had been deployed where. When you deploy manually instead of through a repo, you lose the deploy history that normally tells you what is live. I asked for the process to be saved to a document precisely because of that.</p>
<p>We also set up an internal email for managing clients, and I put myself on the client's admin as a superadmin. The first login attempt failed, wrong email or password. Of course it did. Nothing goes right the first time on an admin you built an hour ago.</p>
<h2 id="logging-the-work-in-money-and-token-value">Logging the work in money and token value</h2>
<p>The last thing I did was ask for the day's work to be logged in our CRM, in both billable time and money value, and separately in token value, meaning what the AI assistance actually cost to produce it.</p>
<p>I track that second number on purpose. In Nairobi, agency pricing is under constant pressure, and the honest answer to "why does this cost what it costs" has to include what the tooling costs me. If I can build a four module admin panel in an afternoon, that is leverage, but only if I know what the leverage costs. Otherwise I am just guessing at my own margins and quoting on vibes.</p>
<p>The client also asked, at the end, about putting real stay listings on the site grouped under major venues and locations. That is a scope question, not a quick fix, so it stays a scope question until I have costed it properly. I did not promise anything.</p>
<h2 id="what-i-would-tell-another-founder">What I would tell another founder</h2>
<p>Separate the goal from the method you always use. I lost forty minutes trying to get into GitHub when GitHub was never the point, going live was. Also, keep the client's infrastructure in the client's own account from day one, even when it is slower to set up, because fuzzy ownership is a fight you have later at the worst possible moment. And log what the work cost you, in time and in tooling, on the same day you do it. You will not remember accurately next week.</p>]]></content:encoded>
<category>cloudflare</category><category>client work</category><category>crm</category><category>admin panels</category><category>deployment</category>
</item><item>
<title>Three Pitch Sites, One Receipt Problem, 950 Bob Gone</title>
<link>https://blog.dullugroup.co.ke/posts/prospectus-websites-crm-rebuild/</link>
<guid isPermaLink="true">https://blog.dullugroup.co.ke/posts/prospectus-websites-crm-rebuild/</guid>
<pubDate>Mon, 02 Nov 2026 18:00:00 +0300</pubDate>
<description>Building prospectus websites for Kilifi coast prospects, fixing CRM lead and client separation, and why I stopped trying to narrow my agency niche.</description>
<content:encoded><![CDATA[<p>Monday started with me tearing apart my own homepage and ended at half past eleven at night fixing a broken scroll animation on a pitch site nobody has paid for yet. In between I built prospectus websites for three coast prospects, rewrote my hero copy, and finally forced my CRM to stop treating leads and clients as the same thing. The honest version is that most of the day was unpaid speculative work, and I chose it on purpose.</p>
<h2 id="trying-to-pick-a-niche-then-refusing-to">Trying to pick a niche, then refusing to</h2>
<p>I opened the day by reviewing the DDi site the way a hard-nosed marketer would. No mercy, just scrutiny. The hero was weak. A black band at the bottom saying something about "one team" looked pasted on from a different website. The testimonial placement was wrong.</p>
<p>Then I went down a hole that cost me an hour. I decided DDi should be known for one industry. I tried to name Africa's big industries (logistics, transport, construction, tourism) and work out what they lack digitally, then plant a flag there. I went around in circles on it. I asked for an interactive artifact so I could watch the reasoning happen, got frustrated, asked the same question again, got frustrated again.</p>
<p>Then I stopped and asked the better question: why am I narrowing now? I have no volume problem that a niche solves. I have a few past projects across completely different sectors (a diaspora community project, a sports events site, a fashion brand I founded and marketed myself). Picking one lane today would be guessing.</p>
<p>So I let the market decide. Keep delivering across sectors, watch what repeats, and let the "we are known for" sentence write itself in six months from actual demand. That was the right call and it took me 40 minutes of arguing with myself to get there.</p>
<p>New hero and callout written. Deployed. Then I looked at my browser and it was a mess, so I went back in and fixed the composition properly.</p>
<h2 id="why-leads-and-clients-cannot-share-one-interface">Why leads and clients cannot share one interface</h2>
<p>A retail client sent through a 10,000 shilling commitment deposit for a refacing job. The full invoice I had shown him was bigger, deliberately, so he could see the shape of the whole thing. But the deposit was for the refacing only. I had already sent a 25,000 invoice. Now I needed to issue a receipt for 10,000 against it, and my own system had no clean way to do that.</p>
<p>That exposed a bigger problem. My CRM was showing leads and clients through the same interface, which means a lead can be half a client and a client can still look like a lead. Garbage in, garbage forever.</p>
<p>So I rebuilt the segregation:</p>
<ul><li>Separate parameters for leads and for clients. No shared fields pretending to be both.</li><li>A folder per client inside the CRM, so everything about one job lives in one place.</li><li>A new enquiries tab, separate from prospects, because someone filled my website form and I got the email but nothing appeared in the CRM at all.</li><li>No overflow between stages, no double existence, no record sitting in two pipeline positions.</li><li>Partial payments and receipts that do not fight the original invoice amount.</li></ul>
<p>My dashboard money section was also broken, only showing outstanding shillings and nothing else. Fixed that too.</p>
<p>Then I hit a smaller thing I had not planned for. I am teaching this trade to a student, one-on-one. Four sessions in November, an hour and a half each, covering design thinking, tool familiarity, client sourcing and sales, then service delivery and consistency. 20,000 for the whole thing, paid in three installments, at a cyber in Kilifi where I pay about 500 per session for the space. That is not a lead and it is not a normal client. It needed its own segment, and an agreement template that matches a teaching arrangement rather than a build. Set both up.</p>
<h2 id="prospectus-sites-as-the-actual-sales-pitch">Prospectus sites as the actual sales pitch</h2>
<p>The rest of the day was design, and this is where I was most ruthless with myself.</p>
<p>A dhow operator came back with answers to my discovery questions plus two posters. I had promised them three concepts. The first thing I was shown was AI slop. Generic, soulless, the kind of layout that could belong to any business anywhere. I killed it. The second attempt was goofy. Killed that too.</p>
<p>What fixed it was reference. I went and found specific templates I actually admire and said build from this level of craft, not from a generic idea of a website. That changed everything. Once there was a real composition reference, the work got serious.</p>
<p>Four pitch sites by the end of the day, in various states:</p>
<ul><li>A tours and safaris operator who agreed I could redesign their existing site. They said go all out, so I did.</li><li>A restaurant prospect in Kilifi, where a co-owner told me they already have a developer working on it (allegedly), but she was open to a free full-ops concept proposal anyway. I told her I would make something she would fall in love with. I researched their Instagram for tone, language and vibe before touching any layout.</li><li>A beach resort, same approach, Instagram screenshots for reference first.</li><li>The dhow operator, which mattered most to me. The name carries real cultural weight on the coast. I wanted the landing page to feel like it belongs to the people there, not like a template with palm trees dropped in.</li></ul>
<p>For the restaurant I pushed hard on depth. The first pass was too shallow. I wanted hover states that reveal photographs as you move the cursor across the hero, proper scroll animations, a sense that the site remembers something. I gave it its own page and added booking directly on the platform, on demo data, not live. Pushed the working ones to hosting.</p>
<p>Last thing before midnight: the sun scroll effect on the dhow site was broken, and one section needed rebuilding. Still working on it.</p>
<h2 id="marketing-money-and-the-cost-of-being-legitimate">Marketing money and the cost of being legitimate</h2>
<p>Paid 950 shillings for the business name registration. Receipt filed. Now waiting on review.</p>
<p>When that clears, I want the next chunk of money going into actual PR, not just ads. Directory listings, blog placements, paying relevant Instagram and Facebook pages with genuine local audiences to post about us. Not the big accounts with inflated follower counts, the specific ones that reach people who might hire us. I researched what the media houses actually charge, drafted outreach to all of them, and sent it.</p>
<p>I also logged work hours and token costs into the CRM, so I can see what a speculative pitch site actually costs me to produce. If I am going to give away concept work, I want to know the real price of that generosity.</p>
<h2 id="what-i-would-tell-another-founder">What I would tell another founder</h2>
<p>Stop trying to pick your niche before the market has told you anything. I burned the best hour of my morning trying to decide what industry DDi is "known for" when I have nowhere near enough repeat demand to answer that honestly. Watch what keeps coming back, then name it. And if you are going to do free concept work to win a client, track the hours and the costs the same way you would a paid job, because unmeasured generosity is just a leak.</p>]]></content:encoded>
<category>agency</category><category>crm</category><category>web design</category><category>nairobi</category><category>client work</category>
</item><item>
<title>Replacing a Stock Hero Photo and Rewriting Site Copy</title>
<link>https://blog.dullugroup.co.ke/posts/agency-website-copy-rewrite/</link>
<guid isPermaLink="true">https://blog.dullugroup.co.ke/posts/agency-website-copy-rewrite/</guid>
<pubDate>Sun, 01 Nov 2026 18:00:00 +0300</pubDate>
<description>Why I threw out my agency website copy twice in one day, swapped a stock hero photo for Nairobi, and replaced WhatsApp DMs with a proper form.</description>
<content:encoded><![CDATA[<p>I spent most of a Sunday fighting with my own agency website copy, and I lost that argument three or four times before I got anywhere useful. It started as a quick photo swap on the homepage. It ended with me killing a positioning line I had been proud of an hour earlier, and then admitting out loud that we had drifted away from what our clients actually want.</p>
<h2 id="a-favour-a-resume-and-a-weekend-spent-filing">A favour, a resume and a weekend spent filing</h2>
<p>The day did not start with business. A friend asked me to fix his resume, so I pulled it out of my downloads folder and rebuilt it properly. Real hierarchy, his accomplishments pushed to the top instead of buried under a paragraph of job duties, something that looks designed rather than typed. I sent it to him with instructions on how to use it, copied myself quietly so there is a record, and logged the whole thing as non business activity. Because it was. You do favours for people. You just do not pretend they were billable.</p>
<p>Then I did the thing I had been putting off for months, which was organising my machine. Everything had drifted. Client work sitting next to installers, screenshots in three different places, a downloads folder acting as permanent storage instead of an inbox. I gave the whole home directory a real structure: business operations in one place, my own code projects in another, one folder per client with their site, their files and their backups together, paperwork split by type, media where the system expects media to live.</p>
<p>Boring work. But I asked one practical question before committing to it: does this actually buy me anything? The answer was tokens. Every time I ask my assistant to find something, a clean tree is cheaper to search than a messy one, and I run that search hundreds of times a week. If it saves even a little, it pays for an afternoon. So I also built a knowledge graph over the whole lot, roughly seven hundred code files and nearly four hundred documents, so a question about my own codebase returns a small slice instead of me grepping around in the dark.</p>
<h2 id="the-hero-photo-had-nothing-to-do-with-nairobi">The hero photo had nothing to do with Nairobi</h2>
<p>Evening came and I looked at the DDi homepage properly for the first time in weeks. There was a man on the hero image doing nothing except modelling. No connection to the brand, no connection to East Africa, no connection to the kind of work we sell. We are a Nairobi agency talking to Kenyan business owners, and the first thing they saw was a stranger posing.</p>
<p>So I pulled it. I went with a street scene instead, something that looks like the places our clients actually trade in, kept inside the same palette and type system so the page still holds together. Then I said the obvious thing: if a real photograph would do better, we should go shoot one. That is on the list now. Generated imagery got us to a page that works tonight, but it is not where this ends.</p>
<p>Then the new image took too long to load, which is its own lesson. A hero that represents you but makes the page crawl is still a bad hero. Compressed, resized, done.</p>
<h2 id="writing-agency-website-copy-that-sells-without-wrecking-seo">Writing agency website copy that sells without wrecking SEO</h2>
<p>This is where the day got messy. I asked for the copy to be rewritten the way a serious sales strategist would do it: sell the outcome, not the service list. What came back was sharper, but it had a line about cloning business owners, and I hated it immediately.</p>
<p>Think about who reads that. A business owner lands on your site and the headline implies software is going to replace him. Nobody buys from a threat. The feeling I want is simpler: this is the person who will help me make more money tomorrow than I am making today. Same ambition, opposite emotion.</p>
<p>The second pass swung too far the other way. It was all "found on Google", "message us on WhatsApp", "pay with M-Pesa". Accurate, local, and completely flat. We need to rank and we need to sell, and those two pull in different directions. Keywords want plain nouns. Selling wants outcomes. The compromise is that the SEO terms have to live inside sentences that sound like a brand, not a checklist.</p>
<p>I also banned the pattern of "we do this, we do that, we do that". You do not declare that you are a full service creative marketing agency. You write copy good enough that the reader concludes it themselves.</p>
<p>By the end I was less sure than when I started, which is honest. We had optimised the page for how we want to sound, and somewhere in there we had moved away from what our clients come to us asking for. That gets revisited.</p>
<h2 id="the-unglamorous-half-of-the-day">The unglamorous half of the day</h2>
<p>Alongside all the arguing, actual work shipped:</p>
<ul><li>Approved the service catalogue and pushed it live to both the site and the invoicing system</li><li>Kicked off the CRM campaign setup and the ad builds</li><li>Swapped the hero image, then compressed it after it loaded slowly</li><li>Re-rendered all three promo videos, twice, because the call to action changed mid way</li><li>Worked out the right allow rules so the deploy had the permissions it needed</li><li>Replaced WhatsApp DMs as the primary call to action with a form and an audit flow</li></ul>
<p>That last one matters more than it sounds. Direct messages as your main entry point are chaos. Nothing is logged, nothing is qualified, nothing is followed up unless you personally remember. A form and a free audit give me a record and a reason to call back. That is the difference between a lead and a conversation you forgot about.</p>
<p>I also looked at why our videos get no views, and the answer is not the editing. It is that we have been posting things we find interesting rather than things a business owner would stop scrolling for.</p>
<h2 id="what-i-would-tell-another-founder">What I would tell another founder</h2>
<p>Your own website is the hardest client you will ever have, because nobody is paying you to be decisive about it. Set the constraint before you write a word: who reads this, and what do they need to feel? I burned hours on clever positioning that failed one simple test, which is that no buyer wants to be told they are replaceable. And fix your intake before you fix your copy, because a page that converts into an unlogged direct message is just a leak with good typography.</p>]]></content:encoded>
<category>copywriting</category><category>seo</category><category>branding</category><category>positioning</category><category>crm</category>
</item><item>
<title>What a Saturday of Pitch Prep and CRM Fixes Taught Me</title>
<link>https://blog.dullugroup.co.ke/posts/saturday-crm-pitch-prep/</link>
<guid isPermaLink="true">https://blog.dullugroup.co.ke/posts/saturday-crm-pitch-prep/</guid>
<pubDate>Sat, 31 Oct 2026 18:00:00 +0300</pubDate>
<description>A full Saturday on CRM invoicing, client scoping, cold outreach research and a 12 month plan. Honest notes on the dead ends and the work that stuck.</description>
<content:encoded><![CDATA[<p>Saturday started at one minute past midnight and ended just after eight in the evening. In between I killed a dead brand, scoped two separate jobs for one client, researched a resort I have never spoken to, cleaned my pipeline down to the handful of names that actually matter, and then sat down and did the maths on what twelve more months of running a web agency in Nairobi needs to produce. It was not a shipping day. It was an admin and thinking day, and those are the ones nobody writes about.</p>
<h2 id="cleaning-out-dead-projects-before-starting-new-ones">Cleaning out dead projects before starting new ones</h2>
<p>The first hour was deletion. I had a half-built thing sitting in my workspace that had quietly become void, so I told my assistant to treat all of it as permanently gone, not archived, not parked. Then I went through the rest of the folders and killed off the brands I am not using: a lifestyle idea, a redundant sub-brand, a group entity I set up once and never needed. Four names gone in about five minutes.</p>
<p>This matters more than it sounds. Every unused brand is a domain you half remember paying for, a logo folder you scroll past, a line in a document template that no longer applies. Carrying five identities when you can only sell one is not optionality, it is drag.</p>
<p>I also fixed a landing page problem I had been staring past for weeks. The call to action was a pill that looked bolted on, and the social proof was inconsistent (some entries had stars but no site, some had a site but no stars). The fix was not design. The fix was making the message so clear that the decision is easy. If someone has to work out what you want them to do, you have already lost.</p>
<h2 id="scoping-a-website-rebuild-and-a-cx-system-as-two-separate-jo">Scoping a website rebuild and a CX system as two separate jobs</h2>
<p>The biggest piece of real client work was for a retail client who wants a full reface of his website with complete functionality. I logged the work and cost to serve properly in my CRM, on the lead page, so the money side sits where I can see it rather than buried in an activity note.</p>
<p>Then he asked for something else: a customer experience system, like the one I run internally. And this is where I had to be disciplined, because the easy move is to bundle. I did not bundle. I logged it as a separate job with a separate price, because:</p>
<ul><li>The reface is a defined deliverable with an end date. The CX system is an ongoing capability.</li><li>He explicitly said he wants no bloat. Only functionality. Bundling forces him to buy things he did not ask for.</li><li>What he actually wants is autonomy, the ability to operate without me in the loop for everything. That is a different product from a pretty site.</li><li>We have a special pricing agreement in place, below my standard monthly, and I wanted that visible rather than smuggled into a bigger number.</li></ul>
<p>I started drafting three invoice options so he could pick the feature set he thinks he needs. Halfway through I looked at the chart and said out loud that it was hard to follow. So I stopped. I did not send it. If he asks, I will send it, and by then I will have had another day to make it readable. Sending a confusing pricing table is worse than sending nothing. A confused client does not choose the middle option, they choose to think about it later.</p>
<p>While I was in the CRM I cleaned up the document linking. I had an agreement reference that did not match what I had actually sent, which is the kind of small discrepancy that makes a client quietly trust you less. Found it, fixed it, cross-checked that nothing else was linked to the wrong record. I also wired the service agreement to the invoice, and I want to know when a client opens a document. Not to be creepy. Because "he has not replied" and "he has not opened it" are two completely different sales problems.</p>
<h2 id="researching-prospects-properly-instead-of-blasting-a-templat">Researching prospects properly instead of blasting a template</h2>
<p>Afternoon went to outreach, and I was harsher with my own pipeline than I have been before. I went through everything sitting in "new" and told my assistant to clean it out and leave only serious prospects. Most of them were no match. Small guesthouses and bed and breakfasts with no budget and no real decision maker. Keeping them in the list just makes the list look healthier than the business is.</p>
<p>The ones that survived got real work. For a boat tour operator I had been building concepts for, we moved away from "book on WhatsApp" as the only path and designed an on-platform booking flow plus a very simple admin page. Not a dashboard. A page where they can see who booked, what they want, and then text them personally. The point is not to remove the human touch, it is to give them control over their own time.</p>
<p>For a resort prospect, I had my assistant go to their live site in real time and break down every page: what each one has, what the scroll behaviour does, where the gaps are. Then we designed a visual concept for both mobile and web. First pass came back full of generic AI filler, so I had it stripped out. Generic work does not win a pitch against a resort that already has a working site. Specific observations do.</p>
<p>I also finally set up DDi properly on Facebook: username, WhatsApp button, a cover that has some personality instead of looking like a template, and a genuine study of what my ideal customers are already posting. Then I planned a two week low-budget animated campaign across Facebook, YouTube, Instagram and TikTok, deliberately unfunded. If free distribution cannot prove the content works, paying to amplify it is just buying reach for something nobody wanted.</p>
<h2 id="running-the-actual-numbers-on-a-twelve-month-plan">Running the actual numbers on a twelve month plan</h2>
<p>Last thing at night I stopped working on clients and worked on myself. I audited my LinkedIn, built a banner, and then set an honest target: a twelve month timeline ending with the equipment I need, a proper home office, an assistant, and over five million shillings in turnover.</p>
<p>Context for how far that is. I currently live on an internship stipend of around seventeen and a half thousand shillings a month. So I ran the maths properly rather than picking a nice round number, and I made the timeline notes micro-specific instead of generic, because "grow revenue" is not a task. Then I put the whole thing in my CRM as trackable items. A plan that lives in a notes app is a wish.</p>
<h2 id="what-i-would-tell-another-founder">What I would tell another founder</h2>
<p>Delete the brands you are not using, and be ruthless about which leads stay in your pipeline, because a flattering list is worse than a short one. When a client asks for a second thing, price it as a second thing (bundling feels generous and it is actually how you end up underpaid for both). And if what you have drafted is hard to follow, do not send it. Nothing in your pipeline is so urgent that it is worth sending a confusing document.</p>]]></content:encoded>
<category>agency life</category><category>crm</category><category>client work</category><category>outreach</category><category>pricing</category>
</item><item>
<title>A Small Agency Backup Plan That Survives a Dead Laptop</title>
<link>https://blog.dullugroup.co.ke/posts/small-agency-backup-plan/</link>
<guid isPermaLink="true">https://blog.dullugroup.co.ke/posts/small-agency-backup-plan/</guid>
<pubDate>Fri, 30 Oct 2026 18:00:00 +0300</pubDate>
<description>A small agency backup plan, an encrypted vault and a restore test, plus cold outreach demos, a CRM rebuild and kinetic video ads from one Nairobi Friday.</description>
<content:encoded><![CDATA[<p>Friday started with client pages and ended with me building an encrypted vault close to midnight. The real lesson was that I did not have a small agency backup plan, I had a laptop with everything on it. One hardware failure and Dullu Digital would have been a nice memory.</p>
<h2 id="client-pages-first-then-a-bigger-question-about-positioning">Client pages first, then a bigger question about positioning</h2>
<p>I opened the day on a retail client's site, working from two screenshots of his feedback. Added the pages he asked for, checked they matched the brand instead of looking bolted on, and deployed. That part was quick.</p>
<p>Then the harder question landed. He wanted a standalone page for luxury stays, browsable per location, with images, descriptions and price. That is not a page. That is a product. I went back and looked at the whole site again, properly, and realised I had been building a brochure while the client was describing a premium mobility and concierge platform. Most of what is on there now is test data, just enough to create the final impression so he can see the shape of it.</p>
<p>So I stopped adding pages and started phase one of the actual structure. Positioning before polish. A beautiful brochure that cannot scale is a rebuild you pay for twice.</p>
<h2 id="cold-outreach-demos-and-the-question-of-what-to-charge">Cold outreach demos and the question of what to charge</h2>
<p>Earlier in the week I built a full demo site for a dental clinic prospect and sent it cold. The owner liked the pitch and said he is coming to see me in person. Great. Then I spent twenty minutes on the question I always underprice: what do I ask for?</p>
<p>Building the thing before anyone pays is the easy part. Naming the number is where I lose shillings. I settled on pricing the build quality and the outcome, not my hours, because the hours are getting shorter every month and I refuse to be punished for that.</p>
<p>Another prospect I had been warming up went flat. No real interest. Rather than keep knocking, I pulled a fresh list using signals instead of hope:</p>
<ul><li>Real estate businesses with strong Google reviews and no website at all</li><li>Tour and excursion operators running their whole business through WhatsApp</li><li>Clinics with a decent reputation and nothing searchable</li></ul>
<p>Reviews are the signal I trust most. A business sitting on hundreds of good reviews with no site is leaving money on the table, and they already know it, which makes the conversation short.</p>
<p>Mid-afternoon I dropped everything to build two visual samples for a boat excursion prospect, working from a zip of their own photos they had sent through. I pulled their public Google reviews into the design because their proof is better than my copy. A coastal hospitality prospect came in asking for detail too, so I spent time studying what sites in that category actually do: how many pages, what composition, what the good ones get right. Unpaid research, but it is the kind that makes the next pitch faster.</p>
<h2 id="the-backup-plan-encrypted-vault-offsite-push-restore-test">The backup plan: encrypted vault, offsite push, restore test</h2>
<p>Around lunch I asked a plain question. What on my system is running from my local machine? The answer was more than I was comfortable with.</p>
<p>I do not want to be dependent on one AI vendor, and I do not want to be dependent on this laptop either. Those are the same risk wearing different clothes. Cloudflare is my middle ground, because if this machine dies tonight the business should not notice.</p>
<p>Before deleting a dead project I reviewed the cron tasks first, which saved me from killing something that was still live. Then I did the whole protection job in one sitting:</p>
<ul><li>Built an encrypted vault with a passphrase, kept off the laptop itself</li><li>Exported the production database (code without data is a shell, I asked why the export was happening and that was the right answer)</li><li>Ran the offsite push so a copy lives somewhere that is not my desk</li><li>Ran an actual restore test, because a backup you have never restored is a rumour</li><li>Noted to copy the vault to a USB stick and a second cloud</li></ul>
<p>One sting. I could not log into GitHub because I lost my authenticator account and I am waiting on recovery. So part of my code protection plan was sitting behind an account I was locked out of. That is exactly the kind of single point of failure this whole exercise was meant to find.</p>
<h2 id="rebuilding-the-crm-around-costs-not-just-contacts">Rebuilding the CRM around costs, not just contacts</h2>
<p>I checked whether my admin prospects page was reading from the database or serving me stale cache. That turned into a bigger decision: move admin off a path and onto its own CRM subdomain, rebuild the interface properly in the style of a good open source CRM, and delete the old abandoned one instead of letting it rot.</p>
<p>I also noticed I was manually refreshing to get new prospects. That is a cron job, not a human job.</p>
<p>Then the part that mattered most. I added a financials page: fixed costs, variable costs, customer acquisition cost, targets. Real numbers, including the AI subscription and sales tooling, then a scaling timeline showing what I need to spend on to hit the targets I set. Seeing cost per acquired client next to monthly burn changes which outreach I bother doing.</p>
<p>Late on I looked at integrating the local tax invoicing system and asked how secure that connection actually is. If I am sending invoice data to a government endpoint, I want to know what is in transit. I also made myself define prospects versus leads properly. Sounds basic. If the CRM blurs them, every pipeline number I report to myself is a lie.</p>
<h2 id="kinetic-typography-ads-instead-of-putting-my-face-on-camera">Kinetic typography ads instead of putting my face on camera</h2>
<p>I checked how DDi is listed on Google. It needs a cover photo, the logo and real photos of the business, and old search results are still describing an earlier version of what I do.</p>
<p>For the campaign I wanted kinetic typography, the text-driven spots the big telcos and ride apps run. The first render was completely wrong. Two of the kinetic cuts were right. From there I built a campaign mind map, then rejected my own version as too rigid, asked for genuinely guerilla thinking, then asked for structure again. Changed my mind three times inside an hour. I also looked at cloning my voice for the commercials, checked a tool, checked alternatives, and dropped the whole idea. I am not going on camera, so animation and stick-figure entertainment do the talking.</p>
<h2 id="what-i-would-tell-another-founder">What I would tell another founder</h2>
<p>Do the restore test. Not the backup, the restore, because the backup is the part that makes you feel safe and the restore is the part that tells you if you are. And when you audit your own setup, follow every dependency to the end: mine led straight to an account I could not log into. Protect the work before you polish it.</p>]]></content:encoded>
<category>backups</category><category>cloudflare</category><category>crm</category><category>cold outreach</category><category>kinetic video</category>
</item>
</channel>
</rss>
