Skip to content
TickoffJoin
All posts

building tickoff, clients, invoices

Why I built Tickoff in my spare time

Why a web developer built Tickoff in spare time: the client content and invoice problem, what it does, the Cloudflare stack, and what's unfinished.

By Rajesh Dhiman

, 5 min read

I'm a web developer. On most of my projects, the code was never the slow part. The waiting was.

Waiting for a logo file. For the About page copy. For a hosting login nobody could remember. Then, once the site was handed over, waiting for the invoice to be paid.

The part I'm not proud of: I didn't chase much. Writing "just following up" for the third time felt like nagging, so I'd leave it until Monday, and Monday kept moving. The cost wasn't only money. It was half-finished projects I couldn't close, sitting in the back of my head.

Tickoff is what I built in my spare time to fix that. I'm a lot better at building things than at marketing them, so this post is the plain version: what it does, how it's built, and what isn't done yet.

#The problem, in engineer terms

Every client project I've run has the same loop. Collect things from the client, do the work, get paid, hand over the final files. The work is the part I'm good at. The other three were a pile of emails across different threads, with me as the only one keeping track of what was still open.

What I wanted was one checklist the client could see, and something other than me to send the reminders. Polite, on a schedule, and stopping the moment everything was done.

#What Tickoff does

You send your client one link. No account and no password for them. They see a short checklist and tick things off in any order, on a phone if they like:

  • Upload files, or paste a share link (Google Drive, Dropbox, WeTransfer, OneDrive) for the big folders they already keep in the cloud.
  • Answer questions, like hosting details or what goes on the About page.
  • Pay the invoice, through your own payment link: a Stripe Payment Link, PayPal, Wise, UPI and others. The money goes straight to you. Tickoff never touches it and takes no cut.

Your final files sit on the same page, locked until the invoice is paid.

Reminders go out by email only, from "[Your Studio] Billing Desk", so it's clearly an automated desk and not a made-up assistant. Replies land in your own inbox. The default schedule is 3 days before the due date, on the due date, then 3, 7 and 14 days after, then weekly, up to 8 reminders in total. The wording gets clearer, not harsher. A reply from the client pauses the reminders, every email has a "Pause reminders" link, and they stop as soon as everything is done.

Pricing is simple: free for 1 active client link, and Pro is $15 a month for unlimited links.

And yes, the name is a small joke. It's a checklist you tick off, and it's also how I felt writing my third follow-up email. Clients never see that side of it.

#How it's built

I picked boring, cheap and all in one place wherever I could.

  • Next.js on Cloudflare Workers, through the OpenNext adapter. One codebase for the marketing site, the dashboard and the client page.
  • D1 with Drizzle for the database. It's SQLite, the data is small (links, checklist items, reminder logs), and there's nothing to operate. Drizzle keeps a path open to Postgres if I ever outgrow it.
  • R2 for files. Uploads go straight from the browser to R2 with presigned URLs, never through the Worker, because Worker request bodies have a size limit and video editors send big files. R2 also has no egress fees, which matters when half the product is handing over files.
  • Better Auth for freelancer sign-in. Clients never log in.
  • Reminders are a Cron Trigger every 15 minutes that finds what's due and puts it on a Cloudflare Queue, which sends through Resend. Retries come with the queue.
  • Turnstile, Sentry and PostHog for bots, errors and product analytics.

My rough estimate for running it at launch is $5 to $25 a month.

Payments were the one place the plan really changed. I first designed it around Stripe Connect, where Tickoff would sit in the middle of every payment. Bring-your-own payment link turned out simpler for everyone: no new account for the freelancer, no fee from me, and I never hold anyone's money. With a Stripe Payment Link you can add an optional webhook so payment is confirmed automatically. For other links, the client taps "I've paid", reminders pause, and you mark it paid.

I wrote every product decision down with its reason in a log that's now more than 50 rows long. Two I'm glad I made early: no SMS, because US carrier registration and consent law are a real risk for a one-person company, and no invented human names on reminder emails.

#What's unfinished

Quite a lot:

  • Sign-ups aren't open. There's a waitlist.
  • Reminder sending stays off until the email domain is warmed up.
  • A small private beta comes first. Beta testers get Pro free for 3 months in return for honest feedback.
  • Paid Pro billing isn't live yet.

What you can try today is the free follow-up email generator, which writes the kind of calm follow-up I used to put off, and a clickable demo of the client page with made-up data. I also wrote up how I'd follow up with a client who ghosted you.

If you freelance and you're tired of being the one who chases, I'd like to hear how you handle it today. And I'd like you to try Tickoff when it opens.