WaterClub — what shipped

Live at waterclub-changes.pages.dev · updated Sunday 23 August 2026 at 20:00 +04

Sunday 23 August 2026

ReportsDoneMorning email for the four renewals handlers

BeforeSherosh, May, Bushra and Pinto had a call list on a web page but nothing that told them each morning who to ring, who had gone quiet, or what they had collected.

AfterEach of them now gets their own 07:00 email, Monday to Saturday: what is still uncalled and what it is worth, the customers contacted three or more days ago who have gone quiet, what they have renewed, plus the filter list for Sherosh and May and the win-back list for Sherosh. Built from the same page they work, so it can never disagree with their screen.

Who it helpsThe money that is due gets chased from a list that puts the most overdue first, instead of whoever happens to be remembered.

ByClaude

ReportsDoneOne list of what 'no' sounds like, instead of four

BeforeFour scripts each kept their own copy of the words a customer uses to decline; they had drifted apart, and four people who had already said no were sitting on Mr White's warmest list

AfterThe vocabulary lives in one place and all four lists read it — 11 more declines caught on his list, Grace's checked and already clean

Who it helpsA rep is not sent to ring somebody who told us not to bother, which is what makes them stop trusting the list

ByClaude

ReportsDoneMr White's page now carries every customer's details

BeforeHis cards showed a name and a line of what they said; making the call meant opening respond.io for each one

AfterEvery card carries the number, emirate, villa or flat, what they asked for, their email, when they first wrote in, and the last 14 messages behind a tap — 1,188 of 1,202 cards

Who it helpsHe can work the list straight off the page instead of switching apps for every name

ByClaude

DashboardDoneCall lists were being built on four-day-old customer records

BeforeThe overnight job failed four nights running (20–23 Aug) because a healthy tab was wrongly read as broken. A failed night stops before the call lists are rebuilt, so they kept an older read of Zoho — 16 customers who had already paid were still on the list to be chased. The alarm stayed silent because it only checked the job had run, not that it had worked.

AfterThe tab check was corrected, the lists rebuilt from a fresh read of Zoho and published — 453 customers, AED 420,209. The alarm now reads the job's own verdict on itself; tested against the last five nights, it stays quiet on the good one and fires on all four bad ones.

Who it helpsNobody is asked for money they have already paid, and a night that fails will say so instead of passing quietly.

ByClaude

respond.ioDoneMr White now gets his own daily email

BeforeOnly Grace received a daily email. White's walk wrote the file but emailed nobody, so his 20 waiting customers and 434 quiet quotes sat unread until someone opened a page.

AfterHis 05:30 walk now emails him at care@waterclub.ae around 06:35, Omar cc'd, PDF attached so it forwards on WhatsApp. Four faults were fixed first: a customer who asked us to stop messaging was top of his warmest list, five of fifteen names were mangled, the header count disagreed with the table, and the quiet-pile figure disagreed with his page.

Who it helpsThe warmest names he has reach his phone before he starts, and nobody who asked to be left alone is on the list.

ByClaude

ReportsDoneSherosh, May and Grace told what changed on their call lists

BeforeThe conversation detail landed on the call pages this morning with nobody told, so the team would have carried on opening respond.io for every name without knowing they no longer had to.

AfterA note went to Sherosh, May and Grace (cc Liliana and Omar) explaining what is new, giving each their own link, and setting out six rules for using it properly — chiefly that a blank card means we genuinely do not know and must not be filled in from memory. It asks for a one-word reply so we can tell it was read.

Who it helpsThe change only pays off if the calls are actually made differently.

ByClaude

respond.ioDoneMr White's own page, with 336 leads dug out from under the follow-ups

BeforeWhite had no page of his own. Every list we build reads the last message on a conversation, and on a chased thread that is the automatic follow-up — so 1,078 of his 2,488 conversations were invisible to all of them.

Afterhttps://waterclub-dashboard.pages.dev/white — his customers waiting, his quotes gone quiet, 708 leads to reconnect with, and his month against the AED 150,000 target. Own password, opens nothing else. Rebuilds itself every working morning.

Who it helps336 leads that no list had ever shown anyone, including a villa enquiry chased by templates and never answered by a person.

ByClaude

respond.ioDoneEvery call list now carries the conversation, so nobody opens respond.io

BeforeThe renewals, win-back and filter-chase call lists showed a name, a figure and a date. To find out where someone lives, what they wanted or what was last said, whoever was calling had to open respond.io and search for them.

AfterEach card now also shows their phone number, emirate, villa or flat, what they said they wanted, their email, when they first wrote in, and the last 14 messages of the conversation behind a 'Read the conversation' tap — photos and voice notes included. 652 of 1,044 renewal and win-back customers and 445 of 521 filter-chase customers are matched.

Who it helpsThe call can be made from the card. Nothing is guessed — a blank simply does not print.

ByClaude

respond.ioDoneGrace's page: the whole conversation is now on the card

BeforeA card showed a name, a number and one quoted line. To know what a lead had actually asked, been quoted or sent a photo of, you had to open respond.io and find the thread.

AfterEvery card carries the emirate, villa or flat, what they wanted, their email, when they first wrote in, and the last 14 messages of the conversation behind a tap — including the photos and voice notes, which open. 649 of the 650 leads have their conversation on the card.

Who it helpsWhoever rings can read the history and make the call from one screen, instead of switching to respond.io for every name.

ByClaude

DashboardDoneGrace's cards now show the phone number, emirate and villa or flat

BeforeA card gave a name and a quote only — she had to open respond.io to find out where somebody lived or what kind of home they had.

AfterEvery card shows the number, and where respond.io holds it, the emirate and whether it is a villa or an apartment. 227 of 650 carry a location; nothing is guessed.

Who it helpsShe can pick the Dubai villas out of 602 leads without opening anything else.

ByClaude

DashboardDoneGrace's page rebuilds itself every morning

BeforeThe page was built once by hand — she would work through the names and find the same list waiting the next day.

AfterIt rebuilds and republishes every working morning at 07:50, twenty minutes after her daily email, re-reading her whole respond.io book for leads.

Who it helpsHer page stays a live picture of her day instead of a snapshot.

ByClaude

DashboardDoneGrace's page has its own password, separate from the board's

BeforeHer page needed the shared dashboard password — the one that also opens every salesperson's figures, the money owed and all four call lists.

AfterHer page has a password of its own. It opens her page and nothing else; the board password still opens both, so nobody needs two.

Who it helpsShe can reach her own work without being handed the keys to the whole business.

ByClaude

DashboardDoneGrace's page opens with no password

BeforeGrace had to enter the shared dashboard password every time she opened her page on her phone.

AfterHer page opens straight away. It is the only address on the site without a password; every other page and every data feed still refuses without one.

Who it helpsRemoves the one thing most likely to stop her using it each morning.

ByClaude

respond.ioDoneGrace's page: a Reconnect tab of 602 leads dug out of her whole respond.io book

BeforeHer page showed 48 names, because the daily walk reads 320 of the 1,975 conversations she is actually holding. The rest were never looked at.

AfterAll 1,975 read. 602 leads to reconnect with, in three groups: 49 who asked something nobody answered, 478 where we spoke last then silence, 75 who only said ok. Existing customers, anyone the renewals team is calling, declines, suppliers and anyone she is mid-conversation with are all removed.

Who it helpsRoughly twelve times more warm names to call, each with the message already written.

ByClaude

DashboardDoneGrace's leads page live, reopen list confirmed off her

BeforeGrace held a link to 579 lapsed customers to reopen — renewal work that had already moved to Sherosh's team, so two people would have rung the same customer in the same week.

AfterThe same link now opens her own leads page: 6 customers waiting on a reply, 42 quotes gone quiet, and her week against her own measure. Every name checked against all 1,044 rows of the renewals and win-back lists — zero overlap, so nothing on her page is an existing customer being collected from. She has been told the list moved and why.

Who it helpsHer time goes on live enquiries instead of plan collection, and the warmest names she has stop depending on scrolling back through an email.

ByClaude

WebsiteDoneThe website now backs itself up to Google Drive every night

BeforeUpdraftPlus was installed and connected, but no timer had ever been armed — a backup only happened when somebody remembered to press the button. Three backups in two years: July 2024, December 2025, August 2026.

AfterFiles and database both run at 3am Dubai, every night, to Liliana's Google Drive. Two weeks of files kept, a month of database. A failure now sends an email instead of passing in silence, and an alarm checks every six hours that a backup is both happening and still booked to happen again.

AffectsDisaster recovery — being able to put the shop back after a hack, a bad plugin update or a hosting failure

Who it helpsIf the website breaks, yesterday can be restored. Before this, the newest restore point could have been months old.

ByClaude

scripts/setup_daily_backups.py, scripts/checks/check_site_backup.py
DashboardDoneWin-back list moved from Grace to Sherosh, onto the AMC page

Before575 lapsed customers worth AED 2.17M sat on a separate page for Grace, mixed into a two-week call plan alongside her live sales work. Winning them back is renewal work, not a sale.

AfterThey are now a Win back tab on Sherosh's AMC call page, with their own message, their own tick, and no price quoted. Nobody appears on both lists — 118 were held back because they are already being chased for a renewal, 91 because they are on the filter list. The Grace page is retired.

Who it helpsOne person owns the whole conversation about a lapsed customer, and no customer gets rung twice by two people about two different things.

ByClaude

respond.ioDoneSales team's saved replies rebuilt

Before13 saved replies. Four were named after rep numbers (Sales 1.1, 1.2, 4.2, Welcome), unused and never updated. The kitchen price reply quoted 2,426 / 3,149 / 3,767 — old prices with VAT wrongly added on top. The maintenance reply quoted MEGA RIO at 949 and a whole-villa plan at 1,999 that does not exist

After18 saved replies. The four dead ones removed, the two price ones corrected against the live site, and nine new ones added: first reply (English and Arabic), tried-to-call, quote-gone-quiet, whole-villa site visit, why the tap runs warm, what is included, how to pay, and about WaterClub. Each signs itself with whoever sends it

Who it helpsEvery rep now has a correct, on-brand reply to hand for the questions that actually come in, and no saved reply quotes a price the customer will not be charged

ByClaude

WebsiteDonewaterclub.ae outage — found and fixed

BeforeThe whole website was returning an error for about two hours. A one-off instruction we added while changing the price told the site to clear its cache too early, and the cache tool crashed everything before it had finished loading

AfterSite back up. The stuck instruction was switched off and removed, and the script that created it now waits until the site has finished loading before touching the cache, so the same mistake cannot repeat

Who it helpsSite trading again, and the failure is designed out rather than just cleared

ByClaude

ShopDoneBasic under-sink cut to AED 2,399

BeforeAED 2,888 — AED 10 dearer than the Premium beside it, so the cheapest kitchen option was not the cheapest

AfterAED 2,399 in all seven places at once: shop price, product description, Google summary, comparison table, shop card, the price list quotes are built from, and what Zoho bills

Who it helpsThe three kitchen options now read cheapest to dearest, and a customer is billed exactly what they were quoted

ByClaude

SystemDoneThe website is now watched like everything else

BeforeA dozen systems were checked automatically, but nothing watched waterclub.ae itself — today's outage was found by accident.

AfterHome page, shop and checkout are checked every five minutes; any failure raises an alert straight away.

Who it helpsThe shop being down is now announced in minutes instead of discovered by chance.

ByClaude

ReportsDoneGrace's daily email switched on

BeforeGrace had no way of seeing the customers who came back after a follow-up — once she ticked 'quote sent' the conversation left her screen, and a little over one in four of those customers return weeks later with nobody watching

AfterEvery working morning at 7:20, before she starts, she gets her own one-page email: who came back and is still waiting on her, her quotes gone quiet, her week and her month — PDF attached, Omar copied

Who it helpsThe warmest names she has stop going cold unseen; 68 customers came back after a follow-up in the period measured

ByClaude

ReportsDoneGrace — inventory of what is built and how she uses it

BeforeWork for Grace was spread across five separate emails with no single picture of what was live versus waiting

AfterOne email to Omar separating what Grace already has, what is built and switched off pending his word, and the three decisions still open — with the four PDFs attached

Who it helpsOmar can see in one place what is actually running and unblock the three things that are not

ByClaude

ReportsDoneCorrection sent to Grace

BeforeGrace had a report in her inbox saying she was being starved of leads — 89 to one colleague, 52 to another, 29 to her — which was a counting error on our side.

AfterCorrected email sent: real split is 172 to her against White 214 and Katherine 198, with her closing at 51% against 30% and 21%. February confirmed as maternity leave, not a dip.

Who it helpsA salesperson is no longer holding a wrong number about her own treatment.

ByClaude

Saturday 22 August 2026

ReportsDoneGrace's day-by-day call plan

BeforeGrace had 579 dormant customers and no order to work them in; six people who answered a follow-up had been waiting up to 255 days with nobody watching.

AfterTwelve working days, every person named with their number: day 1 is the six waiting on a reply, then business accounts, machines with no plan, lapsed plans, repeat buyers.

Who it helpsAED 2.17M of past business worked warmest-first instead of at random.

ByClaude

respond.ioDoneTraced Grace's ghosted-quote problem to its cause

BeforeGrace reported losing deals to silence after sending prices; assumed no follow-up existed

AfterProved the automatic chase runs correctly for her (157/160 categorised, all 43 quotes chased, 1 in 4 customers return). Found the real gap: 6 customers who came back and got no reply, and 127 colleague conversations that never entered any chase because no closing reason was ticked

Who it helpsStops a wrong fix being built, and names a leak that can be closed

ByClaude

SEO & marketingDoneShower filter pages stopped competing with each other

BeforeFour pages sold the same shower filter in different quantities and Google treated them as four answers to one search. Nearly 8,000 views a quarter split three ways, all stalled around position 30 — which is nowhere.

AfterAll the pack pages now point Google at one main page, which gained a list of every pack and its price so nobody loses the option they wanted. Nothing was deleted and every pack is still on sale.

Who it helpsThe demand is real — 'shower filter', 'shower filter cartridge' and 'water filter for shower' are about 3,000 searches a quarter — and we were splitting our own answer three ways.

ByClaude

ShopDoneGlass bottle pages now describe the bottle

BeforeBoth glass bottle pages described the Aqua Bar restaurant dispensing system — CO2 cylinder, chiller module, 'replaces AED 60,000/year of San Pellegrino' — on a page selling a AED 21 bottle. The category block had been pasted onto the two products in HO.RE.CA that are not machines.

AfterBoth rewritten for the person actually searching: what the glass is, the grip moulded into it, what it is for, and which of our other bottles to buy instead if this is the wrong one.

Who it helpsThe plain bottle page is the third most-shown page on the site — 8,635 views a quarter from people searching 'glass water bottle dubai'. They were landing on a page about restaurant plumbing.

ByClaude

ReportsDoneGrace's reopen list — 579 of her own past customers, best call first

BeforeGrace asked to reopen the 500+ customers on her account but had no list; her buyers were only visible one invoice at a time in Zoho.

AfterA phone page behind the dashboard password with 579 customers she personally sold to who have not bought for six months or more, AED 2.17M of past business, ordered by what the call is worth. Each card says why she is calling and writes the WhatsApp message for her. Anyone already on the renewals list, the filter-chase list, mid-conversation with a colleague, or marked inactive is left out.

Who it helpsAED 2.17M of past business she can work through in priority order, without three people asking the same customer for three different things in the same week.

ByClaude

ZohoDonePaula's full Monday report sent

BeforePaula had five separate emails from this week and no single view of what to do, what changed in the ledger, or why item cleanup is refusing.

AfterOne report sent (cc Omar and Liliana, PDF attached): five Monday tasks, four figures only she can explain, AED 16,941 of unclaimed input VAT and bad-debt relief, and the abandoned November stock count that blocks everything.

Who it helpsMonday becomes a fifteen-supplier job instead of a 133-line one, and the one decision blocking the stock fix is named.

ByClaude

WebsiteDoneMedical claims removed from the shop pages

BeforeProduct pages claimed dermatologists recommend our showers for eczema and acne, that the MEGA RIO is 'dermatologist-approved for eczema households', that TARA is for 'kidney patients, dialysis-prep households', that the filter enhances the immune system and reduces hair loss.

After18 passages across 8 pages rewritten to describe what the equipment does. TARA now defers to the customer's own doctor rather than speaking for them. Nothing about the products, prices or the 29% water saving changed.

Who it helpsA health claim next to a Buy button is a claim we are being paid for. The blog was cleaned of these earlier; the shop was not, and the shop is where the money changes hands.

ByClaude

SEO & marketingDoneFull search report sent — three months of Google, read end to end

BeforeNobody had ever seen what Google actually does with the site. Search Console had years of history in it and had never been opened.

AfterA report that says plainly: we rank fine and we are not clicked. 68,827 first-page views a quarter return 0.7%. Sent as a PDF so it forwards.

Who it helpsTurns a guess about SEO into a measured baseline, and names the three fixes worth the most: the home page (done), the three competing shower pages, the glass bottle page.

ByClaude

SEO & marketingDoneHome page rewritten for the 'best home water filters' search

BeforeThe home page was titled as a label for the business, and 34,768 searches a quarter for 'best home water filters' saw it on page one and clicked it zero times.

AfterThe home page and the comparison page now read as an answer to somebody comparing filters. No claim that we are the best — only what the pages actually contain.

Who it helpsThe home page carries 110,002 impressions a quarter at 1% clicked. This is the widest single lever on the site.

ByClaude

ReportsDoneSales leaderboard no longer counts imported lists as leads

Before117 contacts uploaded in three batches on 13 and 16 August were counted as inbound leads, which is the whole of the 89/52/29 split the team argued over

AfterContacts created 6-or-more to the same minute are treated as an upload, not an enquiry; the real split is Grace 52, White 57, Katherine 55

Who it helpsClosing rates are comparable between reps again, and lead-fairness decisions are made on real numbers

ByClaude

SEO & marketingDoneEight new articles published (batch 4)

BeforeGoogle was showing waterclub.ae for shower filters, reusable bottles and 'best water filter' searches with no page that answered any of them — thousands of impressions a quarter earning almost no clicks.

AfterEight articles published, chosen from what UAE customers actually type into Google: do shower filters work, how often to change the cartridge, choosing a reusable bottle, a plain guide to under-sink filters, reverse osmosis or carbon, what makes a filter good, cold water throughout a villa, and how to check a company's certifications. The blog is now 68 articles.

Who it helpsCovers search demand we were already being shown for and never answered. Each one links onward to the finder, the comparison page and the shop.

ByClaude

ReportsDoneGrace's performance report and sales playbook

BeforeGrace asked how she could sell more. Nobody had looked at her actual numbers over a full year — a two-week snapshot had wrongly suggested her closing had collapsed.

AfterTwelve months of her invoices read properly. She is the top salesperson in the business: AED 1.17M, 39.3% of all sales revenue, on the fewest leads of anyone. Sent to her with a 14-message playbook replacing the templates that were letting her down.

Who it helpsThe real constraint turned out to be lead supply, not ability — she converts a lead into 4-5x more money than anyone else and receives the fewest. Rebalancing costs nothing.

ByClaude

respond.ioDoneFixed broken sales follow-up template (Sales 1.2)

BeforeThe saved reply reps send when a customer doesn't answer ended mid-sentence — 'You, and talk soon!' — and was written entirely about us ('I'm really excited', 'I can't wait to share our amazing options') with no reason for the customer to reply.

AfterRewritten to lead with the customer, acknowledge the missed call lightly, and ask the one question that decides the right product — which emirate they're in. Gives them something easy to reply to.

Who it helpsEvery rep uses this when a lead goes quiet. A broken sentence was reaching real customers, and a follow-up with no question in it rarely gets an answer.

ByClaude

SEO & marketingDoneFirst read of what Google actually shows people

BeforeWe were guessing which searches mattered, from competitor counts and keyword tools.

AfterThree months of real data: 1,600 visits from 169,000 times we were shown. The single biggest search in the UAE, 'best home water filters', showed our home page 34,768 times on page one and got nobody to click, because until this week the page was titled 'HOME'. Shower filters and glass bottles turn out to be real demand we have never written about.

Who it helpsThe next batch of articles is chosen from what people search for, not from what we assume.

ByClaude

SEO & marketingDoneGoogle Search Console connected and reading

BeforeNobody had ever looked at what Google says about waterclub.ae. The task was recorded as blocked on Omar's Google login.

AfterConnected with no login needed and no change to the website — Google already accepted the Analytics tag as proof. The account turned out to hold years of history. Our full list of pages was handed over so Google re-reads the 60 articles instead of the 36 it last saw.

Who it helpsWe can now see which searches bring people in and which pages they land on, instead of guessing.

ByClaude

ZohoDoneTwo audit findings withdrawn after checking them against the ledger

BeforeThe audit reported AED 2,970,432 of imaginary cash from entry 167, and a Feb-Apr VAT payment that still needed recording once the duplicates were out.

AfterBoth wrong. A vendor payment of exactly AED 2,970,432 the same day takes the cash straight back out, so nothing was ever there. And the VAT chain is already complete — entry 210 raised it, a tax payment settled it, entry 211 funded it. Only AED 453.10 remains outstanding.

Who it helpsTwo large journals were withdrawn before posting; one of them would have invented a three-million overdraft.

ByClaude

ZohoDoneCorrection to my own correction — entry 211 reinstated

BeforeI reversed entry 211 as a duplicate credit to Ms. Liliana. It was not one. It records her funding the AED 45,291.34 actually paid to the FTA in May, and removing it left Cash In Hand at minus AED 41,987.94 and made the books say Ms. Liliana owed the company AED 18,368.86.

AfterReinstated as entry 225, dated today with the reason written in. Cash In Hand is back to AED 3,303.40 and Ms. Liliana's account to AED 26,922.48 in her favour. The genuine duplicate, entry 197, stays reversed.

Who it helpsThe books stop under-recording what the company owes one of its owners, and Cash In Hand stops showing an impossible negative balance.

ByClaude

ZohoDoneTwo of the five correcting journals posted

BeforeEntry 211 credited Ms. Liliana a second time for a VAT payment already credited in entry 197, and entry 197 closed the Feb-Apr 2026 VAT quarter a second time over the top of Zoho's own return journal 210 — so the quarter was recorded three times and she was credited twice.

AfterPosted as entries 222 and 223, both dated today, each carrying its reason in the note. Nothing deleted, nothing dated in a filed year touched, both originals left in place beside the correction.

Who it helpsRemoves AED 45,291.34 of double credit to Ms. Liliana and AED 45,291.34 of cash the company does not hold.

ByClaude

SystemDoneSaturday office announced to the team, running until AED 500k/month

BeforeFive-day office week. Sales the week of 15–21 Aug closed AED 43,598 — half of the previous week (AED 77,839) — while leads coming in stayed high.

AfterAnnouncement sent to the eight sales + renewals people: office is open **Saturdays 10:00–16:00 from 29 August**, every week until closed monthly sales hit **AED 500,000**. `.ics` attached so each person adds it to their own calendar in one tap. The daily report now shows month-so-far, target and per-day-to-target so everyone can see where we stand.

AffectsTeam schedule — Saturday working days

Who it helpsWhole sales + renewals team — a clear shared target that ends the Saturday requirement automatically the day we hit it. Nobody keeps working Saturdays after the reason is gone.

ByClaude

scripts/announce_saturday_work.py, outputs/waterclub-saturdays.ics, scripts/send_daily_report.py
SEO & marketingDoneReview claim on the blog corrected to what Trustpilot actually shows

BeforeA blog article opened with 'Waterclub has over 5,000 5-star reviews'. Trustpilot's own page shows 3,948 reviews at 4.9 out of 5 — so the sentence overstated the count and described every review as five stars, which no rating page claims.

AfterRewritten to say only what the Trustpilot page says, rounded down rather than up, with a link so a reader can check it in one click.

Who it helpsA rating claim a customer can verify is worth more than a bigger one they cannot, and an unverifiable claim is exactly the sort of thing that gets a site penalised.

ByClaude

SEO & marketingDoneCrawl throttle removed from robots.txt

BeforeThe file telling search engines how to read the site asked them to wait twenty seconds between pages. Google ignores that instruction, so it was never slowing Google down — but Bing and Yandex obey it, so the site was crawling at a standstill everywhere except the one engine it was aimed at. The same file was also blocking WordPress's own crawl rules from ever reaching it.

AfterReplaced with the standard WordPress rules plus the sitemap address. Nothing is blocked that should be readable; the checkout and account pages are deliberately left crawlable so search engines can read the 'do not list this' tag on them and drop them.

Who it helpsNew articles can be found and listed in hours rather than weeks on every search engine, not just Google.

ByClaude

SEO & marketingDoneEight more articles published — the questions customers type that had no UAE answer

BeforeThe blog had 44 articles. Nobody in the UAE market answers the informational searches — 'is alkaline water worth it', 'will a filter reduce my water pressure', 'what does bottled water actually cost a family'. Those searches were being won by property portals and forums.

AfterEight new articles, 1,570-1,720 words each, on their own permanent addresses: alkaline water, filtered water for coffee and espresso machines, whole-house versus kitchen, what a UAE family really spends on bottled water, moving home, what happens if you skip a filter change, water pressure, and Dubai water with hair and skin. Each carries its own search title and description, four links out to the rest of the site, and links sideways to its sisters. All eight are in the sitemap.

Who it helpsThe blog now answers 52 real questions instead of 44. Every one of these is a search a customer types before they ever hear our name, which is the cheapest place to meet them.

ByClaude

SystemDoneChange log can no longer be wiped by its own rebuild script

BeforeThe script that rebuilds the change log wrote the file from scratch from its own fixed list. Anything logged since that list was last edited — 15 entries, including everything from today — would have vanished the next time anyone ran it.

AfterIt now keeps every entry it does not recognise, takes a copy of the file before touching it, and reports how many it carried over. Proved by running it: 49 entries in, 49 entries out.

AffectsChange log — rebuild

Who it helpsEveryone reading the change page. The record of what was done stops being one accidental command away from disappearing.

ByClaude

scripts/backfill_changelog.py
SEO & marketingDoneSearch engines were being asked to wait 20 seconds between pages

BeforeA file on the website told every search engine to pause 20 seconds between pages. Google ignores that instruction, so it never slowed Google down — but Bing does honour it, so the only effect was making the site slow to index everywhere except the engine it was aimed at. The same file was also blocking WordPress from applying its own crawling rules.

AfterReplaced with the standard set and no waiting instruction. Deliberately kept minimal — this is the one file where a mistake can remove a whole site from search. Checked afterwards that the home page, the shop, an article and the sitemap are all still reachable.

AffectsWebsite — search engine crawling rules

Who it helpsEverything we publish. New articles now get picked up as fast as the search engines are willing to fetch them instead of one page every twenty seconds.

ByClaude

scripts/fix_robots_txt.py, waterclub.ae/robots.txt
SEO & marketingDoneReview claim on the blog corrected to what Trustpilot actually shows

BeforeA blog post opened with "Waterclub has over 5,000 5-star reviews". Trustpilot shows 3,948 reviews rated 4.9 out of 5 — so the number was overstated and describing every one of them as five-star was not something any rating page claims.

AfterIt now reads "rated 4.9 out of 5 from more than 3,900 reviews on Trustpilot", with a link to the profile so anyone can check it in one click. Rounded down rather than up.

AffectsBlog — review and rating claims

Who it helpsAnyone quoting the website to a customer. A review claim that cannot be checked is the one thing that can get a page penalised, and it is also the kind of thing a competitor reports.

ByClaude

ZohoDoneAction plan sent to owners and finance

Before25 findings and no agreed sequence — investigation had outrun action

AfterOne plan with a named owner per step, arranged backwards from the 30 Sept 2025 CT deadline; sent to Omar, Liliana and Paula

Who it helpsThe 2025 return has five weeks and depends on a physical stock count that has not started

ByClaude

ZohoDone153 August renewals with no invoice raised — sent to CS to bill by Tuesday

Before167 August renewals had been flagged as never invoiced. Nobody had walked the list to separate the real cases from Books duplicates.

AfterRe-checked across duplicate customer records — 14 were already billed under a second record. Real number: **153 to raise**. Full CSV sent to Sherosh at wecare@, CC Liliana + Omar, deadline **Tuesday 25 August**. Includes flags for the 68 duplicate-record cases and the 4 customers who don't exist in Books yet.

AffectsRenewals + finance — August invoicing

Who it helpsPaula in finance (real reconciliation) and every customer on the list (a card payment can now settle a real invoice).

ByClaude

scripts/send_unbilled_amc_to_sherosh.py, outputs/august-renewals-not-billed-2026-08-22.csv
ZohoDone2024 and 2025 locked in Zoho Books

BeforeAnyone could post or edit a transaction dated into 2024 or 2025, both already filed with the FTA. 34 entries had already been backdated that way, one by five years.

AfterAll transactions dated up to and including 31 December 2025 are locked. Zoho refuses them outright. Reversible from the same screen with the owners' agreement.

Who it helpsThe two filed years can no longer move underneath us while the stock valuation is being sorted out, so whatever we find is measured against a fixed picture.

ByClaude

ZohoDoneAsked the bookkeeper to explain the abandoned stock count and two August entries

BeforeNobody had asked why the corrections were made, and the entries that zeroed an owner's capital account were eight days old

AfterSent three sets of questions to finance, cc both owners: the November stock count, the COGS corrections, and entries 215/216

Who it helpsGets the explanation while it is still remembered, and puts a stop on anything further being backdated into a filed year

ByClaude

SEO & marketingDoneEight more articles published — batch two

BeforeThe blog answered 20 customer questions. Nothing on the site explained chlorine, softeners, what installation involves, what a TDS meter proves, why the northern emirates differ, whether UV is needed, what a maintenance plan covers, or how to judge a filter company.

AfterEight more articles live, 1,450 to 1,700 words each, cross-linked to each other and to the existing guides. The blog now answers 28 questions.

Who it helpsThese are the questions a customer asks just before buying, and no UAE competitor answers them properly. Each one also arms the sales team with a link instead of a long explanation.

ByClaude

SEO & marketingDoneEight new articles published and announced to the team

BeforeThe blog had 12 real articles and nothing answering the questions customers ask most; the buying guide told everyone RO was the standard choice in the UAE, contradicting our own price list.

AfterEight 1,500-word articles live on waterclub.ae, each answering a real customer question and linking through to the finder, comparison and shop. The buying guide now answers by emirate. Sales and renewals team emailed the links with a note on what changed in the pitch.

Who it helpsThe team can send a link instead of retyping the same explanation, and customers land on our site rather than a competitor's. The RO advice now matches what we actually sell.

ByClaude

WebsiteDoneThe buying guide now recommends RO by emirate, matching the catalogue

BeforeThe guide told every reader reverse osmosis is 'the standard recommendation in this region', reasoning that desalinated water carries dissolved salt worth reducing. That is backwards — desalination removes it at the plant. Meanwhile the catalogue sells the RO machine specifically for Sharjah, RAK, Fujairah and Umm Al Quwain, so the website and the price list were recommending different things to the same customer.

AfterThe guide now answers by emirate: Dubai and Abu Dhabi are desalinated and need carbon plus a fine barrier; the northern emirates blend in groundwater, which is what RO was designed for. RO stays available anywhere for someone who wants the widest barrier.

Who it helpsA salesperson reading the site now pitches the same thing the price list sells, and the customer gets asked where they live before being told what to buy.

ByClaude

WebsiteDoneEight new articles published on questions nobody in the UAE was answering

BeforeThe blog had 12 real articles. Searches like 'does reverse osmosis waste water' and 'can I fit a filter in a rented apartment' returned no UAE page at all — the results were American blogs, Quora and a property portal.

AfterEight articles published, 1,480-1,620 words each, on cold water in summer, filter vs purifier, RO and minerals, RO and waste water, filters in rented apartments, villa tank cleaning, office coolers vs plumbed-in, and limescale. Each answers one question a UAE customer actually types, and links through to the filter finder, the comparison page or maintenance.

Who it helpsTwenty articles now, up from twelve. These are the searches people run before they buy, and until today WaterClub had no page in any of them.

ByClaude

WebsiteDone12 thin blog posts rewritten into 7 real articles

Before23 of 40 posts were under 400 words (median 318). Three separate posts on hydration, three on the benefits of filtering - competing with each other and none long enough for Google to treat as an answer.

AfterSeven articles of 1,330-1,420 words, each published on the address the old post already had so its standing with Google carries over. Five duplicates folded into the article that absorbed them, binned, and their old addresses permanently redirected.

Who it helpsThe blog now answers the questions UAE customers actually type, on addresses that already have history. Nothing anyone has bookmarked or linked to breaks.

ByClaude

WebsiteDoneMedical claims, retired rental price and the mineral myth taken off the blog

BeforeSix posts told the reader a water filter reduces the risk of cancer, one naming three cancers and another quoting percentages. Three still advertised the Dh49 per month rental we no longer sell. Four claimed our filters keep the healthy minerals in water, which is a European argument that is untrue for desalinated UAE water and argues against our own RO machines.

After21 passages rewritten across 8 posts to say what a filter actually does. The one post whose title was itself a cancer claim was removed and its address redirected.

Who it helpsThe site no longer makes a health claim it cannot back up, no longer advertises a discontinued product, and no longer contradicts its own articles.

ByClaude

Friday 21 August 2026

ReportsDoneDaily report opened up to the whole team

BeforeThe daily report was addressed to Omar with Liliana, Grace and Sherosh on CC — a private four-person briefing.

AfterEight team addresses are now in the TO line (Grace, White, Katherine, Jithin for sales; Sherosh, May, Bushra, Pinto for renewals). Omar and Liliana ride the CC. The email now reads as a team briefing rather than a private one.

AffectsDaily report — recipient list

Who it helpsEvery sales rep and every renewals handler — the same numbers at the same time, at 20:00 every evening.

ByClaude

scripts/send_daily_report.py
SystemDonePublic change-log page — no password, updated daily

BeforeEven after the log existed, only people on the daily-report email saw it. The team had no bookmark for 'what have we shipped this week?'

AfterA public page went live at **https://waterclub-changes.pages.dev** — no password, filter buttons at the top (All / Done / Under construction / Pending / Blocked), grouped by day. Republished automatically every evening at 20:00 UAE as part of the daily report job.

AffectsChange log — waterclub-changes.pages.dev

Who it helpsEvery member of the team — a single URL to bookmark that always shows what shipped, what's coming, and who each change was meant to help.

ByClaude

cloudflare-setup/publish_changelog.sh, scripts/build_changelog_page.py, scripts/daily_report.sh
SystemDoneChange log for the whole team

BeforeModifications happened silently. There was no team-visible record of what shipped, what was under construction, or who a given change was actually meant to help.

AfterEvery write to Zoho, the website, respond.io or this system now logs a before/after entry to `data/changelog.jsonl`, with a status (done / under construction / pending / blocked), a percent-complete, and a note of who it helps. The daily report reads the last day's entries and shows them under 'What changed since yesterday'.

AffectsDaily report — 'What changed since yesterday' + 'Under construction / pending' sections

Who it helpsThe whole team — transparency on what shipped, what's coming, and who a change was for.

ByClaude

scripts/log_change.py, scripts/build_changelog_block.py, data/changelog.jsonl

Wednesday 19 August 2026

ReportsDoneDaily one-page report by email

BeforeNo end-of-day summary. The team learned what shipped ad-hoc from Omar, and Omar had to open the dashboard to see the numbers.

AfterEvery day at 20:00 UAE a one-page email lands, showing money owed, AMC renewals overdue, six-month lookahead, sales team last 7 days, and any auto-flag (a rep with 30+ leads and zero close, or stale figures). PDF attached so it can be forwarded on WhatsApp.

AffectsDaily report — 20:00 UAE

Who it helpsOmar, Liliana and the CS + sales leads — same picture, same time, every day.

ByClaude

scripts/send_daily_report.py, config/com.waterclub.daily-report.plist
DashboardDoneHours tab added to the dashboard

BeforeWork-hours data existed on its own page but wasn't reachable from the main dashboard rail — nobody found it.

AfterHours is now a tab in the main rail alongside Renewals, Field, Money and the others. Shows office team by their first→last *message actually sent* in respond.io (not the green dot, which lies about presence), and technicians by their first→last scheduled field job. Refreshed 3× a working day (09:00, 14:00, 20:00).

Who it helpsOmar — a quick glance tells you who is actually working when.

ByClaude

scripts/work_hours.py, dashboards/waterclub/hours.html
DashboardDoneSales leaderboard moved onto the live 5-minute push

BeforeSales figures refreshed once, overnight at 04:30 — so the 7-day leaderboard was stale for most of the day.

AfterThe 5-minute refresh now recomputes and pushes the leaderboard block as well. Adds ~15 seconds per run. If Zoho or respond.io blip during a push, the block is left out for that turn and the board keeps showing the last good version.

Who it helpsOmar, Liliana and the sales team — the leaderboard on the board matches reality within five minutes, not the next morning.

ByClaude

scripts/rebuild_dashboard_data.py, scripts/build_sales_leaderboard.py
WebsiteDoneSite security hardened and the product-finder quiz rebuilt

BeforeNo 2FA on WordPress. No captcha on public forms. 32 plugins installed, including one (WP File Manager) that carries a known vulnerability. Brand colours were the wrong Pantones. The product-finder quiz was broken because Divi was mangling its inline JavaScript.

AfterWP 2FA installed (Omar enrolled with Microsoft Authenticator). hCaptcha live on login, register, checkout and Contact Form 7. Divi licence wired to WaterClub's account. WP File Manager deleted; plugin count went from 32 to 21. Official WaterClub Pantones (#155C9A blue, #6DA130 green) applied across 9 Divi colour options. Product-finder quiz reduced from 5 questions to 4 (budget removed on Omar's call), rebuilt with proper emirate-based routing and kitchen-fit logic. Its JavaScript was moved out of a Divi code module (which was breaking it) and into a WordPress Code Snippet hooked directly into the page.

Who it helpsOwners — reduced attack surface. Customers — brand looks consistent and the finder actually recommends the right product now.

ByClaude

data/wp-backups/, Code Snippet #70
SystemDoneAutomated cloud backups actually running

BeforeUpdraftPlus was installed on the site but had no destination and no schedule — the last backup was from 22 December 2025. If the site fell over there was nothing to restore from.

AfterDestination set to Google Drive on liliana@waterclub.ae. Database backed up daily, whole file tree weekly. 30 database snapshots and 8 file snapshots kept. First real backup ran the same day (12 minutes for the full site).

Who it helpsOmar and Liliana — the site can be restored from any point in the last month if anything breaks.

ByClaude

UpdraftPlus settings

Tuesday 18 August 2026

SystemDoneTelegram bot online, and alerts routed through it

BeforeNo bot. No monitoring. A system failure (Zoho auth dying, the dashboard freezing, the nightly rebuild silently skipping) would go unnoticed until someone happened to look.

After**@waterclub_admin_bot** is live in the WaterClub Admin group, in an Alerts topic. Ten checks run on their own intervals — the bot, Zoho auth, respond.io session, dashboard freshness, Aisha's round-robin, the nightly rebuild, the AMC and filter chase pages — and any failure lands as a single, deduped Telegram message with three buttons: 🔧 Fix this (opens a new topic with a Fix agent primed on the alert), 🔕 Snooze 1h, ✓ Ack. A separate Cloudflare Worker watches for the Mini going offline, since the Mini can't tell you it's offline.

Who it helpsOmar and Liliana — one place any problem shows up, with a one-tap fix, whether the Mini is up or not.

ByClaude

apps/command/bot.py, scripts/checks/, cloudflare-alerts/worker.js
WebsiteDoneLive site trimmed: navigation, shop, legal pages, /compare

BeforeNav had 10 items nobody used. `/shop` was hidden behind category pages. Legal pages were 2022 boilerplate. There was no `/compare` page. The homepage was quoting a support number that had changed.

AfterNavigation trimmed to what people actually click. `/shop` rebuilt with a tabbed grid (Kitchen, Villa, Sparkling, …). `/maintenance` redesigned around 7 clear cards. `/compare` page built with 20 machines in 4 tabbed tables. Returns & Refunds and Terms & Conditions rewritten from scratch (free install, AED 199 service-visit fee, TRN and address named, Paymennt as the gateway). Homepage: six real Google + Trustpilot quotes added, hours line changed to "Order 24/7 · WhatsApp 9am–9pm".

Who it helpsAny customer visiting the site — clearer navigation, honest legal pages, better product comparison, correct opening hours.

ByClaude

scripts/push_legal_pages.py
ZohoDoneThe retired AED 588 plan stopped being billed

BeforeFor a year, Zoho Books had been quietly billing the AED 588 plan instead of the AED 708 RIO plan — 796 line items, AED 95,520 under-charged — because the correct 708 item was switched off and seven items charging 588 were the only ones staff could pick from.

AfterAt Omar's instruction, the AED 708 item was switched back on, renamed **'WaterClub Maintenance Plan — RIO'** so it's actually recognisable in the pick-list, and all seven 588 items were switched off. No invoice was altered — items just disappeared from the list staff choose from. The number of invoices raised on a retired price dropped from 819 a year to 23.

Who it helpsPaula in finance, and every customer we were quietly undercharging — staff can no longer accidentally pick a wrong price.

ByClaude

scripts/fix_zoho_588_plan.py, scripts/zoho_amc_item_audit.py
respond.ioDoneAisha's share of leads bumped to 55% and her mistakes corrected

BeforeAisha was only receiving about 1 in 10 fresh leads. She was also quoting prices she'd invented (AED 828, 999) and confusing kitchen products against each other.

AfterA new redirect step in the auto-assigner watches the share and moves a lead from a human to Aisha whenever her share drops under 55%. Her prompt was corrected on two fronts: **desalinated UAE tap has no calcium** (so 'keeps the good minerals' is a lie here — the pitch was rewritten to chlorine / microplastics / eco), and a **kitchen-fit rule** was added so she never quotes cabinet dimensions.

Who it helpsAisha and any customer who lands with her — faster response, no made-up prices, and the right pitch for UAE water.

ByClaude

scripts/respond_auto_assign.py, outputs/aisha-prompt-live.txt
SystemDonePrevious developer's access removed from every system

BeforeThe prior developer's email still had admin access to WordPress, the Divi theme, Sucuri security alerts, Zoho and Cloudflare — roughly a year after he left.

AfterReassigned WordPress admin (user 1, owning 35 posts + 23 pages + 41 products) from nikos.art@gmail.com to liliana@waterclub.ae. Divi licence moved onto the WaterClub username. Sucuri alerts moved to ops@waterclub.ae. The Cloudflare Turnstile plugin (which held his keys) was deleted. The whole `wp-content/` tree was searched — no trace of his email remains.

Who it helpsOmar and Liliana — nobody outside the company can reach the site, the emails, or the Zoho org any more.

ByClaude

data/wp-backups/

Monday 17 August 2026

WebsiteDoneWebsite, shop and team replies brought in line

BeforeWebsite, shop, catalogue and canned replies disagreed on every AMC price. Some plans advertised without a product behind them so the customer got a WhatsApp instead of a checkout.

After`waterclub.ae/maintenance/` set as the single source of truth. All five yearly plans agree on price everywhere (RIO 708, drinking 808, MEGA RIO 949, Villa Semi 1,399, Villa Full 1,799). The three plans that had no product were created in the shop and Zoho Books so the buttons on the maintenance page now take the customer to a real checkout. The 11 rental listings were unpublished at Omar's instruction. FAQ page rewritten with the correct install times (20–45 min for drinking, 3–4 hrs for villa).

Who it helpsAny customer visiting the site — the price they see is the price the shop actually charges, and every button works.

ByClaude

data/product_catalogue.json, scripts/create_villa_amc_products.py, scripts/create_zoho_amc_items.py
respond.ioDoneVilla campaign: four rep-specific flyers plus Aisha sending it herself

BeforeNo villa marketing material. Villa prices on the site were out of date. Aisha didn't know to mention the free tank cleaning offer or hand a customer a flyer.

AfterA branded villa flyer went through 10 design rounds; the monochromatic v10 was approved. Four per-rep versions (Grace, White, Katherine, Jithin) plus one for Aisha are live on the dashboard's media folder. Aisha's prompt was updated so the moment she confirms a villa she sends her own flyer proactively. Villa prices corrected everywhere — Basic 4,499→5,339, Semi-Advanced 8,855→9,899, Full 13,999→15,000.

Who it helpsThe four sales reps — professional villa collateral. Any customer asking about villa — right prices, right offer.

ByClaude

scripts/respondio_update_aisha_prompt.py, outputs/aisha-media-catalog.md
Field teamDoneThree years of the old field system decoded

BeforeNothing was known about the pre-Zoho field system (Tookan). Nobody could say how many jobs a technician did in a day, how long a job took, or how much of the driving was avoidable.

After22,615 stops covering 5,988 customers, from May 2023 to April 2026, read out and analysed. Measured: 85-minute cycle per job (55 on-site + 30 driving), 5–6 jobs a day, 56% of the work is filter changes. **521 paying customers are past due a filter change with nothing booked** in the new system (AED 1.58M lifetime spend, typically 84 days late) — a list handed to CS.

Who it helpsOmar and Mr Pinto — real numbers to make routing and diary decisions against, plus a specific list of 521 customers to bring back before they forget about us.

ByClaude

scripts/tookan_analyse.py, scripts/tookan_routing_gain.py, outputs/field-changeover-gap.csv
DashboardDoneSherosh and May added to the sales leaderboard, with a 6-month trend view

BeforeThe board only showed Grace, White, Katherine and Jithin. Sherosh's and May's renewals collections were invisible on it.

AfterThe leaderboard now shows six people, with Sherosh and May tagged as customer-service so it's honest about where the money came from. Alongside it, a six-month trend table shows each person's month-on-month change: Sherosh has grown every month since May.

Who it helpsSherosh and May — their work is visible on the sales board for the first time. Omar and Liliana — a truer picture of who is bringing in what.

ByClaude

scripts/build_sales_leaderboard.py
respond.ioDoneEvery Trustpilot review answered, with the hard ones routed to Sherosh

BeforeTrustpilot reviews were piling up unreplied. Bad reviews sat in public with no company response next to them.

AfterAll 3,949 reviews replied to in one 95-minute run. 3,731 five-star got a warm first-name reply; the 20 sub-four-star each got a hand-written reply written to plant reasonable doubt without conceding the customer's version. Sherosh gets a weekly digest at wecare@ with the 20 hardest cases, matched to Zoho where possible, with a suggested action and a direct reply link on each.

Who it helpsSherosh (the escalation handler) plus every visitor reading reviews before buying — the wall of unanswered reviews is gone, and the negative ones now have a considered company voice next to them.

ByClaude

scripts/trustpilot_pull_reviews.mjs, scripts/trustpilot_bulk_reply.mjs, scripts/send_sherosh_reviews_digest.py
ShopDoneQuote system end-to-end, with a real pay-now button

BeforeThere was no formal quote. Reps sent numbers over WhatsApp and the customer had to be walked into a manual invoice to pay.

After`/quote` builds a branded WaterClub quotation (HTML and PDF) from the approved product catalogue, complete with the rep's mobile in the signature, warranty and maintenance blocks, and a green **Pay AED …** button. The button creates a pending order in the shop and lands the customer on WaterClub's own card checkout at the correct total.

Who it helpsGrace, White, Katherine and Jithin — a professional document to send, and the customer can pay in a single tap rather than waiting on Paula to raise an invoice.

ByClaude

scripts/quote_generator.py, data/product_catalogue.json, .claude/commands/quote.md

Friday 14 August 2026

DashboardDoneThe board updates itself every five minutes

BeforeThe dashboard was fully rebuilt and republished every five minutes — roughly 288 times a day. That was going to blow through Cloudflare's monthly deploy allowance in a fortnight, and page loads were slow while the rebuild ran.

AfterNow the Mini pulls only what changed from Zoho Books and the shop (≈11 seconds), pushes the figures to Cloudflare, and the open page asks for them every two minutes and swaps them in with no reload. A full rebuild runs once a night at 04:30. If the numbers on screen ever get older than 10 minutes, the board itself flags it in red.

Who it helpsOmar and anyone looking at the board — figures are never more than 10 minutes old, and the board will tell you itself if that ever slips.

ByClaude

scripts/rebuild_dashboard_data.py, scripts/nightly_dashboard.sh

Thursday 13 August 2026

DashboardDoneDashboard moved onto WaterClub's own Cloudflare account

BeforeThe dashboard was hosted on the operator's personal Cloudflare account — WaterClub did not own where its own customer data was living, and the password gate could silently be bypassed.

AfterLive at https://waterclub-dashboard.pages.dev, owned by omar@waterclub.ae. Every publish now proves the password gate is actually stopping customers before the URL is shared, and rolls the whole deploy back if it can't prove it.

Who it helpsOmar and Liliana — WaterClub owns the platform, and it is impossible to accidentally push customer data to a public URL.

ByClaude

cloudflare-setup/setup_own_cloudflare.sh

Tuesday 11 August 2026

DashboardDoneFirst renewals dashboard, joined to the SHEROSH COLLECTION 2026 sheet

BeforeRenewals were being chased from a Zoho Sheet by hand. No shared view of who was overdue, how much money was at stake, or who was collecting.

AfterLive dashboard showing 1,423 active renewal customers with per-row WhatsApp buttons and handler pills (wecare / gogreen). Automatically merges with the existing SHEROSH COLLECTION 2026 Sheet so nobody has to duplicate work — 815 of 1,423 customers matched to it by invoice.

Who it helpsSherosh and May — one place to see the whole collection pipeline rather than a scattered sheet.

ByClaude

scripts/renewals_server.py, outputs/2026-renewals-dashboard.html
ZohoDoneZoho Books and CRM connectors brought back to life

BeforeZoho reads were failing silently — the `requests` package was missing from the workspace's Python environment, OAuth tokens were never being loaded from `.env`, and the wrong token names were in use.

AfterBoth connectors verified live against WaterClub's Zoho org (724133677). A shared `skills/connectors/zoho_env.py` module now loads `.env`, checks the OAuth scope against the service being asked, and mints the correct token every time.

Who it helpsThe whole system — anything that needs to read Zoho (renewals, insights, field, invoices) now works. Nothing was reachable before.

ByClaude

skills/connectors/zoho_env.py