Google Apps Script · static front end on Cloudflare Pages · $0/month hosting

Stop renting software you could own.

I build custom automations on Google Apps Script that replace the subscriptions a small business pays for every month — quotes, follow-ups, bookings, approvals, invoices, alerts. They run inside your own Google account: your Sheet is the database, your Gmail sends the mail, and there is no server left over to keep paying for.

  • 8business scenarios
  • 17sample builds
  • 11reusable libraries
  • SGD 200one-off, no subscription
  1. 1Form or email inA visitor submits a Google Form, or a daily settlement CSV lands in the inbox.
  2. 2Apps Script runsValidates, de-duplicates and applies the business logic — no server of mine in between.
  3. 3Sheets stores itYour data lands in a sheet you can open, edit and export any time.
  4. 4Docs, Drive, Gmail, Chat outA branded PDF, an email, a calendar invite or a Telegram alert goes out.

The economics

What this usually replaces

Most small teams pay for four categories of subscription without ever using a quarter of what they bought. Each row below is a sample build on this page.

Subscriptions this studio replaces and what is delivered instead
You may be rentingThe kind of tool it replacesWhat you own instead
Email campaigns and follow-up Mailchimp-class senders, Mailshake/Lemlist-class sequences Personalised one-to-one mail from your Gmail, throttled to stay out of the spam folder — cold email sample
Quote, invoice and certificate documents Form Publisher-class add-ons, template PDF tools Form → Docs template → branded PDF in Drive → emailed, watermark-free — quotation sample
Booking and reminders Calendly-class schedulers, review-reminder apps Form + Calendar conflict check + automatic 24-hour reminder on Telegram or SMS — booking sample
CRM, approvals and team workflows HubSpot/Airtable-class per-seat tools, approval add-ons A sheet CRM, per-employee views with row-level isolation, approve/reject by email — permission sample

This page is itself the cheapest sample: a static file on a global CDN, so it costs nothing per visit and nothing per month.

The catalogue

17 sample builds across 8 business scenarios

Every build below is a specification I assemble from the reusable libraries. Filter by scenario, search in your own words, or click a library name inside a card to see every build that uses it. The statuses are honest: none of this is delivered work yet.

Sales & lead gen Spec ready

Cold email & follow-up automation

The pain
Outbound goes through a shared mailing server, so the domain gets flagged as spam — and per-seat tools charge every month for a list you already own.
What the script does
Reads the contact list from your Sheet, sends one-to-one mail from your own Gmail account at a randomised 2–5 minute spacing, writes the send time and the success or failure back to the Sheet, and follows up automatically when nobody replies within three days.
Why it beats renting
No sending domain to warm up, no per-contact fee, and Gemini can draft the opening paragraph from each lead's own context.

Delivery and failures are logged. Gmail gives no open tracking without a tracking pixel, so opens are never claimed.

Sales & lead gen Demo next

Form-to-PDF quotation and confirmation

The pain
A form response arrives as rows of plain text, which looks nothing like the branded quotation the client expects — and the add-on that fixes it charges monthly and watermarks the free tier.
What the script does
Form submitted → the script fills your Google Docs template, swaps the {{Name}}, {{Service}} and {{Price}} placeholders, exports a PDF into Drive and emails it to the client with your logo intact.
Why it beats renting
Buy once, no watermark, no renewal date. This is the first build that gets the 30-second demo recording.

Built from

Ask about this one
Sales & lead gen Spec ready

Booking with automatic reminders

The pain
Free schedulers allow one booking type, the paid tiers charge for features nobody asked for — and the no-show still costs the slot.
What the script does
A Google Form is the booking door. The script checks your Calendar for conflicts, creates the event and invites both sides, then a time-driven trigger reminds the client 24 hours ahead on Telegram or by SMS.
Why it beats renting
Fewer no-shows without a scheduler subscription, and the appointment ledger stays a sheet you own.

Built from

Ask about this one
E-commerce ops Spec ready

Multi-channel order and settlement reconciliation

The pain
Every morning starts with exporting a CSV from each marketplace and pasting it into one ledger. One bad paste and the month's profit figure is wrong.
What the script does
Pulls the daily settlement export from the mail you already receive (or the platform API with signed requests), parses sales, commission and ad spend, and writes one net-profit row per day into the master sheet.
Why it beats renting
Reconciliation happens while you sleep, and every figure stays traceable to the row it came from.

API access is per platform; where the platform only offers an emailed export, that path needs no API approval at all.

E-commerce ops Spec ready

Competitor price watch and drop alerts

The pain
Competitor prices move all day and nobody is watching at three in the morning.
What the script does
A scheduled job reads the competitor feed or public product API, writes a price-history row, highlights the movement in the sheet, and pushes a Telegram alert the moment a price changes.
Why it beats renting
The pricing decision stays yours; the script only makes sure you hear about a change in minutes rather than weeks.

Public data only: an official feed or API where one exists, and page reading only where the site's terms allow it. No logged-in scraping.

E-commerce ops Spec ready

Stock and reorder alerts

The pain
Stock lives in a sheet, and the reorder line is only noticed after a customer orders something that cannot be shipped.
What the script does
A daily time-driven trigger scans the stock column and pushes a card to the owner's Telegram or Discord the moment a quantity crosses the reorder threshold, listing the SKUs and their last seven days of sales.
Why it beats renting
One message per real problem, instead of a dashboard nobody opens.
Docs & finance Spec ready

Invoice, contract and certificate generator

The pain
Every closed deal means filling the same template by hand, exporting a PDF and attaching it to an email.
What the script does
A new order row is merged into the Docs template, the PDF is archived in that client's Drive folder, emailed as the receipt or contract, and the row is stamped with the resulting file URL.
Why it beats renting
Same engine as the quotation sample — a second document type is a template change, not a new project.
Data sync & permissions Spec ready

Cross-sheet and cross-department sync

The pain
Two departments need to share part of a sheet without seeing the rest of it — usually the part with margins in it.
What the script does
A scheduled job extracts only the permitted columns from sheet A, cleans and filters them, then writes them into sheet B. A watermark kept in cache makes each run incremental and duplicate-free.
Why it beats renting
Column- and row-level sharing without moving to a platform with per-seat pricing.
Data sync & permissions Spec ready

Master sheet with per-employee views

The pain
Give the team edit access and someone overwrites a formula. Keep the master sheet private and nobody can enter their own numbers.
What the script does
One master sheet plus one sheet per employee: a scheduled push of each person's own rows downwards, and whatever they edit flows back up. Nobody sees the other columns, and the formulas stay under one owner.
Why it beats renting
It fixes the one thing Sheets cannot do natively — permissions below the whole-file level — while keeping the data in Sheets.
Data sync & permissions Spec ready

Reliable sheet refresh and data capture

The pain
IMPORTXML and GOOGLEFINANCE break with #N/A exactly when the number is needed for an invoice.
What the script does
A scheduled job with retries and error handling calls a stable API or parses the page precisely, then writes plain values into the cells instead of leaving a fragile formula in the sheet.
Why it beats renting
A value in a cell cannot go stale or display an error; when the source changes, you get an alert instead of a broken ledger.
CRM & customer care Spec ready

Lightweight sheet CRM with follow-up reminders

The pain
You do not need a CRM suite. You need to remember to call back on Thursday.
What the script does
A custom menu inside the sheet marks a row as contacted in one click and creates the follow-up event on the rep's Calendar, with a note of what was promised.
Why it beats renting
Follow-through without per-seat pricing, and the pipeline stays a sheet you can pivot however you like.

Built for one to five people who already live in the sheet. If you need per-person permissions, start from the master/employee-view sample instead.

CRM & customer care Spec ready

VIP birthday and renewal care

The pain
Birthdays and membership renewals are remembered by luck, so repeat business leaks away quietly.
What the script does
A daily scan of birthday and renewal dates; three days ahead, a personalised template mail goes out with a discount code, throttled so a five-hundred-row list never trips the daily sending limit.
Why it beats renting
Retention work that happens without anyone having to remember it.
HR & team ops Spec ready

Leave application and approval

The pain
Leave is approved by word of mouth, and nobody can say how many days are left.
What the script does
A form submission emails the manager an approve link and a reject link. One click applies the answer, deducts the balance, marks the team calendar and replies to the employee.
Why it beats renting
The whole trail lives in one sheet: who asked, who approved, when, and what remains.

The email links carry single-use tokens, so an old approval email cannot be replayed.

HR & team ops Spec ready

Interview scheduling and candidate pipeline

The pain
Résumés scatter across an inbox, and every interview starts with three emails about timing.
What the script does
Application mail is parsed into the pipeline sheet; the script offers the interviewer's next free slots and books the one the candidate picks.
Why it beats renting
A pipeline you can actually see, and scheduling that costs nobody a round of emails.
Support & community Spec ready

Instant AI triage and routing on form submission

The pain
Somebody has to read every ticket before anyone knows which one is on fire.
What the script does
Gemini classifies urgency and topic into structured JSON, the script assigns an owner, and the group gets a Telegram mention with a one-line summary.
Why it beats renting
Emergencies surface first without anyone standing guard over the inbox.

Classification is a suggestion, not a verdict: anything below the confidence threshold goes to a human queue instead of being auto-assigned.

Content & SEO Spec ready

WordPress / Ghost AI scheduled publisher

The pain
Writing, formatting and publishing eats the day that should have gone into selling.
What the script does
Topics and keywords live in the sheet; Gemini drafts the outline and the body, then the script formats it and posts the draft through the site's REST API on the schedule you set.
Why it beats renting
A publishing calendar that runs itself, with no per-article tool in the middle.

Drafts, not automatic publishing: a human still presses publish, which is also what keeps the content from reading like a machine wrote it.

The armoury

11 reusable libraries the samples are assembled from

Delivery stays at one or two hours because the hard parts — signing API requests, rendering documents, serialising writes — already exist as libraries. The interfaces below are frozen: SheetDB and FormToDocEngine get implemented first because they appear in the most samples. Click a library name inside a sample to see everywhere it is used.

  • GeminiHelper

    Interface frozen

    Wraps the Gemini API: prompt template substitution, structured JSON output parsing and automatic retries, so no sample hand-rolls a model call.

    const reply = GeminiHelper.ask(prompt, { jsonOutput: true });

  • PDFGenerator

    Interface frozen

    Batch PDF export: give it a Docs template ID, a keyword map and a target Drive folder ID, and it returns the file URL.

    const pdfUrl = PDFGenerator.createFromTemplate(templateId, dataMap, folderId);

  • FormToDocEngine

    Interface frozen

    Renders a Google Docs template by replacing its variables in one pass, then hands the result to PDFGenerator. One engine covers quotes, invoices, contracts and certificates.

    FormToDocEngine.render(templateId, { Name: 'Tommy' });

  • TelegramNotifier / DiscordNotifier

    Interface frozen

    One line pushes rich text, a table or a button message to a bot — no rebuilding the UrlFetchApp payload for every sample that needs an alert.

    TelegramNotifier.sendAlert(botToken, chatId, 'Low stock alert!');

  • SheetDB

    Interface frozen

    A Google Sheet used as a lightweight database: insert(), update() and find() work by header name, never by column index, so a renamed or inserted column cannot silently break a script.

    SheetDB.insert('Users', { name: 'Tommy', status: 'Active' });

  • GmailDrip

    Interface frozen

    Sending without getting the account flagged: randomised delay between messages, a daily quota check before every batch, and a per-contact send log.

    GmailDrip.drip(campaignId);

  • GmailParser

    Interface frozen

    Finds mail by label or query, pulls values out of the body with regex (order numbers, amounts), and reads .csv or .xlsx attachments as text.

    const csvData = GmailParser.getLatestAttachmentData('from:stripe.com', 'csv');

  • AuthHelper

    Interface frozen

    Request signing and API authentication: HMAC-SHA256 and Base64 helpers for the Shopee / Shopify / Stripe style signature schemes, so the crypto is written once instead of every project.

    const headers = AuthHelper.sign(payload, apiSecret);

  • CacheManager

    Interface frozen

    Wraps CacheService and PropertiesService to hold tokens, configuration and sync watermarks, which keeps high-frequency jobs inside the daily quotas and makes a second run cheap.

    CacheManager.getOrSet('fx_rate', () => fetchRate(), 3600);

  • WebHookHandler

    Interface frozen

    A GAS web app as a receiving end: routes a JSON payload by event and writes it to the sheet, which lets Stripe payments, Shopify orders or an approve/reject click land without a server.

    WebHookHandler.on('stripe.paid', handler);

  • CalendarChecker

    Interface frozen

    Free/busy lookup that never double-books: give it a calendar, a window and a meeting length, and it returns the slots that are actually free.

    const slots = CalendarChecker.freeSlots(calId, from, to);

Delivery isolation: the libraries stay with the studio and are referenced by script ID. What you receive is your own entry script, your sheets and your templates — you are never locked out of the automation, and nobody else's customer data ever sits in the same file.

Working together

From a 15-minute call to a running automation

Four steps, no discovery deck, and no invoice that arrives again next month.

  1. 01

    Free 15-minute audit

    You list the repetitive computer work you hate most. I say which parts already exist as a sample, which need a small change, and which are not worth automating at all.

  2. 02

    Fixed quote and scope

    One page: the workflow, the fields, the trigger, what is explicitly out of scope, and the price. You approve it before a line is written.

  3. 03

    Build inside your account

    The work happens in your own Google account, so nothing is copied to a server of mine. Assembly from the libraries is one to two hours; a new document template or a new platform API takes longer, and the quote says so up front.

  4. 04

    Acceptance and handover

    We run a real test together: the sheet row appears, the email arrives, the PDF opens. The sheet, the script and the account stay yours, and the first 14 days of fixes are included.

The 30-second demo

Submit a form, watch a branded PDF land in Drive and in the client's inbox. The recording is the next task on the list, for the form-to-PDF sample.

Not recorded yet — this slot is reserved for the first end-to-end walkthrough.

Pricing

One price, one workflow, no renewal date

The fee is anchored to the subscription it removes, not to lines of code. Replace a tool that costs about SGD 80 a month and the build has paid for itself within three months — then it keeps paying you back.

One automation, delivered

SGD200

One-off. The scope is approved before work starts, and the first 14 days of fixes are included.

  • 15-minute audit call and a fixed one-page scope
  • One workflow built end-to-end inside your own Google account
  • Sheet structure, template placeholders and triggers set up for you
  • An acceptance test run together on a real submission
  • A walkthrough so you can edit a template or a threshold yourself
Start with the free audit

Not included

  • Extra workflows or new features after handover — quoted per request
  • Third-party usage fees, such as SMS credits through Twilio
  • Your Google Workspace subscription — a free Google account covers most samples
  • Ownership transfer of the shared libraries, which are referenced by script ID

No retainer is needed to keep it running: once set up, the automation runs on Google's own triggers.

What are you paying every month right now?

An estimate for the conversation, using only the number you pick and assuming the replaced subscription is cancelled.

SGD 80
You pay over 3 years
One automation costs
Break-even
Kept over 3 years

The estimate ignores tax, any third-party API fees and the value of your own time — treat it as the starting point of the audit call, not as a quotation.

Questions

What clients ask before the first call

Do I need Google Workspace, or is a free account enough?

A free Google account covers most samples on this page. Workspace helps when you need company-owned accounts, admin controls or shared drives across a team.

Where does my data actually live?

In your own account. Your Sheet is the database, your Drive stores the files and your Gmail sends the mail. The script runs inside Google, which is why there is no server of mine holding a copy of your customer list.

What keeps it running after handover?

Google's own time-driven triggers and the deployment inside your account. This website is the only other moving part — a static file on a global CDN, with no server and no monthly fee.

What if I already pay for a tool I like?

Then keep it. I look for the parts where a subscription is doing work you could own, or where the data really should stay in your account — not for a reason to cancel everything.

How long does delivery take?

Once the libraries cover the workflow, a build is one to two hours of assembly plus a short acceptance test. A document template that does not exist yet, or a platform API that has never been signed before, takes longer — and the fixed quote says so before you approve.

What happens when a column is renamed, or two people submit at once?

Reads and writes go by header name, never by column number, and writes are serialised so a double submission cannot overwrite a row. Both failure modes are tested before handover rather than discovered by you during the month-end close.

Who owns the code?

You own the entry script, the sheets and the templates in your account. The shared libraries stay with the studio and are referenced by script ID, which is what keeps a second workflow at assembly cost instead of full price.

What about changes later?

The first 14 days of fixes are free. After that each change is quoted per request, and they are usually small because the workflow already exists. There is no maintenance retainer unless you ask for one.

Next step

Tell me the task you would delete

A free 15-minute audit, no slide deck: a screen share, the repetitive task you resent most, and an honest answer about whether it is worth automating at all.

Client-side checks are for your convenience only; the automation validates everything again on the server side.