<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Miran</title>
    <description>The latest articles on DEV Community by Miran (@miran969).</description>
    <link>https://dev.to/miran969</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3953777%2F1ec42d17-622c-4042-8feb-231d0b761efe.jpg</url>
      <title>DEV Community: Miran</title>
      <link>https://dev.to/miran969</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/miran969"/>
    <language>en</language>
    <item>
      <title>What I Learned Adding Email Notifications to a Small SaaS MVP</title>
      <dc:creator>Miran</dc:creator>
      <pubDate>Tue, 09 Jun 2026 03:00:22 +0000</pubDate>
      <link>https://dev.to/miran969/what-i-learned-adding-email-notifications-to-a-small-saas-mvp-55nf</link>
      <guid>https://dev.to/miran969/what-i-learned-adding-email-notifications-to-a-small-saas-mvp-55nf</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjaei8oikq15fq4fnzhnm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjaei8oikq15fq4fnzhnm.png" alt="An infographic showing how email notifications in a small SaaS MVP should match the workflow state, be sent at the right time, handle failures, and keep a simple notification record" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
When I first thought about adding email notifications to a small SaaS MVP, I imagined it as a simple feature.&lt;/p&gt;

&lt;p&gt;Something happens in the app.&lt;/p&gt;

&lt;p&gt;Send an email.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;p&gt;That was the clean version in my head.&lt;/p&gt;

&lt;p&gt;But once I started thinking through the actual workflow, I realized notifications are not really just about sending messages.&lt;/p&gt;

&lt;p&gt;They are about timing, trust, failure, and making sure the right person gets the right information at the right moment.&lt;/p&gt;

&lt;p&gt;That made the feature feel a lot more important than I expected.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sending the email is only one part
&lt;/h2&gt;

&lt;p&gt;The obvious part of an email notification is the actual email.&lt;/p&gt;

&lt;p&gt;A shift is assigned.&lt;/p&gt;

&lt;p&gt;A staff member gets notified.&lt;/p&gt;

&lt;p&gt;Someone says they cannot make it.&lt;/p&gt;

&lt;p&gt;The owner gets notified.&lt;/p&gt;

&lt;p&gt;A shift needs cover.&lt;/p&gt;

&lt;p&gt;Available staff get notified.&lt;/p&gt;

&lt;p&gt;That sounds straightforward.&lt;/p&gt;

&lt;p&gt;But the more I thought about it, the more I realized that “send an email” is not enough as a product rule.&lt;/p&gt;

&lt;p&gt;The system also needs to know:&lt;/p&gt;

&lt;p&gt;Who should receive it?&lt;/p&gt;

&lt;p&gt;When should they receive it?&lt;/p&gt;

&lt;p&gt;What exactly should the email say?&lt;/p&gt;

&lt;p&gt;What should happen if the email fails?&lt;/p&gt;

&lt;p&gt;Should the app show that the notification was sent?&lt;/p&gt;

&lt;p&gt;Should the owner be able to tell who has already been notified?&lt;/p&gt;

&lt;p&gt;Those questions matter because notifications are usually invisible once they leave the app.&lt;/p&gt;

&lt;p&gt;If the product does not track them clearly, everyone starts guessing.&lt;/p&gt;




&lt;h2&gt;
  
  
  A notification should reduce uncertainty
&lt;/h2&gt;

&lt;p&gt;For a scheduling tool, the goal of a notification is not just to tell someone something.&lt;/p&gt;

&lt;p&gt;The goal is to reduce uncertainty.&lt;/p&gt;

&lt;p&gt;If a staff member gets assigned a shift, the notification should help them respond.&lt;/p&gt;

&lt;p&gt;If someone cannot make it, the notification should help the owner act quickly.&lt;/p&gt;

&lt;p&gt;If a shift needs cover, the notification should help another staff member decide whether they can take it.&lt;/p&gt;

&lt;p&gt;The email is not the product.&lt;/p&gt;

&lt;p&gt;The response after the email is the product.&lt;/p&gt;

&lt;p&gt;That changed how I thought about the feature.&lt;/p&gt;

&lt;p&gt;The email should not just say:&lt;/p&gt;

&lt;p&gt;You have a shift.&lt;/p&gt;

&lt;p&gt;It should make the next action obvious.&lt;/p&gt;

&lt;p&gt;Confirm the shift.&lt;/p&gt;

&lt;p&gt;Say you cannot make it.&lt;/p&gt;

&lt;p&gt;Review a shift that needs cover.&lt;/p&gt;

&lt;p&gt;Open the app to see details.&lt;/p&gt;

&lt;p&gt;A notification that does not lead to a clear next step is just more noise.&lt;/p&gt;




&lt;h2&gt;
  
  
  Timing matters more than I expected
&lt;/h2&gt;

&lt;p&gt;The next thing I had to think about was timing.&lt;/p&gt;

&lt;p&gt;Some emails should probably go out immediately.&lt;/p&gt;

&lt;p&gt;For example, when a new shift is assigned.&lt;/p&gt;

&lt;p&gt;Or when someone says they cannot make it.&lt;/p&gt;

&lt;p&gt;But reminders are different.&lt;/p&gt;

&lt;p&gt;A reminder too early can be ignored.&lt;/p&gt;

&lt;p&gt;A reminder too late is useless.&lt;/p&gt;

&lt;p&gt;A reminder sent at the wrong time can make the product feel unreliable.&lt;/p&gt;

&lt;p&gt;So the timing rule matters.&lt;/p&gt;

&lt;p&gt;If a shift starts tomorrow morning, maybe the reminder should go out the day before.&lt;/p&gt;

&lt;p&gt;If a shift starts in two hours and still has no confirmation, maybe the owner needs to see that sooner.&lt;/p&gt;

&lt;p&gt;If a shift already needs cover, the reminder should not act like everything is normal.&lt;/p&gt;

&lt;p&gt;The notification system has to understand the state of the shift.&lt;/p&gt;

&lt;p&gt;It cannot just send the same message on a fixed schedule without context.&lt;/p&gt;




&lt;h2&gt;
  
  
  State should decide the message
&lt;/h2&gt;

&lt;p&gt;This connects back to the status design.&lt;/p&gt;

&lt;p&gt;A confirmed shift should not get the same kind of notification as a shift waiting for confirmation.&lt;/p&gt;

&lt;p&gt;A shift that needs cover should not get the same message as a normal assigned shift.&lt;/p&gt;

&lt;p&gt;A recently reassigned shift might need a different kind of update.&lt;/p&gt;

&lt;p&gt;The status should shape the email.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but it is easy to forget when building.&lt;/p&gt;

&lt;p&gt;It is tempting to create one generic notification template and reuse it everywhere.&lt;/p&gt;

&lt;p&gt;But generic notifications can create confusion.&lt;/p&gt;

&lt;p&gt;If the email is too vague, the user still has to figure out what happened.&lt;/p&gt;

&lt;p&gt;That is not helpful.&lt;/p&gt;

&lt;p&gt;The email should answer a simple question:&lt;/p&gt;

&lt;p&gt;What changed, and what do I need to do now?&lt;/p&gt;

&lt;p&gt;If the email cannot answer that, it probably should not be sent yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Failed emails need to be visible
&lt;/h2&gt;

&lt;p&gt;This is one of the parts I almost ignored.&lt;/p&gt;

&lt;p&gt;What happens if an email fails?&lt;/p&gt;

&lt;p&gt;Maybe the email address is wrong.&lt;/p&gt;

&lt;p&gt;Maybe the provider rejects it.&lt;/p&gt;

&lt;p&gt;Maybe the account hits a sending limit.&lt;/p&gt;

&lt;p&gt;Maybe the message gets delayed.&lt;/p&gt;

&lt;p&gt;From a technical perspective, the app tried to send it.&lt;/p&gt;

&lt;p&gt;But from the user’s perspective, the person may never receive it.&lt;/p&gt;

&lt;p&gt;That is a big difference.&lt;/p&gt;

&lt;p&gt;If the product silently fails, the owner may think the staff member was notified when they were not.&lt;/p&gt;

&lt;p&gt;That can create the same mess the tool is supposed to prevent.&lt;/p&gt;

&lt;p&gt;So I think the app needs at least some basic visibility around notification status.&lt;/p&gt;

&lt;p&gt;Not a huge notification analytics system.&lt;/p&gt;

&lt;p&gt;Just enough to answer:&lt;/p&gt;

&lt;p&gt;Was the email sent?&lt;/p&gt;

&lt;p&gt;Did it fail?&lt;/p&gt;

&lt;p&gt;Should the owner try another way?&lt;/p&gt;

&lt;p&gt;That small piece of visibility can protect trust.&lt;/p&gt;




&lt;h2&gt;
  
  
  Notifications should not spam people
&lt;/h2&gt;

&lt;p&gt;Another thing I had to think about is frequency.&lt;/p&gt;

&lt;p&gt;If the system sends too many emails, people will start ignoring them.&lt;/p&gt;

&lt;p&gt;That is almost worse than not sending them at all.&lt;/p&gt;

&lt;p&gt;For a small MVP, I think notifications should be limited and intentional.&lt;/p&gt;

&lt;p&gt;Send when something important changes.&lt;/p&gt;

&lt;p&gt;Send when someone needs to take action.&lt;/p&gt;

&lt;p&gt;Send reminders only when they are actually useful.&lt;/p&gt;

&lt;p&gt;Do not send an email for every tiny update.&lt;/p&gt;

&lt;p&gt;Do not remind someone five times if nothing has changed.&lt;/p&gt;

&lt;p&gt;Do not notify the whole team when only one person needs to know.&lt;/p&gt;

&lt;p&gt;The product should be careful with attention.&lt;/p&gt;

&lt;p&gt;Email is useful because people check it.&lt;/p&gt;

&lt;p&gt;But that usefulness disappears if the product becomes noisy.&lt;/p&gt;




&lt;h2&gt;
  
  
  The owner needs context, not just alerts
&lt;/h2&gt;

&lt;p&gt;Owner notifications are different from staff notifications.&lt;/p&gt;

&lt;p&gt;A staff member usually needs a simple action.&lt;/p&gt;

&lt;p&gt;Confirm this shift.&lt;/p&gt;

&lt;p&gt;Review this available shift.&lt;/p&gt;

&lt;p&gt;See the updated details.&lt;/p&gt;

&lt;p&gt;But the owner often needs context.&lt;/p&gt;

&lt;p&gt;Who declined?&lt;/p&gt;

&lt;p&gt;Which shift needs cover?&lt;/p&gt;

&lt;p&gt;How soon is it?&lt;/p&gt;

&lt;p&gt;Has anyone accepted it yet?&lt;/p&gt;

&lt;p&gt;Was anyone notified?&lt;/p&gt;

&lt;p&gt;Does the owner need to step in?&lt;/p&gt;

&lt;p&gt;That means owner emails should probably be more specific.&lt;/p&gt;

&lt;p&gt;Not long.&lt;/p&gt;

&lt;p&gt;Not complicated.&lt;/p&gt;

&lt;p&gt;Just clear enough that the owner understands the situation quickly.&lt;/p&gt;

&lt;p&gt;The owner should not have to open three pages just to understand why they got the email.&lt;/p&gt;

&lt;p&gt;The message should make the next decision easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  The MVP version should stay simple
&lt;/h2&gt;

&lt;p&gt;I do not think the first version needs a complex notification engine.&lt;/p&gt;

&lt;p&gt;It does not need dozens of templates.&lt;/p&gt;

&lt;p&gt;It does not need advanced automation rules.&lt;/p&gt;

&lt;p&gt;It does not need every possible setting.&lt;/p&gt;

&lt;p&gt;But it does need clear defaults.&lt;/p&gt;

&lt;p&gt;For the MVP, I would start with a few basic notification types:&lt;/p&gt;

&lt;p&gt;New shift assigned.&lt;/p&gt;

&lt;p&gt;Shift waiting for confirmation.&lt;/p&gt;

&lt;p&gt;Staff says they cannot make it.&lt;/p&gt;

&lt;p&gt;Shift needs cover.&lt;/p&gt;

&lt;p&gt;Shift has been reassigned.&lt;/p&gt;

&lt;p&gt;Email failed or needs attention.&lt;/p&gt;

&lt;p&gt;That is probably enough to support the core workflow.&lt;/p&gt;

&lt;p&gt;The important part is not having many emails.&lt;/p&gt;

&lt;p&gt;The important part is making each email useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  The app should remember what it sent
&lt;/h2&gt;

&lt;p&gt;This is another small detail that feels important.&lt;/p&gt;

&lt;p&gt;If the system sends a notification, the app should probably remember it.&lt;/p&gt;

&lt;p&gt;Not forever in a complicated way.&lt;/p&gt;

&lt;p&gt;But enough to show a simple history.&lt;/p&gt;

&lt;p&gt;Sent to Alex at 8:30 AM.&lt;/p&gt;

&lt;p&gt;Reminder sent yesterday.&lt;/p&gt;

&lt;p&gt;Cover request sent to available staff.&lt;/p&gt;

&lt;p&gt;Email failed.&lt;/p&gt;

&lt;p&gt;That kind of record helps the owner trust the system.&lt;/p&gt;

&lt;p&gt;It also helps with debugging.&lt;/p&gt;

&lt;p&gt;If someone says they never got the email, the owner can at least see what the app attempted.&lt;/p&gt;

&lt;p&gt;Without that, the app becomes a black box.&lt;/p&gt;

&lt;p&gt;And black boxes are stressful when the work depends on people responding.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned from thinking about this
&lt;/h2&gt;

&lt;p&gt;The biggest lesson is that notifications are not just a technical add-on.&lt;/p&gt;

&lt;p&gt;They are part of the workflow.&lt;/p&gt;

&lt;p&gt;A notification changes what people know.&lt;/p&gt;

&lt;p&gt;It changes what they are expected to do next.&lt;/p&gt;

&lt;p&gt;It can reduce uncertainty.&lt;/p&gt;

&lt;p&gt;Or it can create more uncertainty if it is vague, late, noisy, or invisible when it fails.&lt;/p&gt;

&lt;p&gt;That is why I want to think about notifications as product behavior, not just email delivery.&lt;/p&gt;

&lt;p&gt;The question is not only:&lt;/p&gt;

&lt;p&gt;Did the app send an email?&lt;/p&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;p&gt;Did the right person get the right message at the right time, with a clear next action?&lt;/p&gt;

&lt;p&gt;For a small SaaS MVP, that is probably the real notification feature.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>saas</category>
      <category>email</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Why Time Zones Matter Even in a Small Scheduling Tool</title>
      <dc:creator>Miran</dc:creator>
      <pubDate>Mon, 08 Jun 2026 00:58:30 +0000</pubDate>
      <link>https://dev.to/miran969/why-time-zones-matter-even-in-a-small-scheduling-tool-45nk</link>
      <guid>https://dev.to/miran969/why-time-zones-matter-even-in-a-small-scheduling-tool-45nk</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm784kxmy2piotu9lr0cd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm784kxmy2piotu9lr0cd.png" alt="An infographic explaining why a scheduling tool should use the workspace time zone as the source of truth instead of each person’s device time" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
When I first started thinking about shift scheduling, I did not expect time zones to be something I would care about early.&lt;/p&gt;

&lt;p&gt;The tool is for small teams.&lt;/p&gt;

&lt;p&gt;The shifts are simple.&lt;/p&gt;

&lt;p&gt;Someone has a job at a certain time.&lt;/p&gt;

&lt;p&gt;How complicated can that be?&lt;/p&gt;

&lt;p&gt;That was my first thought.&lt;/p&gt;

&lt;p&gt;But the more I worked through the product flow, the more I realized that time is one of those boring details that only feels boring until it is wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  A shift time is not just a number
&lt;/h2&gt;

&lt;p&gt;At first, I thought of a shift as a date and a time.&lt;/p&gt;

&lt;p&gt;May 12.&lt;br&gt;
9:00 AM.&lt;br&gt;
Four hours.&lt;/p&gt;

&lt;p&gt;That sounds clear.&lt;/p&gt;

&lt;p&gt;But the question is:&lt;/p&gt;

&lt;p&gt;9:00 AM where?&lt;/p&gt;

&lt;p&gt;The owner might create the shift from one location.&lt;/p&gt;

&lt;p&gt;A staff member might view it on another device.&lt;/p&gt;

&lt;p&gt;The browser might have a different timezone setting.&lt;/p&gt;

&lt;p&gt;Someone might be traveling.&lt;/p&gt;

&lt;p&gt;The server might store the time in UTC.&lt;/p&gt;

&lt;p&gt;The workspace might operate in one local area.&lt;/p&gt;

&lt;p&gt;Most of the time, nobody thinks about this.&lt;/p&gt;

&lt;p&gt;Until the time shows up wrong.&lt;/p&gt;

&lt;p&gt;Then it becomes a real product problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Device time feels convenient, but it can be risky
&lt;/h2&gt;

&lt;p&gt;One tempting approach is to use the user’s device timezone.&lt;/p&gt;

&lt;p&gt;That feels natural.&lt;/p&gt;

&lt;p&gt;The browser knows the local timezone.&lt;/p&gt;

&lt;p&gt;The phone knows the local timezone.&lt;/p&gt;

&lt;p&gt;So just show the time based on that.&lt;/p&gt;

&lt;p&gt;But for scheduling work, I do not think that is always the safest default.&lt;/p&gt;

&lt;p&gt;If the business operates in one location, the shift should probably be shown in the business or workspace timezone.&lt;/p&gt;

&lt;p&gt;Not whatever timezone the viewer’s device happens to be using.&lt;/p&gt;

&lt;p&gt;A cleaning team in Los Angeles does not want a 9:00 AM job to look different because someone opened the page while traveling.&lt;/p&gt;

&lt;p&gt;The job is not moving.&lt;/p&gt;

&lt;p&gt;The viewer is.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  The workspace should probably own the schedule time
&lt;/h2&gt;

&lt;p&gt;The rule I am leaning toward is simple:&lt;/p&gt;

&lt;p&gt;The workspace timezone should be the source of truth for scheduled shifts.&lt;/p&gt;

&lt;p&gt;That means when the owner creates a shift, the time belongs to the workspace.&lt;/p&gt;

&lt;p&gt;When staff view the shift, they see it in that same workspace timezone.&lt;/p&gt;

&lt;p&gt;When notifications are sent, they should be based on that workspace schedule.&lt;/p&gt;

&lt;p&gt;This makes the experience more predictable.&lt;/p&gt;

&lt;p&gt;Everyone is talking about the same 9:00 AM.&lt;/p&gt;

&lt;p&gt;The owner does not have to wonder what the staff member’s device converted it to.&lt;/p&gt;

&lt;p&gt;The staff member does not have to guess whether the time is local to them or local to the job.&lt;/p&gt;

&lt;p&gt;The product should make that obvious.&lt;/p&gt;




&lt;h2&gt;
  
  
  The hard part is not storing the time
&lt;/h2&gt;

&lt;p&gt;The technical part is not only about storing timestamps.&lt;/p&gt;

&lt;p&gt;That part is important, but it is not the whole problem.&lt;/p&gt;

&lt;p&gt;The product also has to decide what the time means.&lt;/p&gt;

&lt;p&gt;Is this timestamp an absolute moment?&lt;/p&gt;

&lt;p&gt;Is this a local business time?&lt;/p&gt;

&lt;p&gt;Should the UI convert it?&lt;/p&gt;

&lt;p&gt;Should the notification system convert it?&lt;/p&gt;

&lt;p&gt;What happens if the workspace timezone changes later?&lt;/p&gt;

&lt;p&gt;What happens if a staff member is outside the area?&lt;/p&gt;

&lt;p&gt;What happens if daylight saving time changes?&lt;/p&gt;

&lt;p&gt;These are the kinds of questions that make time feel bigger than it looked at first.&lt;/p&gt;

&lt;p&gt;The code can store a date.&lt;/p&gt;

&lt;p&gt;But the product has to define the rule.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bad timezone handling breaks trust quickly
&lt;/h2&gt;

&lt;p&gt;This is why I think time zones matter even in a small MVP.&lt;/p&gt;

&lt;p&gt;If a color is slightly off, users may not care.&lt;/p&gt;

&lt;p&gt;If a card has too much spacing, users may still understand the product.&lt;/p&gt;

&lt;p&gt;But if the shift time is wrong, trust disappears fast.&lt;/p&gt;

&lt;p&gt;Someone shows up late.&lt;/p&gt;

&lt;p&gt;Someone shows up on the wrong day.&lt;/p&gt;

&lt;p&gt;The owner has to message everyone again.&lt;/p&gt;

&lt;p&gt;The tool becomes one more thing to double-check.&lt;/p&gt;

&lt;p&gt;That is the opposite of what a scheduling product should do.&lt;/p&gt;

&lt;p&gt;A scheduling tool has to be boringly reliable.&lt;/p&gt;

&lt;p&gt;Especially around time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Notifications make this even more important
&lt;/h2&gt;

&lt;p&gt;Time zones also affect reminders.&lt;/p&gt;

&lt;p&gt;If a shift starts at 9:00 AM, when should the reminder go out?&lt;/p&gt;

&lt;p&gt;Two hours before?&lt;/p&gt;

&lt;p&gt;The night before?&lt;/p&gt;

&lt;p&gt;The morning of?&lt;/p&gt;

&lt;p&gt;Those reminders only make sense if the system is using the right schedule time.&lt;/p&gt;

&lt;p&gt;If the app mixes device time, server time, and workspace time without a clear rule, reminders can become confusing.&lt;/p&gt;

&lt;p&gt;A reminder that arrives too early is annoying.&lt;/p&gt;

&lt;p&gt;A reminder that arrives too late is useless.&lt;/p&gt;

&lt;p&gt;A reminder based on the wrong timezone is worse than no reminder because it gives false confidence.&lt;/p&gt;

&lt;p&gt;So the notification system has to follow the same time rule as the schedule.&lt;/p&gt;

&lt;p&gt;One source of truth.&lt;/p&gt;

&lt;p&gt;One interpretation.&lt;/p&gt;

&lt;p&gt;No guessing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The UI should say less, but mean more
&lt;/h2&gt;

&lt;p&gt;I do not think the UI needs to explain time zones everywhere.&lt;/p&gt;

&lt;p&gt;Most users do not want to read a timezone lesson.&lt;/p&gt;

&lt;p&gt;They just want to know when the shift starts.&lt;/p&gt;

&lt;p&gt;But the product should still be clear.&lt;/p&gt;

&lt;p&gt;If the workspace timezone is used, maybe the UI should show that in a small, quiet way.&lt;/p&gt;

&lt;p&gt;Something like:&lt;/p&gt;

&lt;p&gt;Times shown in Los Angeles time&lt;/p&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;p&gt;Workspace timezone: America/Los_Angeles&lt;/p&gt;

&lt;p&gt;Not on every line.&lt;/p&gt;

&lt;p&gt;Not as a scary warning.&lt;/p&gt;

&lt;p&gt;Just enough so people understand the rule.&lt;/p&gt;

&lt;p&gt;The best version is probably one where users do not have to think about it most of the time, but they can still see what the product is doing.&lt;/p&gt;




&lt;h2&gt;
  
  
  This also affects editing
&lt;/h2&gt;

&lt;p&gt;Creating a shift is one part.&lt;/p&gt;

&lt;p&gt;Editing a shift is another.&lt;/p&gt;

&lt;p&gt;If the owner changes a shift from 9:00 AM to 10:00 AM, that change should be understood in the workspace timezone.&lt;/p&gt;

&lt;p&gt;If the staff member receives a notification, it should match that updated workspace time.&lt;/p&gt;

&lt;p&gt;If the shift was already confirmed, the product may need to show that something changed.&lt;/p&gt;

&lt;p&gt;Maybe the staff member should confirm again.&lt;/p&gt;

&lt;p&gt;Maybe not for every small edit.&lt;/p&gt;

&lt;p&gt;I am still thinking about that part.&lt;/p&gt;

&lt;p&gt;But it shows how one timezone decision can affect the rest of the workflow.&lt;/p&gt;

&lt;p&gt;Time is connected to status.&lt;/p&gt;

&lt;p&gt;Time is connected to notifications.&lt;/p&gt;

&lt;p&gt;Time is connected to trust.&lt;/p&gt;

&lt;p&gt;It is not isolated.&lt;/p&gt;




&lt;h2&gt;
  
  
  The MVP rule I would start with
&lt;/h2&gt;

&lt;p&gt;For the first version, I would keep the rule simple.&lt;/p&gt;

&lt;p&gt;Each workspace has one timezone.&lt;/p&gt;

&lt;p&gt;All shifts are created in that workspace timezone.&lt;/p&gt;

&lt;p&gt;All staff see shift times in that workspace timezone.&lt;/p&gt;

&lt;p&gt;All reminders are calculated from that workspace timezone.&lt;/p&gt;

&lt;p&gt;The server can still store timestamps in a safe format.&lt;/p&gt;

&lt;p&gt;But the product rule should stay consistent:&lt;/p&gt;

&lt;p&gt;The schedule belongs to the workspace, not the viewer’s device.&lt;/p&gt;

&lt;p&gt;That is probably enough for the MVP.&lt;/p&gt;

&lt;p&gt;Not a full global scheduling system.&lt;/p&gt;

&lt;p&gt;Not every possible timezone edge case.&lt;/p&gt;

&lt;p&gt;Just a clear default that prevents the most confusing mistakes.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned from thinking about this
&lt;/h2&gt;

&lt;p&gt;Time zones are one of those details that are easy to postpone.&lt;/p&gt;

&lt;p&gt;They do not feel like the main feature.&lt;/p&gt;

&lt;p&gt;They do not look exciting in a screenshot.&lt;/p&gt;

&lt;p&gt;They do not make the landing page sound better.&lt;/p&gt;

&lt;p&gt;But they sit underneath the whole scheduling flow.&lt;/p&gt;

&lt;p&gt;If the product is wrong about time, everything else becomes questionable.&lt;/p&gt;

&lt;p&gt;The dashboard can be clean.&lt;/p&gt;

&lt;p&gt;The status labels can be clear.&lt;/p&gt;

&lt;p&gt;The notifications can be well written.&lt;/p&gt;

&lt;p&gt;But if the shift time is wrong, the system failed.&lt;/p&gt;

&lt;p&gt;That is why I am trying to think about timezone rules early.&lt;/p&gt;

&lt;p&gt;Not because I want to overbuild.&lt;/p&gt;

&lt;p&gt;But because small scheduling tools still need one very clear answer to a boring question:&lt;/p&gt;

&lt;p&gt;What time does this shift actually start?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>saas</category>
      <category>product</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>What Should Staff See Before They Accept a Cover Shift?</title>
      <dc:creator>Miran</dc:creator>
      <pubDate>Sun, 07 Jun 2026 01:29:25 +0000</pubDate>
      <link>https://dev.to/miran969/what-should-staff-see-before-they-accept-a-cover-shift-34c1</link>
      <guid>https://dev.to/miran969/what-should-staff-see-before-they-accept-a-cover-shift-34c1</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3kvlr3ly0zefufeh1ih.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3kvlr3ly0zefufeh1ih.png" alt="A UI comparison showing limited shift details before a staff member accepts a cover shift, and full job details becoming visible after the shift is confirmed" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
When I started thinking about the available shifts page, I thought it would be simple.&lt;/p&gt;

&lt;p&gt;A shift needs cover.&lt;br&gt;
Other staff can see it.&lt;br&gt;
Someone accepts it.&lt;br&gt;
The shift becomes covered.&lt;/p&gt;

&lt;p&gt;That was the clean version.&lt;/p&gt;

&lt;p&gt;But then I ran into a question that felt small at first:&lt;/p&gt;

&lt;p&gt;What should staff see before they accept the shift?&lt;/p&gt;

&lt;p&gt;At first, my answer was simple too.&lt;/p&gt;

&lt;p&gt;Show the shift details.&lt;/p&gt;

&lt;p&gt;But the more I thought about it, the less obvious that felt.&lt;/p&gt;

&lt;p&gt;Because “shift details” can mean a lot of things.&lt;/p&gt;

&lt;p&gt;It can mean the date and time.&lt;/p&gt;

&lt;p&gt;It can mean the rough location.&lt;/p&gt;

&lt;p&gt;It can mean the client name.&lt;/p&gt;

&lt;p&gt;It can mean the full address.&lt;/p&gt;

&lt;p&gt;It can mean entry notes, access instructions, contact information, or internal notes from the owner.&lt;/p&gt;

&lt;p&gt;Those are not all the same.&lt;/p&gt;

&lt;p&gt;And they probably should not all become visible at the same moment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enough to decide, not everything
&lt;/h2&gt;

&lt;p&gt;The first rule I am leaning toward is simple:&lt;/p&gt;

&lt;p&gt;Before someone accepts a cover shift, they should see enough to decide.&lt;/p&gt;

&lt;p&gt;Not everything.&lt;/p&gt;

&lt;p&gt;They probably need to know:&lt;/p&gt;

&lt;p&gt;The date.&lt;/p&gt;

&lt;p&gt;The time.&lt;/p&gt;

&lt;p&gt;The rough area.&lt;/p&gt;

&lt;p&gt;The type of work.&lt;/p&gt;

&lt;p&gt;Maybe the estimated duration.&lt;/p&gt;

&lt;p&gt;Maybe whether it is a normal job or something unusual.&lt;/p&gt;

&lt;p&gt;That is enough for someone to answer the basic question:&lt;/p&gt;

&lt;p&gt;Can I take this?&lt;/p&gt;

&lt;p&gt;But they probably do not need the full address yet.&lt;/p&gt;

&lt;p&gt;They probably do not need entry instructions yet.&lt;/p&gt;

&lt;p&gt;They probably do not need client contact information yet.&lt;/p&gt;

&lt;p&gt;They probably do not need private notes from the owner yet.&lt;/p&gt;

&lt;p&gt;That information matters later.&lt;/p&gt;

&lt;p&gt;But maybe not before the shift is actually theirs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Visibility is part of the product flow
&lt;/h2&gt;

&lt;p&gt;This is the part I almost missed.&lt;/p&gt;

&lt;p&gt;I was thinking about the available shifts page as a list.&lt;/p&gt;

&lt;p&gt;Just show open work.&lt;/p&gt;

&lt;p&gt;But it is not only a list.&lt;/p&gt;

&lt;p&gt;It is also a visibility boundary.&lt;/p&gt;

&lt;p&gt;The page decides when information becomes visible and to whom.&lt;/p&gt;

&lt;p&gt;That makes it more important than a normal list view.&lt;/p&gt;

&lt;p&gt;If the page shows too little, staff cannot decide whether they can take the shift.&lt;/p&gt;

&lt;p&gt;If it shows too much, the product exposes details before it needs to.&lt;/p&gt;

&lt;p&gt;The right answer is probably somewhere in the middle.&lt;/p&gt;

&lt;p&gt;Show enough to make the action possible.&lt;/p&gt;

&lt;p&gt;Hide enough to keep the workflow respectful.&lt;/p&gt;

&lt;p&gt;That balance is a product decision, not just a UI decision.&lt;/p&gt;




&lt;h2&gt;
  
  
  The owner sees a different story
&lt;/h2&gt;

&lt;p&gt;The owner’s view is different.&lt;/p&gt;

&lt;p&gt;The owner needs to understand the full state of the shift.&lt;/p&gt;

&lt;p&gt;Who was originally assigned?&lt;/p&gt;

&lt;p&gt;Who said they cannot make it?&lt;/p&gt;

&lt;p&gt;Is the shift still uncovered?&lt;/p&gt;

&lt;p&gt;Who is eligible to cover it?&lt;/p&gt;

&lt;p&gt;Has someone accepted it?&lt;/p&gt;

&lt;p&gt;Does the owner still need to do anything?&lt;/p&gt;

&lt;p&gt;That is a lot more information than a staff member needs.&lt;/p&gt;

&lt;p&gt;And that is fine.&lt;/p&gt;

&lt;p&gt;Different users should not always see the same version of the same object.&lt;/p&gt;

&lt;p&gt;The owner is managing the workflow.&lt;/p&gt;

&lt;p&gt;The staff member is responding to one part of it.&lt;/p&gt;

&lt;p&gt;If both views show everything, the product starts to feel heavier than it needs to be.&lt;/p&gt;




&lt;h2&gt;
  
  
  The staff view should stay narrow
&lt;/h2&gt;

&lt;p&gt;For staff, I keep coming back to the same idea:&lt;/p&gt;

&lt;p&gt;Keep the view narrow.&lt;/p&gt;

&lt;p&gt;Most staff members do not want an admin dashboard.&lt;/p&gt;

&lt;p&gt;They do not need the whole schedule.&lt;/p&gt;

&lt;p&gt;They do not need to understand every state behind the shift.&lt;/p&gt;

&lt;p&gt;They need a clear action.&lt;/p&gt;

&lt;p&gt;Can I do this shift?&lt;/p&gt;

&lt;p&gt;Do I have enough information to decide?&lt;/p&gt;

&lt;p&gt;What happens if I accept it?&lt;/p&gt;

&lt;p&gt;That is probably enough.&lt;/p&gt;

&lt;p&gt;A narrow staff view is not a limitation.&lt;/p&gt;

&lt;p&gt;It is part of making the product easier to use.&lt;/p&gt;

&lt;p&gt;The less someone has to think, the more likely they are to respond quickly and correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Details can unlock after accepting
&lt;/h2&gt;

&lt;p&gt;The flow I am thinking about now is something like this:&lt;/p&gt;

&lt;p&gt;Before accepting, the staff member sees limited details.&lt;/p&gt;

&lt;p&gt;Date.&lt;/p&gt;

&lt;p&gt;Time.&lt;/p&gt;

&lt;p&gt;Rough location.&lt;/p&gt;

&lt;p&gt;Job type.&lt;/p&gt;

&lt;p&gt;Maybe a short note.&lt;/p&gt;

&lt;p&gt;Then they tap:&lt;/p&gt;

&lt;p&gt;I can cover this.&lt;/p&gt;

&lt;p&gt;The server checks whether the shift is still available.&lt;/p&gt;

&lt;p&gt;If the claim succeeds, the shift becomes theirs.&lt;/p&gt;

&lt;p&gt;After that, more details can appear.&lt;/p&gt;

&lt;p&gt;Full address.&lt;/p&gt;

&lt;p&gt;Entry instructions.&lt;/p&gt;

&lt;p&gt;Client notes.&lt;/p&gt;

&lt;p&gt;Any private job details they actually need to do the work.&lt;/p&gt;

&lt;p&gt;That feels cleaner to me.&lt;/p&gt;

&lt;p&gt;The product is not hiding useful information forever.&lt;/p&gt;

&lt;p&gt;It is just showing information at the right moment.&lt;/p&gt;




&lt;h2&gt;
  
  
  This also helps with trust
&lt;/h2&gt;

&lt;p&gt;There is a trust layer here too.&lt;/p&gt;

&lt;p&gt;If owners feel that every available staff member can see too much too early, they may hesitate to use the feature.&lt;/p&gt;

&lt;p&gt;If staff feel they are being asked to accept a shift without enough context, they may ignore it.&lt;/p&gt;

&lt;p&gt;Both sides need the product to feel reasonable.&lt;/p&gt;

&lt;p&gt;That is why the visibility decision matters.&lt;/p&gt;

&lt;p&gt;It is not only about privacy.&lt;/p&gt;

&lt;p&gt;It is also about confidence.&lt;/p&gt;

&lt;p&gt;The owner should feel safe opening a shift for cover.&lt;/p&gt;

&lt;p&gt;The staff member should feel informed enough to accept it.&lt;/p&gt;

&lt;p&gt;A good flow has to support both.&lt;/p&gt;




&lt;h2&gt;
  
  
  Some details are not equal
&lt;/h2&gt;

&lt;p&gt;This is where I started mentally separating the shift details into levels.&lt;/p&gt;

&lt;p&gt;Basic decision details:&lt;/p&gt;

&lt;p&gt;Date.&lt;br&gt;
Time.&lt;br&gt;
Rough area.&lt;br&gt;
Job type.&lt;br&gt;
Duration.&lt;/p&gt;

&lt;p&gt;Operational details:&lt;/p&gt;

&lt;p&gt;Exact address.&lt;br&gt;
Entry instructions.&lt;br&gt;
Supplies needed.&lt;br&gt;
Parking notes.&lt;br&gt;
Client-specific instructions.&lt;/p&gt;

&lt;p&gt;Sensitive or private details:&lt;/p&gt;

&lt;p&gt;Client contact information.&lt;br&gt;
Internal notes.&lt;br&gt;
Access codes.&lt;br&gt;
Anything the owner would not want widely visible.&lt;/p&gt;

&lt;p&gt;I am not saying this is the final model.&lt;/p&gt;

&lt;p&gt;But even thinking in these levels helps.&lt;/p&gt;

&lt;p&gt;It stops me from treating “show shift details” as one big decision.&lt;/p&gt;

&lt;p&gt;There are different kinds of details.&lt;/p&gt;

&lt;p&gt;They should probably have different visibility rules.&lt;/p&gt;




&lt;h2&gt;
  
  
  The MVP does not need a complicated permission system
&lt;/h2&gt;

&lt;p&gt;I do not want to overbuild this.&lt;/p&gt;

&lt;p&gt;The first version does not need a huge permission engine.&lt;/p&gt;

&lt;p&gt;It probably does not need dozens of custom rules.&lt;/p&gt;

&lt;p&gt;It probably does not need owners configuring every field one by one.&lt;/p&gt;

&lt;p&gt;That would be too much for the MVP.&lt;/p&gt;

&lt;p&gt;But the basic rule should be clear:&lt;/p&gt;

&lt;p&gt;Before accepting, show only decision-level details.&lt;/p&gt;

&lt;p&gt;After accepting, show the details needed to complete the job.&lt;/p&gt;

&lt;p&gt;That is a simple default.&lt;/p&gt;

&lt;p&gt;And simple defaults are useful.&lt;/p&gt;

&lt;p&gt;They keep the product understandable while still leaving room for more control later.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned from thinking about this
&lt;/h2&gt;

&lt;p&gt;This feature reminded me that privacy is not always a separate settings page.&lt;/p&gt;

&lt;p&gt;Sometimes privacy is inside the workflow.&lt;/p&gt;

&lt;p&gt;It is in the moment when a shift becomes visible.&lt;/p&gt;

&lt;p&gt;It is in the question of who can see what before taking action.&lt;/p&gt;

&lt;p&gt;It is in the difference between browsing an available shift and being assigned to it.&lt;/p&gt;

&lt;p&gt;That is easy to miss when building the UI.&lt;/p&gt;

&lt;p&gt;A card can look simple.&lt;/p&gt;

&lt;p&gt;A list can look simple.&lt;/p&gt;

&lt;p&gt;A button can look simple.&lt;/p&gt;

&lt;p&gt;But behind that card is a decision about visibility.&lt;/p&gt;

&lt;p&gt;For this MVP, I think the better default is:&lt;/p&gt;

&lt;p&gt;Show just enough before the action.&lt;/p&gt;

&lt;p&gt;Show more after the responsibility is accepted.&lt;/p&gt;

&lt;p&gt;That keeps the flow simple.&lt;/p&gt;

&lt;p&gt;It keeps the staff view focused.&lt;/p&gt;

&lt;p&gt;And it makes the available shift page feel less like a public board and more like a controlled handoff.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>saas</category>
      <category>product</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>How I Use AI to Find Edge Cases Before Building a Feature</title>
      <dc:creator>Miran</dc:creator>
      <pubDate>Sat, 06 Jun 2026 03:57:38 +0000</pubDate>
      <link>https://dev.to/miran969/how-i-use-ai-to-find-edge-cases-before-building-a-feature-39ik</link>
      <guid>https://dev.to/miran969/how-i-use-ai-to-find-edge-cases-before-building-a-feature-39ik</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4um8kdk4ou8faf7ymxkm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4um8kdk4ou8faf7ymxkm.png" alt="A workflow diagram showing how AI helps review a feature idea, surface edge cases, and turn a messy product flow into a clearer MVP plan" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
One thing I have been using AI for lately is not writing code first.&lt;/p&gt;

&lt;p&gt;It is finding the weird parts of a feature before I build it.&lt;/p&gt;

&lt;p&gt;That sounds less exciting than generating an app from a prompt.&lt;/p&gt;

&lt;p&gt;But honestly, it has been more useful.&lt;/p&gt;

&lt;p&gt;When a feature is still in my head, it usually feels simple.&lt;/p&gt;

&lt;p&gt;A staff member gets a shift.&lt;br&gt;
They confirm it.&lt;br&gt;
The owner sees the status.&lt;/p&gt;

&lt;p&gt;Or someone cannot make it.&lt;br&gt;
They tap a button.&lt;br&gt;
Another person covers the shift.&lt;/p&gt;

&lt;p&gt;Clean enough.&lt;/p&gt;

&lt;p&gt;But once I start asking what can go wrong, the feature gets more real.&lt;/p&gt;

&lt;p&gt;That is where AI has been helpful.&lt;/p&gt;

&lt;p&gt;Not as the person making the product decisions.&lt;/p&gt;

&lt;p&gt;More like a patient reviewer that keeps asking annoying questions.&lt;/p&gt;




&lt;h2&gt;
  
  
  The first version of an idea is usually too clean
&lt;/h2&gt;

&lt;p&gt;When I describe a feature to myself, I naturally describe the happy path.&lt;/p&gt;

&lt;p&gt;The user does the expected thing.&lt;/p&gt;

&lt;p&gt;The system responds correctly.&lt;/p&gt;

&lt;p&gt;The page updates.&lt;/p&gt;

&lt;p&gt;Everyone understands what happened.&lt;/p&gt;

&lt;p&gt;That is the version I want to build because it is easy to picture.&lt;/p&gt;

&lt;p&gt;But real workflows are not usually that clean.&lt;/p&gt;

&lt;p&gt;Someone does not respond.&lt;/p&gt;

&lt;p&gt;Someone responds late.&lt;/p&gt;

&lt;p&gt;Two people click the same button.&lt;/p&gt;

&lt;p&gt;A shift changes after it was already confirmed.&lt;/p&gt;

&lt;p&gt;Someone should not see all the details yet.&lt;/p&gt;

&lt;p&gt;The owner needs to know what changed, but the staff member does not need the whole admin view.&lt;/p&gt;

&lt;p&gt;None of these are strange cases once you think about them.&lt;/p&gt;

&lt;p&gt;But I often do not see them when I am only thinking about the main flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  I use AI to slow the feature down
&lt;/h2&gt;

&lt;p&gt;The main thing AI helps me do is slow the feature down.&lt;/p&gt;

&lt;p&gt;Instead of jumping straight from idea to page, I ask it to walk through the flow step by step.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;What happens before the user clicks this button?&lt;/p&gt;

&lt;p&gt;What happens immediately after?&lt;/p&gt;

&lt;p&gt;Who needs to know?&lt;/p&gt;

&lt;p&gt;What should change on the page?&lt;/p&gt;

&lt;p&gt;What should not change yet?&lt;/p&gt;

&lt;p&gt;What happens if the user clicks twice?&lt;/p&gt;

&lt;p&gt;What happens if another person acts at the same time?&lt;/p&gt;

&lt;p&gt;What happens if the action fails?&lt;/p&gt;

&lt;p&gt;These questions are simple.&lt;/p&gt;

&lt;p&gt;But they force the feature to become more specific.&lt;/p&gt;

&lt;p&gt;And a specific feature is much easier to build than a vague one.&lt;/p&gt;




&lt;h2&gt;
  
  
  I do not ask AI to decide the product
&lt;/h2&gt;

&lt;p&gt;This is the part I try to be careful about.&lt;/p&gt;

&lt;p&gt;AI can generate a lot of possible rules.&lt;/p&gt;

&lt;p&gt;Some of them are useful.&lt;/p&gt;

&lt;p&gt;Some of them are too complicated.&lt;/p&gt;

&lt;p&gt;Some of them sound smart but do not fit the actual product.&lt;/p&gt;

&lt;p&gt;So I do not treat the answer as the final decision.&lt;/p&gt;

&lt;p&gt;I treat it as a list of things to inspect.&lt;/p&gt;

&lt;p&gt;For example, AI might suggest a full approval system, priority ranking, advanced eligibility rules, notification queues, audit logs, and role-based visibility.&lt;/p&gt;

&lt;p&gt;Some of that might be right later.&lt;/p&gt;

&lt;p&gt;But for an MVP, not all of it belongs in the first version.&lt;/p&gt;

&lt;p&gt;The useful question is not:&lt;/p&gt;

&lt;p&gt;Can this be more complete?&lt;/p&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;p&gt;What is the smallest rule that keeps the workflow clear?&lt;/p&gt;

&lt;p&gt;That question still has to come from me.&lt;/p&gt;

&lt;p&gt;AI can help me see the options.&lt;/p&gt;

&lt;p&gt;It cannot know which tradeoff is right for the product.&lt;/p&gt;




&lt;h2&gt;
  
  
  A small example: the cover shift flow
&lt;/h2&gt;

&lt;p&gt;The cover shift flow looked simple at first.&lt;/p&gt;

&lt;p&gt;A staff member says they cannot make it.&lt;/p&gt;

&lt;p&gt;The shift becomes available.&lt;/p&gt;

&lt;p&gt;Someone else takes it.&lt;/p&gt;

&lt;p&gt;The owner sees that it is covered.&lt;/p&gt;

&lt;p&gt;But when I asked AI to look for edge cases, more questions came up.&lt;/p&gt;

&lt;p&gt;What if two people try to take the shift?&lt;/p&gt;

&lt;p&gt;What if the original staff member changes their mind?&lt;/p&gt;

&lt;p&gt;What if the owner already assigned someone manually?&lt;/p&gt;

&lt;p&gt;What if the shift starts soon?&lt;/p&gt;

&lt;p&gt;What if the person trying to cover it should not see the full address yet?&lt;/p&gt;

&lt;p&gt;What if the claim fails?&lt;/p&gt;

&lt;p&gt;What should the second person see?&lt;/p&gt;

&lt;p&gt;Those questions changed the shape of the feature.&lt;/p&gt;

&lt;p&gt;The UI was no longer just a button and a card.&lt;/p&gt;

&lt;p&gt;There had to be a rule behind the button.&lt;/p&gt;

&lt;p&gt;There had to be a clear state after the action.&lt;/p&gt;

&lt;p&gt;There had to be a polite failure message if someone was too late.&lt;/p&gt;

&lt;p&gt;That is the kind of thing I want to find before writing too much code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Edge cases are not always extra features
&lt;/h2&gt;

&lt;p&gt;I used to think edge cases were mostly things you handle later.&lt;/p&gt;

&lt;p&gt;Build the main version first.&lt;/p&gt;

&lt;p&gt;Clean up the weird parts later.&lt;/p&gt;

&lt;p&gt;Sometimes that is still true.&lt;/p&gt;

&lt;p&gt;But I am starting to see that some edge cases are not really optional.&lt;/p&gt;

&lt;p&gt;They are part of the core workflow.&lt;/p&gt;

&lt;p&gt;If two people can claim the same shift, that is not a rare technical detail.&lt;/p&gt;

&lt;p&gt;It affects whether the schedule can be trusted.&lt;/p&gt;

&lt;p&gt;If someone can see private job details before accepting a shift, that is not just a UI detail.&lt;/p&gt;

&lt;p&gt;It affects what information the product exposes.&lt;/p&gt;

&lt;p&gt;If the owner cannot tell whether a shift is confirmed or still waiting, that is not a small visual issue.&lt;/p&gt;

&lt;p&gt;It affects the whole reason the product exists.&lt;/p&gt;

&lt;p&gt;So I try to separate two types of edge cases.&lt;/p&gt;

&lt;p&gt;Some are future complexity.&lt;/p&gt;

&lt;p&gt;Some are core clarity.&lt;/p&gt;

&lt;p&gt;AI is useful for listing both.&lt;/p&gt;

&lt;p&gt;Then I still have to decide which ones matter now.&lt;/p&gt;




&lt;h2&gt;
  
  
  The prompt that usually helps me
&lt;/h2&gt;

&lt;p&gt;The most useful prompt is not very fancy.&lt;/p&gt;

&lt;p&gt;It is usually something like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here is the feature I am building. Walk through the workflow as different users. Find the edge cases, unclear states, permission issues, and failure cases. Do not add big new features. Focus on what would make the MVP confusing or unreliable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That last part matters.&lt;/p&gt;

&lt;p&gt;If I do not say that, the answer can become too big.&lt;/p&gt;

&lt;p&gt;AI will happily design a full enterprise system if I let it.&lt;/p&gt;

&lt;p&gt;But I am not trying to build everything.&lt;/p&gt;

&lt;p&gt;I am trying to find the parts that would make the first version break trust.&lt;/p&gt;

&lt;p&gt;That is a smaller and more useful goal.&lt;/p&gt;




&lt;h2&gt;
  
  
  I still need to decide what to ignore
&lt;/h2&gt;

&lt;p&gt;The hardest part is not getting suggestions.&lt;/p&gt;

&lt;p&gt;The hard part is deciding what to ignore.&lt;/p&gt;

&lt;p&gt;AI can make a feature feel bigger than it needs to be.&lt;/p&gt;

&lt;p&gt;It can turn one button into ten flows.&lt;/p&gt;

&lt;p&gt;It can make the MVP feel like it needs admin approvals, complex permissions, advanced logs, and detailed rules before anything ships.&lt;/p&gt;

&lt;p&gt;That is dangerous.&lt;/p&gt;

&lt;p&gt;So after I get the edge cases, I try to sort them into three groups.&lt;/p&gt;

&lt;p&gt;Must handle now.&lt;/p&gt;

&lt;p&gt;Can handle with a simple default.&lt;/p&gt;

&lt;p&gt;Can ignore until real users prove it matters.&lt;/p&gt;

&lt;p&gt;For example, double-claiming the same shift probably needs to be handled now.&lt;/p&gt;

&lt;p&gt;A full eligibility ranking system probably does not.&lt;/p&gt;

&lt;p&gt;A simple “already covered” message might be enough for the first version.&lt;/p&gt;

&lt;p&gt;That sorting step is where product judgment still matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this changes before coding
&lt;/h2&gt;

&lt;p&gt;Doing this before coding changes the build in a few ways.&lt;/p&gt;

&lt;p&gt;The database model becomes clearer.&lt;/p&gt;

&lt;p&gt;The status names become clearer.&lt;/p&gt;

&lt;p&gt;The UI actions become narrower.&lt;/p&gt;

&lt;p&gt;The error messages become less surprising.&lt;/p&gt;

&lt;p&gt;The dashboard knows what needs attention.&lt;/p&gt;

&lt;p&gt;The staff view does not accidentally become an admin view.&lt;/p&gt;

&lt;p&gt;It also helps me write better implementation prompts.&lt;/p&gt;

&lt;p&gt;Instead of asking for a vague feature, I can ask for a specific flow.&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;p&gt;Build a cover shift feature.&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;p&gt;When a shift needs cover, show limited details to eligible staff. Let one staff member claim it. The server should confirm the claim only if the shift is still open. If another person already claimed it, show a simple already-covered message.&lt;/p&gt;

&lt;p&gt;That is much easier to build.&lt;/p&gt;

&lt;p&gt;And much harder to misunderstand.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned from using AI this way
&lt;/h2&gt;

&lt;p&gt;The biggest lesson is that AI is more useful when I give it a smaller job.&lt;/p&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;p&gt;Build my product.&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;p&gt;Help me see what I am missing.&lt;/p&gt;

&lt;p&gt;That is where it has been the most helpful.&lt;/p&gt;

&lt;p&gt;It does not replace product thinking.&lt;/p&gt;

&lt;p&gt;It makes product thinking harder to avoid.&lt;/p&gt;

&lt;p&gt;It forces me to write down the flow.&lt;/p&gt;

&lt;p&gt;It shows me where my words are vague.&lt;/p&gt;

&lt;p&gt;It gives me possible failure cases.&lt;/p&gt;

&lt;p&gt;Then I still have to choose what belongs in the MVP.&lt;/p&gt;

&lt;p&gt;For small tools, that has been a good balance.&lt;/p&gt;

&lt;p&gt;AI helps me move from a clean idea to a more realistic workflow.&lt;/p&gt;

&lt;p&gt;But the product still has to be decided by the problem, not by the prompt.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>buildinpublic</category>
      <category>saas</category>
    </item>
    <item>
      <title>The Dashboard Should Show What Needs Attention, Not Everything</title>
      <dc:creator>Miran</dc:creator>
      <pubDate>Thu, 04 Jun 2026 13:56:49 +0000</pubDate>
      <link>https://dev.to/miran969/the-dashboard-should-show-what-needs-attention-not-everything-545p</link>
      <guid>https://dev.to/miran969/the-dashboard-should-show-what-needs-attention-not-everything-545p</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3yste2a4vw4pomvpmkdv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3yste2a4vw4pomvpmkdv.png" alt="A dashboard comparison showing a full schedule view on top and a focused needs-attention view below, highlighting shifts that need cover, confirmation, or action" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
When I first thought about the dashboard for a small scheduling tool, I imagined something pretty standard.&lt;/p&gt;

&lt;p&gt;A calendar.&lt;br&gt;
A list of upcoming shifts.&lt;br&gt;
Some staff names.&lt;br&gt;
Some status labels.&lt;/p&gt;

&lt;p&gt;That felt like the obvious place to start.&lt;/p&gt;

&lt;p&gt;If the product is about scheduling, the dashboard should probably show the schedule.&lt;/p&gt;

&lt;p&gt;But the more I worked through the MVP, the less convinced I became.&lt;/p&gt;

&lt;p&gt;Because a schedule can show everything and still fail to show the thing that matters most.&lt;/p&gt;




&lt;h2&gt;
  
  
  A full schedule can still hide the problem
&lt;/h2&gt;

&lt;p&gt;This was the part I kept coming back to.&lt;/p&gt;

&lt;p&gt;A dashboard can look complete.&lt;/p&gt;

&lt;p&gt;Every shift has a time.&lt;br&gt;
Every job has a staff member.&lt;br&gt;
Every row has a status.&lt;br&gt;
Nothing looks obviously broken.&lt;/p&gt;

&lt;p&gt;But that does not mean the owner is done.&lt;/p&gt;

&lt;p&gt;One shift might still be waiting for confirmation.&lt;/p&gt;

&lt;p&gt;Another one might need cover.&lt;/p&gt;

&lt;p&gt;Someone may have clicked “can’t make it.”&lt;/p&gt;

&lt;p&gt;A shift might be starting soon, but no one has clearly accepted it yet.&lt;/p&gt;

&lt;p&gt;All of that can be inside the dashboard.&lt;/p&gt;

&lt;p&gt;But if the owner has to scan the whole page to find it, the tool is still asking them to do too much work.&lt;/p&gt;

&lt;p&gt;At that point, the product is showing data.&lt;/p&gt;

&lt;p&gt;It is not really helping.&lt;/p&gt;




&lt;h2&gt;
  
  
  The first screen should not be “everything”
&lt;/h2&gt;

&lt;p&gt;My first instinct was to put as much as possible on the dashboard.&lt;/p&gt;

&lt;p&gt;Upcoming shifts.&lt;br&gt;
Recent activity.&lt;br&gt;
Staff availability.&lt;br&gt;
Confirmation status.&lt;br&gt;
Maybe a calendar view.&lt;br&gt;
Maybe some quick actions.&lt;/p&gt;

&lt;p&gt;It felt useful in theory.&lt;/p&gt;

&lt;p&gt;But when I imagined someone actually using it during a busy day, it started to feel heavy.&lt;/p&gt;

&lt;p&gt;Small team owners are not usually opening the dashboard because they want to admire a clean schedule.&lt;/p&gt;

&lt;p&gt;They are opening it because they need to know what needs attention.&lt;/p&gt;

&lt;p&gt;Did everyone confirm?&lt;/p&gt;

&lt;p&gt;Is anything uncovered?&lt;/p&gt;

&lt;p&gt;Did someone back out?&lt;/p&gt;

&lt;p&gt;Is there a shift starting soon that still has no clear answer?&lt;/p&gt;

&lt;p&gt;Those questions are more important than showing every single piece of information at once.&lt;/p&gt;

&lt;p&gt;So the dashboard probably should not start with everything.&lt;/p&gt;

&lt;p&gt;It should start with the things that are not settled yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  “Needs attention” is a different kind of dashboard
&lt;/h2&gt;

&lt;p&gt;Once I thought about it that way, the dashboard changed in my head.&lt;/p&gt;

&lt;p&gt;It was no longer just a schedule overview.&lt;/p&gt;

&lt;p&gt;It became more like a triage page.&lt;/p&gt;

&lt;p&gt;What is fine?&lt;/p&gt;

&lt;p&gt;What is waiting?&lt;/p&gt;

&lt;p&gt;What is risky?&lt;/p&gt;

&lt;p&gt;What needs a decision?&lt;/p&gt;

&lt;p&gt;That feels closer to the real job of the dashboard.&lt;/p&gt;

&lt;p&gt;Not to replace the full schedule.&lt;/p&gt;

&lt;p&gt;The full schedule still matters.&lt;/p&gt;

&lt;p&gt;But the first screen should reduce the amount of remembering the owner has to do.&lt;/p&gt;

&lt;p&gt;The owner should not have to think:&lt;/p&gt;

&lt;p&gt;I need to check if Alex confirmed.&lt;/p&gt;

&lt;p&gt;I need to remember that Jamie said they cannot make it.&lt;/p&gt;

&lt;p&gt;I need to find out whether someone took that open shift.&lt;/p&gt;

&lt;p&gt;I need to scroll back through messages.&lt;/p&gt;

&lt;p&gt;Those things should be pulled forward.&lt;/p&gt;

&lt;p&gt;Because those are the things that can turn into problems later.&lt;/p&gt;




&lt;h2&gt;
  
  
  A calendar view can be too calm
&lt;/h2&gt;

&lt;p&gt;This is something I did not expect to think about.&lt;/p&gt;

&lt;p&gt;Calendars are very good at showing time.&lt;/p&gt;

&lt;p&gt;But they are not always good at showing uncertainty.&lt;/p&gt;

&lt;p&gt;A calendar box can look normal even when the shift is not actually settled.&lt;/p&gt;

&lt;p&gt;The job is still there.&lt;/p&gt;

&lt;p&gt;The time is still there.&lt;/p&gt;

&lt;p&gt;The assigned person is still there.&lt;/p&gt;

&lt;p&gt;Visually, it can feel handled.&lt;/p&gt;

&lt;p&gt;But the real state might be:&lt;/p&gt;

&lt;p&gt;Waiting for confirmation.&lt;/p&gt;

&lt;p&gt;Needs cover.&lt;/p&gt;

&lt;p&gt;Recently reassigned.&lt;/p&gt;

&lt;p&gt;Starting soon with no response.&lt;/p&gt;

&lt;p&gt;That kind of uncertainty needs a different kind of visual priority.&lt;/p&gt;

&lt;p&gt;Maybe it belongs above the calendar.&lt;/p&gt;

&lt;p&gt;Maybe it belongs in an attention list.&lt;/p&gt;

&lt;p&gt;Maybe it needs a small count at the top.&lt;/p&gt;

&lt;p&gt;I am not completely sure yet.&lt;/p&gt;

&lt;p&gt;But I am pretty sure that a clean calendar alone is not enough.&lt;/p&gt;

&lt;p&gt;It can make messy things look calmer than they really are.&lt;/p&gt;




&lt;h2&gt;
  
  
  The dashboard should answer the owner’s next question
&lt;/h2&gt;

&lt;p&gt;The question I keep asking now is simple:&lt;/p&gt;

&lt;p&gt;What does the owner need to know next?&lt;/p&gt;

&lt;p&gt;Not what data exists.&lt;/p&gt;

&lt;p&gt;Not what page looks most complete.&lt;/p&gt;

&lt;p&gt;What do they need to know next?&lt;/p&gt;

&lt;p&gt;If everything is confirmed, the dashboard can be quiet.&lt;/p&gt;

&lt;p&gt;That is good.&lt;/p&gt;

&lt;p&gt;But if three shifts need attention, those should be obvious.&lt;/p&gt;

&lt;p&gt;If a cover request is still open, it should not be buried.&lt;/p&gt;

&lt;p&gt;If someone has not confirmed and the shift is close, that should feel different from a shift two weeks away.&lt;/p&gt;

&lt;p&gt;The dashboard should help the owner decide where to look first.&lt;/p&gt;

&lt;p&gt;That is the part I missed at the beginning.&lt;/p&gt;

&lt;p&gt;I was thinking about the dashboard as a place to display the product.&lt;/p&gt;

&lt;p&gt;Now I am thinking about it as a place to reduce uncertainty.&lt;/p&gt;




&lt;h2&gt;
  
  
  Not every status needs the same weight
&lt;/h2&gt;

&lt;p&gt;This connects to the status design too.&lt;/p&gt;

&lt;p&gt;A confirmed shift does not need much attention.&lt;/p&gt;

&lt;p&gt;It should be visible, but calm.&lt;/p&gt;

&lt;p&gt;A waiting shift might need light attention.&lt;/p&gt;

&lt;p&gt;A shift that needs cover should be much harder to miss.&lt;/p&gt;

&lt;p&gt;A recently reassigned shift might need a little context, so the owner understands what changed.&lt;/p&gt;

&lt;p&gt;These statuses should not all look equal.&lt;/p&gt;

&lt;p&gt;If every card is visually the same, the owner has to do the sorting manually.&lt;/p&gt;

&lt;p&gt;That is exactly what I want the product to avoid.&lt;/p&gt;

&lt;p&gt;The interface should make the next action easier to find.&lt;/p&gt;

&lt;p&gt;Not louder than necessary.&lt;/p&gt;

&lt;p&gt;Not full of red alerts everywhere.&lt;/p&gt;

&lt;p&gt;Just clear enough that the owner does not have to keep the real state of the schedule in their head.&lt;/p&gt;




&lt;h2&gt;
  
  
  The full schedule still matters
&lt;/h2&gt;

&lt;p&gt;I do not think the dashboard should remove the full schedule.&lt;/p&gt;

&lt;p&gt;There still needs to be a place to see everything.&lt;/p&gt;

&lt;p&gt;Sometimes the owner wants the whole picture.&lt;/p&gt;

&lt;p&gt;Sometimes they want to check tomorrow.&lt;/p&gt;

&lt;p&gt;Sometimes they want to review who is assigned to which job.&lt;/p&gt;

&lt;p&gt;That view is still useful.&lt;/p&gt;

&lt;p&gt;But I am starting to think it should not be the only main view.&lt;/p&gt;

&lt;p&gt;There is a difference between:&lt;/p&gt;

&lt;p&gt;Here is everything on your schedule.&lt;/p&gt;

&lt;p&gt;And:&lt;/p&gt;

&lt;p&gt;Here is what needs your attention right now.&lt;/p&gt;

&lt;p&gt;For this MVP, the second one feels more important.&lt;/p&gt;

&lt;p&gt;The full schedule can be one click away.&lt;/p&gt;

&lt;p&gt;The problems should be closer.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned from this
&lt;/h2&gt;

&lt;p&gt;This is a small product decision, but it changed how I think about the dashboard.&lt;/p&gt;

&lt;p&gt;A dashboard should not just show what exists.&lt;/p&gt;

&lt;p&gt;It should show what matters first.&lt;/p&gt;

&lt;p&gt;That sounds obvious after writing it down.&lt;/p&gt;

&lt;p&gt;But when building an MVP, it is easy to start with the page that looks like the category.&lt;/p&gt;

&lt;p&gt;Scheduling tool?&lt;/p&gt;

&lt;p&gt;Build a calendar.&lt;/p&gt;

&lt;p&gt;Task tool?&lt;/p&gt;

&lt;p&gt;Build a list.&lt;/p&gt;

&lt;p&gt;CRM?&lt;/p&gt;

&lt;p&gt;Build contacts.&lt;/p&gt;

&lt;p&gt;Sometimes that is right.&lt;/p&gt;

&lt;p&gt;But sometimes the better starting point is the messy part.&lt;/p&gt;

&lt;p&gt;The thing waiting for a decision.&lt;/p&gt;

&lt;p&gt;The thing that might become a problem.&lt;/p&gt;

&lt;p&gt;The thing the user is trying not to forget.&lt;/p&gt;

&lt;p&gt;For this scheduling flow, I think the dashboard should start there.&lt;/p&gt;

&lt;p&gt;Not with everything.&lt;/p&gt;

&lt;p&gt;With what needs attention.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>saas</category>
      <category>product</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Designing Shift Statuses for a Small Team Scheduling Tool</title>
      <dc:creator>Miran</dc:creator>
      <pubDate>Wed, 03 Jun 2026 05:04:25 +0000</pubDate>
      <link>https://dev.to/miran969/designing-shift-statuses-for-a-small-team-scheduling-tool-3bk5</link>
      <guid>https://dev.to/miran969/designing-shift-statuses-for-a-small-team-scheduling-tool-3bk5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpw86z02vbc7123pwfvlm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpw86z02vbc7123pwfvlm.png" alt="A workflow illustration showing a shift moving through different statuses, from assigned and waiting for confirmation to needing cover, being reassigned, and becoming covered" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One thing I did not expect to spend much time on was shift statuses.&lt;/p&gt;

&lt;p&gt;At first, I thought this part would be simple.&lt;/p&gt;

&lt;p&gt;A shift is either confirmed or not confirmed.&lt;/p&gt;

&lt;p&gt;That was the first version in my head.&lt;/p&gt;

&lt;p&gt;But once I started thinking through the actual workflow, that felt too flat.&lt;/p&gt;

&lt;p&gt;Because in a real schedule, “not confirmed” can mean a few different things.&lt;/p&gt;

&lt;p&gt;It can mean the staff member has not seen the shift yet.&lt;/p&gt;

&lt;p&gt;It can mean they saw it but have not replied.&lt;/p&gt;

&lt;p&gt;It can mean they said they cannot make it.&lt;/p&gt;

&lt;p&gt;It can mean someone else needs to cover it.&lt;/p&gt;

&lt;p&gt;It can mean someone already took it, but the owner still needs to know what changed.&lt;/p&gt;

&lt;p&gt;Those are very different situations.&lt;/p&gt;

&lt;p&gt;If the product treats all of them the same, the owner still has to figure out the real story manually.&lt;/p&gt;

&lt;p&gt;And that is exactly the kind of mess the tool is supposed to reduce.&lt;/p&gt;




&lt;h2&gt;
  
  
  A status is not just a label
&lt;/h2&gt;

&lt;p&gt;The first mistake I almost made was thinking of status as a label on a card.&lt;/p&gt;

&lt;p&gt;Confirmed.&lt;br&gt;&lt;br&gt;
Unconfirmed.&lt;br&gt;&lt;br&gt;
Cancelled.&lt;/p&gt;

&lt;p&gt;That looks fine in a UI mockup.&lt;/p&gt;

&lt;p&gt;But a status is not only something the user reads.&lt;/p&gt;

&lt;p&gt;It decides what the product does next.&lt;/p&gt;

&lt;p&gt;It changes what actions are available.&lt;/p&gt;

&lt;p&gt;It changes what the owner needs to see.&lt;/p&gt;

&lt;p&gt;It changes what the staff member can do.&lt;/p&gt;

&lt;p&gt;It changes whether the shift should appear in an urgent area, an available shifts list, or a normal schedule view.&lt;/p&gt;

&lt;p&gt;That made me realize the status model needed more thought than I expected.&lt;/p&gt;

&lt;p&gt;Not because the MVP needs to be complicated.&lt;/p&gt;

&lt;p&gt;But because even a small workflow can become confusing if the states are too vague.&lt;/p&gt;




&lt;h2&gt;
  
  
  The first status: assigned
&lt;/h2&gt;

&lt;p&gt;The most basic state is assigned.&lt;/p&gt;

&lt;p&gt;Someone has been placed on a shift.&lt;/p&gt;

&lt;p&gt;But assigned does not mean confirmed.&lt;/p&gt;

&lt;p&gt;This distinction matters.&lt;/p&gt;

&lt;p&gt;A schedule can look complete because every shift has a person attached to it.&lt;/p&gt;

&lt;p&gt;But if those people have not confirmed, the schedule is still not really settled.&lt;/p&gt;

&lt;p&gt;So I started separating these two ideas:&lt;/p&gt;

&lt;p&gt;Who is currently assigned?&lt;/p&gt;

&lt;p&gt;And has that person confirmed?&lt;/p&gt;

&lt;p&gt;Those sound similar, but they answer different questions.&lt;/p&gt;

&lt;p&gt;The owner needs both.&lt;/p&gt;

&lt;p&gt;Assigned tells you who is supposed to do the job.&lt;/p&gt;

&lt;p&gt;Confirmed tells you whether that person has actually acknowledged it.&lt;/p&gt;

&lt;p&gt;Without that distinction, the schedule can look cleaner than it really is.&lt;/p&gt;




&lt;h2&gt;
  
  
  Waiting for confirmation
&lt;/h2&gt;

&lt;p&gt;The next state is waiting for confirmation.&lt;/p&gt;

&lt;p&gt;This is probably the quietest state, but it matters a lot.&lt;/p&gt;

&lt;p&gt;Nothing dramatic has happened yet.&lt;/p&gt;

&lt;p&gt;No one declined.&lt;/p&gt;

&lt;p&gt;No one missed the shift.&lt;/p&gt;

&lt;p&gt;No one made a mistake.&lt;/p&gt;

&lt;p&gt;But the owner still does not have a clear answer.&lt;/p&gt;

&lt;p&gt;That is the uncomfortable part.&lt;/p&gt;

&lt;p&gt;A shift that is waiting for confirmation is not a crisis.&lt;/p&gt;

&lt;p&gt;But it is also not done.&lt;/p&gt;

&lt;p&gt;The product should make that visible without making it feel like an emergency too early.&lt;/p&gt;

&lt;p&gt;This is where timing matters.&lt;/p&gt;

&lt;p&gt;Waiting for confirmation two days before the job is normal.&lt;/p&gt;

&lt;p&gt;Waiting for confirmation thirty minutes before the job is very different.&lt;/p&gt;

&lt;p&gt;The status might be the same, but the urgency is not.&lt;/p&gt;

&lt;p&gt;That is something I think the dashboard should probably care about later.&lt;/p&gt;




&lt;h2&gt;
  
  
  Confirmed
&lt;/h2&gt;

&lt;p&gt;Confirmed is the easiest state to understand.&lt;/p&gt;

&lt;p&gt;The staff member saw the shift and said yes.&lt;/p&gt;

&lt;p&gt;The owner can stop worrying about that specific handoff.&lt;/p&gt;

&lt;p&gt;But even here, I think the product should be careful.&lt;/p&gt;

&lt;p&gt;Confirmed should not mean the shift can never change.&lt;/p&gt;

&lt;p&gt;People still get sick.&lt;/p&gt;

&lt;p&gt;Plans still change.&lt;/p&gt;

&lt;p&gt;Someone can still say they cannot make it later.&lt;/p&gt;

&lt;p&gt;So confirmed is not the end of the entire workflow.&lt;/p&gt;

&lt;p&gt;It is just the current clear state.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but it matters when designing the flow.&lt;/p&gt;

&lt;p&gt;A confirmed shift still needs a path into another state if real life changes.&lt;/p&gt;

&lt;p&gt;The product should not trap the shift just because it was once confirmed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Needs cover
&lt;/h2&gt;

&lt;p&gt;This is the state that changed how I thought about the whole product.&lt;/p&gt;

&lt;p&gt;When someone says they cannot make it, the shift should not just become unconfirmed again.&lt;/p&gt;

&lt;p&gt;That loses important context.&lt;/p&gt;

&lt;p&gt;It is not the same as someone who simply has not replied.&lt;/p&gt;

&lt;p&gt;The person did reply.&lt;/p&gt;

&lt;p&gt;Their answer was no.&lt;/p&gt;

&lt;p&gt;So the shift now has a different problem.&lt;/p&gt;

&lt;p&gt;It needs cover.&lt;/p&gt;

&lt;p&gt;That status is useful because it tells the owner what kind of action is needed.&lt;/p&gt;

&lt;p&gt;Not “wait for a reply.”&lt;/p&gt;

&lt;p&gt;Not “check if they saw it.”&lt;/p&gt;

&lt;p&gt;Find someone else.&lt;/p&gt;

&lt;p&gt;This is why I think “needs cover” deserves to be its own state.&lt;/p&gt;

&lt;p&gt;It makes the problem more specific.&lt;/p&gt;

&lt;p&gt;And specific problems are easier to act on.&lt;/p&gt;




&lt;h2&gt;
  
  
  Available to cover
&lt;/h2&gt;

&lt;p&gt;Once a shift needs cover, it may become visible to other staff.&lt;/p&gt;

&lt;p&gt;But I do not think that should be the same state as “needs cover.”&lt;/p&gt;

&lt;p&gt;Needs cover describes the problem.&lt;/p&gt;

&lt;p&gt;Available to cover describes who can act on it.&lt;/p&gt;

&lt;p&gt;That difference matters.&lt;/p&gt;

&lt;p&gt;From the owner’s side, the shift needs attention.&lt;/p&gt;

&lt;p&gt;From the staff side, the shift may appear as something they can take.&lt;/p&gt;

&lt;p&gt;Same shift.&lt;/p&gt;

&lt;p&gt;Different view.&lt;/p&gt;

&lt;p&gt;Different meaning.&lt;/p&gt;

&lt;p&gt;This is where status and permissions start to overlap.&lt;/p&gt;

&lt;p&gt;The owner may see the full story.&lt;/p&gt;

&lt;p&gt;The available staff may only see enough information to decide whether they can take it.&lt;/p&gt;

&lt;p&gt;The product has to decide what each person sees at each stage.&lt;/p&gt;

&lt;p&gt;That is why the status model cannot be separated from the user roles.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reassigned
&lt;/h2&gt;

&lt;p&gt;If someone else takes the shift, the status should become reassigned or covered.&lt;/p&gt;

&lt;p&gt;I am still thinking about the exact wording.&lt;/p&gt;

&lt;p&gt;“Covered” sounds simple.&lt;/p&gt;

&lt;p&gt;“Reassigned” makes the change more visible.&lt;/p&gt;

&lt;p&gt;Either way, the important thing is that the owner should no longer feel like the shift is unresolved.&lt;/p&gt;

&lt;p&gt;Someone else has taken responsibility for it.&lt;/p&gt;

&lt;p&gt;The schedule has a new assigned person.&lt;/p&gt;

&lt;p&gt;The original person should probably no longer see it as their active shift.&lt;/p&gt;

&lt;p&gt;The new person should now see the full details.&lt;/p&gt;

&lt;p&gt;That means reassignment is not only a label.&lt;/p&gt;

&lt;p&gt;It changes visibility.&lt;/p&gt;

&lt;p&gt;It changes responsibility.&lt;/p&gt;

&lt;p&gt;It changes who gets the next notification.&lt;/p&gt;

&lt;p&gt;That is the part I want the system to make clear.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cancelled should mean something different
&lt;/h2&gt;

&lt;p&gt;I also think cancelled needs to stay separate.&lt;/p&gt;

&lt;p&gt;A cancelled shift means the job itself is no longer happening.&lt;/p&gt;

&lt;p&gt;That is different from a shift that still exists but needs another person.&lt;/p&gt;

&lt;p&gt;This seems like a small distinction, but mixing these two would create confusion fast.&lt;/p&gt;

&lt;p&gt;If a staff member cannot make it, the shift is not cancelled.&lt;/p&gt;

&lt;p&gt;If the client cancels the job, then the shift is cancelled.&lt;/p&gt;

&lt;p&gt;Those are different events.&lt;/p&gt;

&lt;p&gt;They should not share the same status.&lt;/p&gt;

&lt;p&gt;Otherwise, the owner may not know whether they need to find cover or remove the job completely.&lt;/p&gt;

&lt;p&gt;The product should not make that ambiguous.&lt;/p&gt;




&lt;h2&gt;
  
  
  The simple model I am thinking about
&lt;/h2&gt;

&lt;p&gt;Right now, the basic model in my head looks like this:&lt;/p&gt;

&lt;p&gt;Assigned&lt;/p&gt;

&lt;p&gt;Waiting for confirmation&lt;/p&gt;

&lt;p&gt;Confirmed&lt;/p&gt;

&lt;p&gt;Needs cover&lt;/p&gt;

&lt;p&gt;Available to cover&lt;/p&gt;

&lt;p&gt;Reassigned or covered&lt;/p&gt;

&lt;p&gt;Cancelled&lt;/p&gt;

&lt;p&gt;Completed&lt;/p&gt;

&lt;p&gt;That might still change.&lt;/p&gt;

&lt;p&gt;Some of these may become separate fields instead of one status.&lt;/p&gt;

&lt;p&gt;For example, assigned person and confirmation status might be better separated.&lt;/p&gt;

&lt;p&gt;Cover availability might be more of a visibility rule than a core shift status.&lt;/p&gt;

&lt;p&gt;I am not completely sure yet.&lt;/p&gt;

&lt;p&gt;But writing the states out has already helped.&lt;/p&gt;

&lt;p&gt;It forced me to see where I was using one word to describe multiple situations.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned from this
&lt;/h2&gt;

&lt;p&gt;The biggest lesson is that status design is product design.&lt;/p&gt;

&lt;p&gt;It is easy to treat statuses like small UI details.&lt;/p&gt;

&lt;p&gt;But they shape the whole workflow.&lt;/p&gt;

&lt;p&gt;They decide what users see.&lt;/p&gt;

&lt;p&gt;They decide what actions are possible.&lt;/p&gt;

&lt;p&gt;They decide what should be urgent.&lt;/p&gt;

&lt;p&gt;They decide when information becomes visible.&lt;/p&gt;

&lt;p&gt;They decide whether the owner has to keep the real state of the schedule in their head.&lt;/p&gt;

&lt;p&gt;For a small MVP, I do not want to overbuild this.&lt;/p&gt;

&lt;p&gt;But I also do not want the states to be so vague that the tool creates more confusion.&lt;/p&gt;

&lt;p&gt;A good status should make the next step obvious.&lt;/p&gt;

&lt;p&gt;That is probably the standard I want to use.&lt;/p&gt;

&lt;p&gt;If the status does not help someone understand what should happen next, it probably needs to be clearer.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>saas</category>
      <category>product</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>What Happens When Two People Try to Cover the Same Shift?</title>
      <dc:creator>Miran</dc:creator>
      <pubDate>Tue, 02 Jun 2026 05:59:04 +0000</pubDate>
      <link>https://dev.to/miran969/what-happens-when-two-people-try-to-cover-the-same-shift-5afl</link>
      <guid>https://dev.to/miran969/what-happens-when-two-people-try-to-cover-the-same-shift-5afl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fht7yojtfib9bnz4s1ggw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fht7yojtfib9bnz4s1ggw.png" alt="A product illustration showing two staff members trying to claim the same open shift, with the server deciding that one claim succeeds and the other is declined" width="800" height="343"&gt;&lt;/a&gt;&lt;br&gt;
After writing about the cover flow for missed shifts, I kept thinking about one small moment that is easy to ignore:&lt;/p&gt;

&lt;p&gt;What happens if two people try to cover the same shift?&lt;/p&gt;

&lt;p&gt;On the screen, the flow looks simple.&lt;/p&gt;

&lt;p&gt;A shift needs cover.&lt;br&gt;&lt;br&gt;
Available staff can see it.&lt;br&gt;&lt;br&gt;
Someone taps “I can cover this.”&lt;br&gt;&lt;br&gt;
The shift becomes covered.&lt;/p&gt;

&lt;p&gt;That is the clean version.&lt;/p&gt;

&lt;p&gt;But real products usually get messy in the small gap between someone tapping a button and the system deciding what actually happened.&lt;/p&gt;




&lt;h2&gt;
  
  
  The UI can be fast, but it cannot decide the truth
&lt;/h2&gt;

&lt;p&gt;The tempting version is to make the UI feel instant.&lt;/p&gt;

&lt;p&gt;Someone taps the button, and the shift immediately looks like theirs.&lt;/p&gt;

&lt;p&gt;That feels nice.&lt;/p&gt;

&lt;p&gt;The product feels quick.&lt;br&gt;&lt;br&gt;
The action feels clear.&lt;br&gt;&lt;br&gt;
The user gets feedback right away.&lt;/p&gt;

&lt;p&gt;But there is a problem.&lt;/p&gt;

&lt;p&gt;The UI does not know if someone else tapped the same button at almost the same time.&lt;/p&gt;

&lt;p&gt;Maybe two staff members saw the available shift.&lt;/p&gt;

&lt;p&gt;Maybe both wanted it.&lt;/p&gt;

&lt;p&gt;Maybe both tapped within a few seconds of each other.&lt;/p&gt;

&lt;p&gt;If both screens show success, the product just created a new problem.&lt;/p&gt;

&lt;p&gt;Now two people may think they are covering the same shift.&lt;/p&gt;

&lt;p&gt;That is worse than the shift being uncovered.&lt;/p&gt;

&lt;p&gt;Because now the owner has to clean up the confusion created by the tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  The server should make the final call
&lt;/h2&gt;

&lt;p&gt;For this kind of flow, I think the UI can feel responsive, but the server has to be the source of truth.&lt;/p&gt;

&lt;p&gt;The staff member can tap “I can cover this.”&lt;/p&gt;

&lt;p&gt;The app can show a loading state.&lt;/p&gt;

&lt;p&gt;Maybe even something friendly like:&lt;/p&gt;

&lt;p&gt;Checking availability...&lt;/p&gt;

&lt;p&gt;But the shift should only become theirs after the server confirms it.&lt;/p&gt;

&lt;p&gt;The backend needs to check a few things before accepting the claim.&lt;/p&gt;

&lt;p&gt;Is this shift still open?&lt;/p&gt;

&lt;p&gt;Does it still need cover?&lt;/p&gt;

&lt;p&gt;Has someone else already taken it?&lt;/p&gt;

&lt;p&gt;Is this staff member allowed to take it?&lt;/p&gt;

&lt;p&gt;If all of that passes, the claim succeeds.&lt;/p&gt;

&lt;p&gt;If not, the claim should fail in a normal, human way.&lt;/p&gt;

&lt;p&gt;Not with a scary error.&lt;/p&gt;

&lt;p&gt;Just something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This shift has already been covered.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is enough.&lt;/p&gt;

&lt;p&gt;The person does not need to know about race conditions or database locks.&lt;/p&gt;

&lt;p&gt;They just need to know they were a little too late.&lt;/p&gt;




&lt;h2&gt;
  
  
  First valid claim wins
&lt;/h2&gt;

&lt;p&gt;For the MVP, I would probably keep the rule simple:&lt;/p&gt;

&lt;p&gt;First valid claim wins.&lt;/p&gt;

&lt;p&gt;But the word “valid” matters.&lt;/p&gt;

&lt;p&gt;It is not the first person who opened the page.&lt;/p&gt;

&lt;p&gt;It is not the first person who saw the shift.&lt;/p&gt;

&lt;p&gt;It is not the first person whose UI changed locally.&lt;/p&gt;

&lt;p&gt;It is the first claim that reaches the server and passes the checks.&lt;/p&gt;

&lt;p&gt;That feels like a good default for a small product.&lt;/p&gt;

&lt;p&gt;It is simple enough to understand.&lt;/p&gt;

&lt;p&gt;It avoids double assignment.&lt;/p&gt;

&lt;p&gt;It gives the owner one clear answer.&lt;/p&gt;

&lt;p&gt;And it keeps the staff experience straightforward.&lt;/p&gt;

&lt;p&gt;Someone got it.&lt;br&gt;&lt;br&gt;
The shift is covered.&lt;br&gt;&lt;br&gt;
Move on.&lt;/p&gt;

&lt;p&gt;There are more advanced versions later.&lt;/p&gt;

&lt;p&gt;The owner could approve claims manually.&lt;/p&gt;

&lt;p&gt;The system could rank people by distance, availability, or experience.&lt;/p&gt;

&lt;p&gt;Some staff could get priority.&lt;/p&gt;

&lt;p&gt;But for the first version, I would rather have one reliable rule than five clever rules that create more confusion.&lt;/p&gt;




&lt;h2&gt;
  
  
  The database has to protect the rule
&lt;/h2&gt;

&lt;p&gt;This is the part that is not very visible in the UI, but it matters a lot.&lt;/p&gt;

&lt;p&gt;The frontend should not be the only thing preventing two people from claiming the same shift.&lt;/p&gt;

&lt;p&gt;Disabling the button after someone taps it is not enough.&lt;/p&gt;

&lt;p&gt;Two requests can still arrive close together.&lt;/p&gt;

&lt;p&gt;Someone can have the page open in two tabs.&lt;/p&gt;

&lt;p&gt;A slow connection can make the order feel different from what actually happened.&lt;/p&gt;

&lt;p&gt;So the backend or database needs to protect the rule.&lt;/p&gt;

&lt;p&gt;The important idea is simple:&lt;/p&gt;

&lt;p&gt;Only update the shift if it is still available.&lt;/p&gt;

&lt;p&gt;If the shift has already been claimed, the second request should not overwrite it.&lt;/p&gt;

&lt;p&gt;That sounds like a small backend detail.&lt;/p&gt;

&lt;p&gt;But it is exactly the kind of detail that decides whether the product feels trustworthy.&lt;/p&gt;

&lt;p&gt;A scheduling tool cannot be “mostly right” about who is assigned.&lt;/p&gt;

&lt;p&gt;It has to be clear.&lt;/p&gt;




&lt;h2&gt;
  
  
  The owner should not resolve the product’s race condition
&lt;/h2&gt;

&lt;p&gt;This is where the technical detail becomes a product detail.&lt;/p&gt;

&lt;p&gt;If two people think they got the same shift, the owner is forced back into manual coordination.&lt;/p&gt;

&lt;p&gt;They have to message one person.&lt;/p&gt;

&lt;p&gt;Then message the other.&lt;/p&gt;

&lt;p&gt;Then explain what happened.&lt;/p&gt;

&lt;p&gt;Then update the schedule again.&lt;/p&gt;

&lt;p&gt;At that point, the tool did not reduce uncertainty.&lt;/p&gt;

&lt;p&gt;It just moved the uncertainty somewhere else.&lt;/p&gt;

&lt;p&gt;That is the thing I want to avoid.&lt;/p&gt;

&lt;p&gt;The whole point of the cover flow is to make a messy handoff clearer.&lt;/p&gt;

&lt;p&gt;If the system creates another messy handoff, the feature failed.&lt;/p&gt;

&lt;p&gt;So claim logic is not just a backend edge case.&lt;/p&gt;

&lt;p&gt;It affects trust.&lt;/p&gt;

&lt;p&gt;The owner needs to believe that when the tool says a shift is covered, it is actually covered.&lt;/p&gt;

&lt;p&gt;The staff member needs to believe that when the tool says they got a shift, they really got it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Eligibility can come later, but the shape matters now
&lt;/h2&gt;

&lt;p&gt;There is another layer here too: eligibility.&lt;/p&gt;

&lt;p&gt;Not everyone should necessarily be able to cover every shift.&lt;/p&gt;

&lt;p&gt;Maybe someone is not available at that time.&lt;/p&gt;

&lt;p&gt;Maybe they are too far away.&lt;/p&gt;

&lt;p&gt;Maybe they do not know that client.&lt;/p&gt;

&lt;p&gt;Maybe they should not see full job details until they accept.&lt;/p&gt;

&lt;p&gt;For the first MVP, I would not try to build a full rules engine.&lt;/p&gt;

&lt;p&gt;That feels too heavy.&lt;/p&gt;

&lt;p&gt;But I do think the claim flow should leave room for rules later.&lt;/p&gt;

&lt;p&gt;The basic question is not only:&lt;/p&gt;

&lt;p&gt;Can this shift be claimed?&lt;/p&gt;

&lt;p&gt;It is also:&lt;/p&gt;

&lt;p&gt;Can this person claim this shift?&lt;/p&gt;

&lt;p&gt;That is a slightly different product shape.&lt;/p&gt;

&lt;p&gt;Even if the first version only checks simple things, the model should probably be ready for more specific rules later.&lt;/p&gt;




&lt;h2&gt;
  
  
  The flow I am thinking about
&lt;/h2&gt;

&lt;p&gt;The claim flow in my head looks like this:&lt;/p&gt;

&lt;p&gt;Staff taps “I can cover this”&lt;/p&gt;

&lt;p&gt;The app sends the claim request&lt;/p&gt;

&lt;p&gt;The server checks whether the shift still needs cover&lt;/p&gt;

&lt;p&gt;The server checks whether this person is allowed to claim it&lt;/p&gt;

&lt;p&gt;If yes, the shift becomes reassigned&lt;/p&gt;

&lt;p&gt;If no, the staff member sees that the shift is no longer available&lt;/p&gt;

&lt;p&gt;The owner sees one clear covered state&lt;/p&gt;

&lt;p&gt;Nothing fancy.&lt;/p&gt;

&lt;p&gt;But it solves the important part.&lt;/p&gt;

&lt;p&gt;Only one person gets the shift.&lt;/p&gt;

&lt;p&gt;The schedule stays clear.&lt;/p&gt;

&lt;p&gt;The owner does not need to clean up the product’s mistake.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned from thinking about this
&lt;/h2&gt;

&lt;p&gt;This is one of those features where the UI makes the problem look smaller than it is.&lt;/p&gt;

&lt;p&gt;A button can look simple.&lt;/p&gt;

&lt;p&gt;A card can move from one state to another.&lt;/p&gt;

&lt;p&gt;A shift can look covered.&lt;/p&gt;

&lt;p&gt;But the real product is the rule behind the movement.&lt;/p&gt;

&lt;p&gt;Who is allowed to claim it?&lt;/p&gt;

&lt;p&gt;What happens if two people try at the same time?&lt;/p&gt;

&lt;p&gt;Who gets the final state?&lt;/p&gt;

&lt;p&gt;What does the second person see?&lt;/p&gt;

&lt;p&gt;What does the owner need to know?&lt;/p&gt;

&lt;p&gt;That is the part I want to get right.&lt;/p&gt;

&lt;p&gt;Not in an overbuilt way.&lt;/p&gt;

&lt;p&gt;Just enough so the product does not create more confusion when real life gets messy.&lt;/p&gt;

&lt;p&gt;For small tools, I keep finding that the most important work is not always the screen.&lt;/p&gt;

&lt;p&gt;Sometimes it is the quiet rule behind the screen.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>saas</category>
      <category>product</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Building a Cover Flow for Missed Shifts</title>
      <dc:creator>Miran</dc:creator>
      <pubDate>Sat, 30 May 2026 04:22:56 +0000</pubDate>
      <link>https://dev.to/miran969/building-a-cover-flow-for-missed-shifts-1348</link>
      <guid>https://dev.to/miran969/building-a-cover-flow-for-missed-shifts-1348</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgn21nmmix18uoawg7xo4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgn21nmmix18uoawg7xo4.png" alt="A minimal workflow illustration showing a missed shift moving through alert, available cover, and reassigned states" width="800" height="343"&gt;&lt;/a&gt;&lt;br&gt;
I started working on the cover flow for missed shifts, and it became more interesting than I expected.&lt;/p&gt;

&lt;p&gt;At first, I treated it like a simple status change.&lt;/p&gt;

&lt;p&gt;Someone cannot make a shift.&lt;br&gt;&lt;br&gt;
They tap a button.&lt;br&gt;&lt;br&gt;
The shift becomes available for someone else.&lt;/p&gt;

&lt;p&gt;That was the clean version in my head.&lt;/p&gt;

&lt;p&gt;But once I tried to turn it into an actual product flow, I realized there are a few small decisions hiding inside that button.&lt;/p&gt;




&lt;h2&gt;
  
  
  It is not really a cancelled shift
&lt;/h2&gt;

&lt;p&gt;This was the first thing I had to separate.&lt;/p&gt;

&lt;p&gt;If a staff member says they cannot make it, the job itself is not gone.&lt;/p&gt;

&lt;p&gt;The client still expects someone to show up.&lt;br&gt;&lt;br&gt;
The time is still on the schedule.&lt;br&gt;&lt;br&gt;
The owner still needs someone assigned to it.&lt;/p&gt;

&lt;p&gt;So I did not want to treat it like a cancellation.&lt;/p&gt;

&lt;p&gt;It is more like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This shift still exists, but the current person is no longer covering it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds small, but it changes the whole flow.&lt;/p&gt;

&lt;p&gt;The shift is not confirmed anymore.&lt;/p&gt;

&lt;p&gt;It is not completed.&lt;/p&gt;

&lt;p&gt;It is not cancelled.&lt;/p&gt;

&lt;p&gt;It needs cover.&lt;/p&gt;

&lt;p&gt;That one state became the center of the feature.&lt;/p&gt;




&lt;h2&gt;
  
  
  The owner needs to see the problem quickly
&lt;/h2&gt;

&lt;p&gt;Once a shift needs cover, the owner should not have to dig through the full schedule to find it.&lt;/p&gt;

&lt;p&gt;That is something I keep noticing while building this MVP.&lt;/p&gt;

&lt;p&gt;A tool can technically show all the information and still fail at the important part.&lt;/p&gt;

&lt;p&gt;If something needs attention, it should be hard to miss.&lt;/p&gt;

&lt;p&gt;So the owner view should probably not start with the question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What shifts exist?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which shifts need a decision right now?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A missed shift should move into a visible place.&lt;/p&gt;

&lt;p&gt;Not hidden inside a calendar.&lt;br&gt;&lt;br&gt;
Not treated like a normal upcoming shift.&lt;br&gt;&lt;br&gt;
Not buried under confirmed jobs.&lt;/p&gt;

&lt;p&gt;It needs to stand out because someone still has to solve it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The staff side should stay simple
&lt;/h2&gt;

&lt;p&gt;The staff side is different.&lt;/p&gt;

&lt;p&gt;A staff member should not need to understand the whole scheduling system.&lt;/p&gt;

&lt;p&gt;They just need a clear action.&lt;/p&gt;

&lt;p&gt;For the person who cannot make it, the action is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I can’t make it&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For someone who might cover the shift, the action is also simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I can cover this&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds obvious, but I think it matters.&lt;/p&gt;

&lt;p&gt;If the staff view starts feeling like an admin dashboard, the product is probably doing too much.&lt;/p&gt;

&lt;p&gt;Most people do not want another system to manage.&lt;/p&gt;

&lt;p&gt;They just want to know what they need to respond to.&lt;/p&gt;

&lt;p&gt;So the staff flow needs to stay narrow.&lt;/p&gt;

&lt;p&gt;Here is the shift.&lt;br&gt;&lt;br&gt;
Here is what you can do.&lt;br&gt;&lt;br&gt;
Here is what happens next.&lt;/p&gt;

&lt;p&gt;That is enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  The available shift should not show everything
&lt;/h2&gt;

&lt;p&gt;This was the part I almost skipped.&lt;/p&gt;

&lt;p&gt;When a shift needs cover, other staff may need to see it.&lt;/p&gt;

&lt;p&gt;But how much should they see before accepting it?&lt;/p&gt;

&lt;p&gt;At first, I imagined showing the full job details.&lt;/p&gt;

&lt;p&gt;That would be easy to build.&lt;/p&gt;

&lt;p&gt;But then I thought about it more.&lt;/p&gt;

&lt;p&gt;Before someone accepts the shift, do they really need the full address?&lt;/p&gt;

&lt;p&gt;Do they need entry notes?&lt;/p&gt;

&lt;p&gt;Do they need client contact information?&lt;/p&gt;

&lt;p&gt;Probably not.&lt;/p&gt;

&lt;p&gt;They need enough information to decide whether they can take the job.&lt;/p&gt;

&lt;p&gt;The date.&lt;br&gt;&lt;br&gt;
The time.&lt;br&gt;&lt;br&gt;
The rough area.&lt;br&gt;&lt;br&gt;
The type of work.&lt;/p&gt;

&lt;p&gt;After they accept it, the full details can appear.&lt;/p&gt;

&lt;p&gt;That feels like a better default.&lt;/p&gt;

&lt;p&gt;The available shift page is not just displaying work.&lt;/p&gt;

&lt;p&gt;It is also deciding when certain information should become visible.&lt;/p&gt;

&lt;p&gt;That is a small product decision, but it changes the feeling of the feature.&lt;/p&gt;




&lt;h2&gt;
  
  
  The flow needs a clean ending
&lt;/h2&gt;

&lt;p&gt;Another detail I had to think through was the ending.&lt;/p&gt;

&lt;p&gt;If someone takes the open shift, what happens next?&lt;/p&gt;

&lt;p&gt;Does the original staff member still see it?&lt;br&gt;&lt;br&gt;
Does the new person become assigned immediately?&lt;br&gt;&lt;br&gt;
Does the owner need to approve it first?&lt;br&gt;&lt;br&gt;
Should the shift keep a small history of what happened?&lt;/p&gt;

&lt;p&gt;I do not think every MVP needs a full audit log on day one.&lt;/p&gt;

&lt;p&gt;That would probably be too much.&lt;/p&gt;

&lt;p&gt;But the product should at least make the current state clear.&lt;/p&gt;

&lt;p&gt;Who is assigned now?&lt;br&gt;&lt;br&gt;
Is the shift covered?&lt;br&gt;&lt;br&gt;
Does the owner still need to do anything?&lt;/p&gt;

&lt;p&gt;That is the real purpose of the flow.&lt;/p&gt;

&lt;p&gt;Not just to let someone click a button.&lt;/p&gt;

&lt;p&gt;The goal is to remove uncertainty.&lt;/p&gt;




&lt;h2&gt;
  
  
  The version I am thinking about now
&lt;/h2&gt;

&lt;p&gt;Right now, the simple version looks something like this:&lt;/p&gt;

&lt;p&gt;Assigned&lt;br&gt;&lt;br&gt;
↓&lt;br&gt;&lt;br&gt;
Staff says they cannot make it&lt;br&gt;&lt;br&gt;
↓&lt;br&gt;&lt;br&gt;
Shift needs cover&lt;br&gt;&lt;br&gt;
↓&lt;br&gt;&lt;br&gt;
Other staff can see limited details&lt;br&gt;&lt;br&gt;
↓&lt;br&gt;&lt;br&gt;
Someone accepts the shift&lt;br&gt;&lt;br&gt;
↓&lt;br&gt;&lt;br&gt;
Shift becomes reassigned&lt;br&gt;&lt;br&gt;
↓&lt;br&gt;&lt;br&gt;
Owner sees it as covered&lt;/p&gt;

&lt;p&gt;This is not complicated.&lt;/p&gt;

&lt;p&gt;But writing it out helped me see the product more clearly.&lt;/p&gt;

&lt;p&gt;The important part is not the number of steps.&lt;/p&gt;

&lt;p&gt;The important part is making sure each person sees the right thing at the right time.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned from this
&lt;/h2&gt;

&lt;p&gt;The cover flow reminded me that small products still need careful state design.&lt;/p&gt;

&lt;p&gt;Not enterprise-level complexity.&lt;/p&gt;

&lt;p&gt;Just enough structure so the product does not become confusing when real life gets messy.&lt;/p&gt;

&lt;p&gt;A missed shift is not just one event.&lt;/p&gt;

&lt;p&gt;It affects the owner.&lt;br&gt;&lt;br&gt;
It affects the original staff member.&lt;br&gt;&lt;br&gt;
It affects the person who might cover it.&lt;br&gt;&lt;br&gt;
It affects what information should be visible.&lt;br&gt;&lt;br&gt;
It affects whether the schedule can still be trusted.&lt;/p&gt;

&lt;p&gt;That is why I like building this kind of small workflow.&lt;/p&gt;

&lt;p&gt;The feature looks simple from the outside.&lt;/p&gt;

&lt;p&gt;But once you build it, you start seeing the decisions that were hiding underneath.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>saas</category>
      <category>product</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>What Looked Simple Until I Started Building the MVP</title>
      <dc:creator>Miran</dc:creator>
      <pubDate>Fri, 29 May 2026 04:00:48 +0000</pubDate>
      <link>https://dev.to/miran969/what-looked-simple-until-i-started-building-the-mvp-4bfp</link>
      <guid>https://dev.to/miran969/what-looked-simple-until-i-started-building-the-mvp-4bfp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fau9u5n2efu6l92lp788d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fau9u5n2efu6l92lp788d.png" alt="A product workflow illustration showing a simple shift confirmation feature becoming more complex inside an MVP" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At first, I thought shift confirmation would be a small feature.&lt;/p&gt;

&lt;p&gt;Someone gets assigned to a job.&lt;br&gt;
They click confirm.&lt;br&gt;
The owner can see it.&lt;/p&gt;

&lt;p&gt;That sounded simple enough.&lt;/p&gt;

&lt;p&gt;But once I started turning it into an actual MVP, I realized the feature was not really about the button.&lt;/p&gt;

&lt;p&gt;It was about everything that happens around the button.&lt;/p&gt;




&lt;h2&gt;
  
  
  The confirm button was the easy part
&lt;/h2&gt;

&lt;p&gt;The first version in my head was very simple.&lt;/p&gt;

&lt;p&gt;A staff member gets a shift.&lt;br&gt;
They see the details.&lt;br&gt;
They click confirm.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;p&gt;But then I started asking small questions.&lt;/p&gt;

&lt;p&gt;What if they do not confirm?&lt;br&gt;
What if they saw the message but forgot to reply?&lt;br&gt;
What if the owner thinks the shift is handled, but the staff member never actually confirmed?&lt;/p&gt;

&lt;p&gt;That is when “unconfirmed” stopped being just a label.&lt;/p&gt;

&lt;p&gt;It became something the owner needs to notice.&lt;/p&gt;

&lt;p&gt;Not because anyone did anything wrong, but because the job time is getting closer and no one wants to find out too late.&lt;/p&gt;




&lt;h2&gt;
  
  
  “Can’t make it” is not the end of the flow
&lt;/h2&gt;

&lt;p&gt;The other case was even more interesting.&lt;/p&gt;

&lt;p&gt;Someone clicks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can’t make it&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At first, that also sounds simple.&lt;/p&gt;

&lt;p&gt;Just mark the person as unavailable.&lt;/p&gt;

&lt;p&gt;But the job does not disappear.&lt;/p&gt;

&lt;p&gt;The client still expects someone to show up.&lt;br&gt;
The owner still needs to find cover.&lt;br&gt;
Someone else may need to take the shift.&lt;/p&gt;

&lt;p&gt;So the shift cannot just become “cancelled.”&lt;/p&gt;

&lt;p&gt;It needs to move into another state.&lt;/p&gt;

&lt;p&gt;Something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This job still exists, but it needs someone else now.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That small difference changed how I thought about the whole flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  The state became more important than the page
&lt;/h2&gt;

&lt;p&gt;I started thinking less about screens and more about states.&lt;/p&gt;

&lt;p&gt;A shift can be waiting for confirmation.&lt;br&gt;
A shift can be confirmed.&lt;br&gt;
A shift can need cover.&lt;br&gt;
A shift can be taken by someone else.&lt;/p&gt;

&lt;p&gt;None of these are complicated on their own.&lt;/p&gt;

&lt;p&gt;But each one changes what people should see.&lt;/p&gt;

&lt;p&gt;The owner needs to know what still needs attention.&lt;/p&gt;

&lt;p&gt;The assigned staff member needs a simple action, not a full scheduling system.&lt;/p&gt;

&lt;p&gt;A person who might cover the shift needs enough information to decide, but not every private client detail right away.&lt;/p&gt;

&lt;p&gt;That last part was something I did not think about at first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Available shifts needed privacy rules
&lt;/h2&gt;

&lt;p&gt;When I first imagined an “available shifts” page, I thought it would be simple.&lt;/p&gt;

&lt;p&gt;Show the open job.&lt;br&gt;
Let someone take it.&lt;/p&gt;

&lt;p&gt;But then I realized the details matter.&lt;/p&gt;

&lt;p&gt;Before someone accepts a cover shift, maybe they should not see the full address, entry instructions, access notes, or client contact information.&lt;/p&gt;

&lt;p&gt;They only need enough to decide:&lt;/p&gt;

&lt;p&gt;Can I do this job?&lt;br&gt;
Is the time okay?&lt;br&gt;
Is the area reasonable?&lt;/p&gt;

&lt;p&gt;After they accept it, then the full details make sense.&lt;/p&gt;

&lt;p&gt;It is a small product decision, but it changes the feeling of the feature.&lt;/p&gt;

&lt;p&gt;The page is not just showing open work.&lt;/p&gt;

&lt;p&gt;It is controlling when information should become visible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Time also became less simple than I expected
&lt;/h2&gt;

&lt;p&gt;The same thing happened with time.&lt;/p&gt;

&lt;p&gt;A shift is not just a date and time if people are looking at it from different devices or locations.&lt;/p&gt;

&lt;p&gt;For a small team, I think it is safer to show everything in the workspace timezone instead of guessing based on each person’s device.&lt;/p&gt;

&lt;p&gt;That sounds like a small detail.&lt;/p&gt;

&lt;p&gt;But if the time is wrong, the whole product becomes useless.&lt;/p&gt;

&lt;p&gt;Someone shows up late.&lt;br&gt;
Someone shows up on the wrong day.&lt;br&gt;
The owner loses trust in the tool.&lt;/p&gt;

&lt;p&gt;So even a boring timezone decision becomes important.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned from this part
&lt;/h2&gt;

&lt;p&gt;Building this reminded me that a lot of MVP work is not about adding more features.&lt;/p&gt;

&lt;p&gt;It is about deciding what should happen in the boring middle.&lt;/p&gt;

&lt;p&gt;What happens after someone clicks confirm.&lt;br&gt;
What happens after someone says they cannot make it.&lt;br&gt;
What the owner needs to see first.&lt;br&gt;
What a staff member should not have to think about.&lt;br&gt;
What information should stay hidden until the right moment.&lt;/p&gt;

&lt;p&gt;The confirm button is easy.&lt;/p&gt;

&lt;p&gt;The harder part is making sure the button fits into a real workflow.&lt;/p&gt;

&lt;p&gt;I am still building this out, and I keep finding small edge cases that were invisible when the idea was only in my head.&lt;/p&gt;

&lt;p&gt;That is probably the most useful part of building the MVP.&lt;/p&gt;

&lt;p&gt;It forces the messy parts to stop being vague.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>sass</category>
      <category>buildinpublic</category>
      <category>product</category>
    </item>
    <item>
      <title>The Messy Part Usually Starts After the Schedule Is Sent</title>
      <dc:creator>Miran</dc:creator>
      <pubDate>Wed, 27 May 2026 07:32:00 +0000</pubDate>
      <link>https://dev.to/miran969/the-messy-part-usually-starts-after-the-schedule-is-sent-59o1</link>
      <guid>https://dev.to/miran969/the-messy-part-usually-starts-after-the-schedule-is-sent-59o1</guid>
      <description>&lt;p&gt;I used to think scheduling problems were mostly about making the schedule.&lt;/p&gt;

&lt;p&gt;Put the right person on the right job. Pick a time. Send it out.&lt;/p&gt;

&lt;p&gt;That sounds like the hard part.&lt;/p&gt;

&lt;p&gt;But the more I looked at small teams, the more I started noticing something else: the messy part often starts after the schedule is already sent.&lt;/p&gt;

&lt;p&gt;Someone sees the message but does not reply.&lt;/p&gt;

&lt;p&gt;Someone says they cannot make it, but now someone has to remember who might be able to cover.&lt;/p&gt;

&lt;p&gt;A job is still on the calendar, but no one is completely sure whether the assigned person actually confirmed.&lt;/p&gt;

&lt;p&gt;None of this looks dramatic at first.&lt;/p&gt;

&lt;p&gt;It is just one missed reply.&lt;br&gt;
One unclear handoff.&lt;br&gt;
One small assumption.&lt;br&gt;
One message buried somewhere in a thread.&lt;/p&gt;

&lt;p&gt;But when the job time gets closer, those little gaps start to feel much bigger.&lt;/p&gt;

&lt;p&gt;I find this kind of problem interesting because it is not really about a lack of effort. Most of the time, people are already trying. They are texting, calling, checking notes, scrolling back through messages, and keeping too much in their head.&lt;/p&gt;

&lt;p&gt;The issue is that the responsibility is spread across too many places.&lt;/p&gt;

&lt;p&gt;One person knows part of the story.&lt;br&gt;
Another person saw a message.&lt;br&gt;
Someone else forgot to reply.&lt;br&gt;
The owner is trying to connect all of it in real time.&lt;/p&gt;

&lt;p&gt;That is the kind of small operational problem I want to build around.&lt;/p&gt;

&lt;p&gt;Not huge systems.&lt;br&gt;
Not another complicated tool that tries to manage everything.&lt;/p&gt;

&lt;p&gt;Just small tools that make one messy part clearer.&lt;/p&gt;

&lt;p&gt;It is a small problem, but it repeats.&lt;/p&gt;

&lt;p&gt;And I think repeated small problems are often more useful to study than big dramatic ones.&lt;/p&gt;

&lt;p&gt;They are quiet.&lt;br&gt;
They are boring.&lt;br&gt;
They are easy to ignore.&lt;/p&gt;

&lt;p&gt;But they are also where a lot of real work gets stuck.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>product</category>
      <category>saas</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
