Process · internal
Hosting and Account Handover
How OH CHEESE! and London Waffle Co. move into accounts the clients own, and the standard steps for every future client.
Prepared 8 November 2026
Shon [Surname]
The rule
Every account is opened with the client's business email, the client holds the owner login and two-step verification, and I'm a team member. Nothing a client pays for, or depends on, sits in my personal accounts after launch. This is how I can promise "you own everything" in the proposal, and how another developer can take over without me.
Accounts each client needs
| Account | Owner | My access | Cost to client |
|---|
| Business email (Google Workspace or a dedicated Gmail) | Client | None | Free with Gmail, or a paid Google Workspace plan |
| Domain registrar | Client | None, or delegate if offered | Yearly domain fee |
| Cloudflare (DNS, hosting, analytics) | Client, Super Administrator | Administrator member | Free plan |
| GitHub (code) | Client account or organisation | Collaborator with write access | Free |
| Google Business Profile | Client, primary owner | Manager | Free |
| Meta Business portfolio and WhatsApp Business Account (WhatsApp Orders only) | Client, admin | Partner or employee with WhatsApp access | Meta's per-message charges |
Cloudflare Registrar does not sell .in domains, so a .in domain is bought at another registrar in the client's name and its nameservers point to the client's Cloudflare account.
Standard process (every project)
At signing
- Ask for a business email the client will keep (for example orders@ or a dedicated Gmail), not a staff member's personal address. Two-step verification goes on a phone the owner controls.
- On a 30-minute call, the client signs up for each account while sharing their screen. They type every password and keep it in their own password manager. I never ask for passwords over WhatsApp.
- The client invites me: Cloudflare (Manage Account, Members, Administrator), GitHub (repository collaborator), Google Business Profile (Manager), Meta (Business settings, Partners, my business ID).
- The client buys the domain with their own card, auto-renew on, and sets its nameservers to the two Cloudflare nameservers shown in their account.
During the build
- Previews stay in my account (thisis-shon.com) so the client's account stays clean until launch.
- Code lives in a private GitHub repository; the README explains how to run, edit and deploy it.
At launch
- In the client's Cloudflare account: Workers and Pages, Create, Import a repository, connect their GitHub. Build command npm run build, output dist. Every push to main then redeploys on its own.
- Add the custom domain to the Worker, check HTTPS, then turn on Web Analytics.
- Transfer the repository: GitHub, Settings, Danger zone, Transfer ownership, to the client's account. I keep collaborator access only if they take the care plan or an add-on that needs it.
- Delete the preview Worker and route from my Cloudflare account, and remove any preview subdomain.
- Send the handover sheet (below) as a PDF, and walk the owner through logging in to each account once.
No care plan, care plan ends, or another developer takes over
- The client removes me (or I remove myself) from Cloudflare, GitHub, Google and Meta, and I confirm in writing.
- The new developer is invited as a member by the client. Nothing needs to move, because everything is already in the client's name.
Handover sheet (given to the client)
| Item | What it contains |
|---|
| Accounts | Each service, its login URL, the email it uses, and who has access. No passwords. |
| Where things are | Domain registrar, Cloudflare account, GitHub repository, WhatsApp number and Meta portfolio. |
| Updating the site | Which file holds prices, products and stores, and that a change pushed to GitHub goes live in about a minute. |
| Renewals | Domain renewal date and card, and Meta billing. |
| Help | My contact if they take the care plan, and a short brief another developer can follow (stack, build command, hosting). |
OH CHEESE! (My Cheesy Story)
| Today | After handover |
|---|
| Code | github.com/thisisshon/ohcheese (mine) | Client's GitHub account |
| Hosting | Worker ohcheese on my Cloudflare, at ohcheese.thisis-shon.com | Worker in client's Cloudflare, connected to their repository |
| Domain | None | [ohcheese.in or similar], bought by the client |
| Ordering | Basket sends a typed WhatsApp message to +91 98116 06737 | Same, plus the WhatsApp Orders dashboard if chosen |
| Google | No profile | Google Business Profile, client is owner (if the add-on is chosen) |
Steps
- Get a brand email (for example hello.ohcheese@gmail.com). The order number +91 98116 06737 belongs to Aaliya: confirm who owns it before it goes on the site and on Meta.
- Create the Cloudflare, GitHub and Google accounts with that email and invite me, as in the standard process.
- Prepare the production build: keep only the chosen direction, remove the version switcher and the ten version routes, and serve the chosen home at the root.
- If they take WhatsApp Orders: the client creates a Meta Business portfolio at business.facebook.com with the brand email, submits verification documents (GST or trade licence, utility bill), adds a WhatsApp Business Account and registers the number. Plan for Meta review to take a few days. They add me as a partner, and the API token and webhook live in their portfolio and Cloudflare account, never mine.
- Point the domain at the client's Cloudflare, connect the repository, add the domain to the Worker, test an order end to end on a phone.
- Transfer the repository, delete ohcheese.thisis-shon.com from my account, send the handover sheet.
Found while reviewing the preview: on phones the Range page shows the desktop layout as well as the mobile one (the layout switcher un-hides it), and an empty checkout shows a total of INR 80 with nothing in the basket. Both are to be fixed before launch.
London Waffle Co.
| Today | After handover |
|---|
| Code | github.com/thisisshon/london-waffle-co (mine) | Client's GitHub account |
| Hosting | Live site on Wix at thelondonwaffle.in; my preview at thisis-shon.com/lw-revamp (Worker lw-revamp) | Worker in client's Cloudflare, serving thelondonwaffle.in |
| Domain | thelondonwaffle.in, registrar not yet confirmed | Same domain, nameservers on the client's Cloudflare |
| Ordering | Order Now goes to Zomato | Same; optional WhatsApp button for franchise and bulk enquiries |
| Email | A personal Gmail is listed on the site | A brand address such as hello@thelondonwaffle.in |
Steps
- Find out where thelondonwaffle.in is registered (Wix or another registrar) and who holds that login. If it's in Wix, either keep it there and change nameservers, or transfer it to a registrar in the owner's name.
- Before touching DNS, write down every existing record, especially MX records if any email runs on the domain, and Google or Meta verification records. Recreate them in Cloudflare first.
- Create the Cloudflare and GitHub accounts with the brand email and invite me.
- Prepare the production build: pick one of the five options, remove the /lw-revamp/ base path so the site serves from the root, and redirect old Wix page URLs to the new pages so search rankings carry over.
- Switch the nameservers in a quiet hour, check the site and email, then cancel the Wix plan only after a week of the new site running without issues.
- Google: claim the existing profiles for each counter under the brand email, merge the duplicates (Marina Mall, BSR Mall) and add the website link.
- WhatsApp (optional): a click-to-chat button needs only the number, with nothing to hand over. Use the WhatsApp Business API only if they want an order or enquiry dashboard; then the same Meta steps as OH CHEESE! apply.
- Transfer the repository, delete the lw-revamp Worker and route from my account, send the handover sheet.
This is a repeat client, so set the accounts up properly now. The next project can then go into the same Cloudflare and GitHub accounts with no new setup.