4 min read

A Bit of SaaS Weekly: Vision Nugget

A Bit of SaaS Weekly: Vision Nugget

This is a weekly newsletter on the Software as a Service world. Learning, building, and shipping. Written by Ethan Mick.

Apple's WWDC is happening this week with some exciting announcements. In the coming weeks, I'll be seeing what's new in Safari and their web world.

The Best Bits


Get to the Core

SaaS products, especially B2B ones, are 80% the same.

It's the busy work you get sucked into when building a product. Things that make the product work, but aren't don't differentiate what you're doing. Things like:

  • Authentication
  • Teams
  • Roles and permissions
  • User Profiles
  • Admin pages
  • Settings

These things are the dull work to make the product function. But it's not what drives user adoption. It's not what you put on your marketing page.

You start with and need to nail, the nugget of your application.

The core. The heart. ❤️.

Figuring out what problem you're solving and the value you are driving.

That's what you should start with and spend your time on. Everything else just needs to be passably good.

For me, I'm working to build out the tools so they can focus on that core faster. A way to focus on the important parts. Considering that most applications need similar things, this should help out a lot of people.

So... what's the core of your app?

Learn to build SaaS

I created a video on verifying user emails on registration. This uses the new Next.js 13 server functions in the app directory for the curious. All in all, it was pretty painless, although I need to go back and consider how to add the loading state.

You can find the source code and a write-up here.

How to validate a user’s email during registration
Adding email verification is an important step in building a SaaS product. It will ensure your users have a valid email for password resets and will cut down on spam. It’s one of the first things you can do when your product is growing quickly to ensure the users are

Tech Tip

In Next.js 13, you can have your form be a React Server Component, and it'll wire the Server Action to the form. But you lose the ability to have a loading state to show the user the form has been submitted.

The experimental useFormStatus React hook adds this back in. Here's how you can wrap your submit button with the hook to get the loading state back.

'use client'

import { Button } from 'lotus-ux'
import { experimental_useFormStatus as useFormStatus } from 'react-dom'

export const Submit = () => {
  const { pending } = useFormStatus()
  return (
    <Button type="submit" loading={pending}>
      Create Account

Go forth and code!

Cloud Chronicles

  • YouTube Subscribers: 1,324 (+76 in the last 7 days)
  • Newsletter Members: 254 (+18 in the last 7 days)
Weekly Update: v2023.6.5
I was in Vermont for the US Memorial Day weekend, and it was glorious. My son loved it, I loved it, my wife loved it, and it was a nice, relaxing (mostly) weekend. I think I’m going to make a more concerted to unplug on weekends when I’m away from

I wrote up a weekly update about my previous week (so, last week, not this week). I think it might be fun to do a casual live stream at the end of the week to also talk about random things I did.

My comments are pushing me toward building full SaaS products. This is good, and where I want to be, but I'm not sure how to execute it. Making a very long video will involve a lot of editing. I'm not too keen on that. Doing a live stream could be fun, but I need to do it consistently. We'll see.

Also, I contributed to Next.js for the first time! It was only a documentation fix, but as I was working on this week's video, I realized their docs were wrong. Their process for getting my contribution in was painless. Great job, Vercel!

docs: Correct `useFormStatus` to be a client component by ethanmick · Pull Request #50991 · vercel/next.js
What?The useFormStatus needs to be used in a client component. That component should be used within a form for the pending property to reflect the form status.Why?The docs are currently not accu…

Last Byte