{"id":6392,"date":"2026-07-24T09:00:00","date_gmt":"2026-07-24T07:00:00","guid":{"rendered":"https:\/\/storiesonboard.com\/blog\/calendar-timed-food-delivery-app-backlog"},"modified":"2026-07-27T10:17:50","modified_gmt":"2026-07-27T08:17:50","slug":"calendar-timed-food-delivery-app-backlog","status":"publish","type":"post","link":"https:\/\/storiesonboard.com\/blog\/calendar-timed-food-delivery-app-backlog","title":{"rendered":"Designing a calendar-timed food delivery app: from a raw idea to a 111-story backlog"},"content":{"rendered":"<p>I wanted to see how far I could get from a completely raw product idea to a real, living backlog in StoriesOnBoard by running it through the story map skills. Not as a demo: I wanted to find out where the process pushes back, and where it fills in things I wouldn&#39;t have thought of myself.<\/p>\n<p>The section breakdown below is deliberately generic \u2014 I&#39;d mark the same points in any other use case.<\/p>\n<section class=\"sob-origin-article-link\">\n<h2>Where this test came from<\/h2>\n<p>This experiment follows the skill-family setup described in <a href=\"https:\/\/storiesonboard.com\/blog\/five-skills-one-backlog\">Five Skills, One Backlog<\/a>. That earlier article explains why the workflow is split into discovery, story-map creation, gap analysis, refinement, and navigation. This article is the practical follow-up: what happened when I used those skills on a raw food delivery app idea.<\/p>\n<\/section>\n<h2>1. The use case: what I was actually building<\/h2>\n<p>The idea was a food delivery app for people whose calendars are booked back-to-back.<\/p>\n<p>The insight behind it: for someone in meetings all day, the problem isn&#39;t that delivery is slow. It&#39;s that it&#39;s unpredictable. If you only have a 25-minute gap between two calls, food arriving &quot;sometime in the next 40 minutes&quot; is useless \u2014 it turns up mid-meeting and goes cold on your desk. These people know in advance exactly when they&#39;re free, which is unusual and exploitable. And there&#39;s a second, quieter job to be done: working out when you have to order so that the food lands in the gap rather than outside it.<\/p>\n<p>That&#39;s all I brought to the table:<\/p>\n<p>Food delivery app for a customer base with a lot of meetings, who know in advance when they&#39;re free. They can&#39;t tolerate imprecise delivery because they&#39;re only available in a specific window \u2014 so it matters that they know when to place the order for it to arrive exactly when it suits them.<\/p>\n<p>No personas, no scope, no business model. In theory, exactly the kind of input a generator would happily turn into a hundred forgettable user stories.<\/p>\n<h2>2. Discovery: the skill asks first<\/h2>\n<p>It didn&#39;t generate. It said the problem and the target user were clear, then flagged that three decisions would produce materially different structures, so we&#39;d settle those before building anything:<\/p>\n<p>What&#39;s the delivery model? Own courier fleet with partner restaurants? Aggregating existing services (Wolt, Foodora)? Or restaurants delivering themselves? How does the app know when the user is free? Calendar integration? A manually entered window? Both? Who places the order? An individual professional, a company team, or both?<\/p>\n<p>Those three questions were worth more than I expected. None of them is a matter of taste \u2014 each one changes the backbone. As an aggregator there&#39;s no courier- or kitchen-side scope at all; with an own fleet you need four different surfaces before a single meal moves.<\/p>\n<p>My answers: own courier fleet + partner restaurants, calendar integration (Google\/Outlook), individual professional (B2C).<\/p>\n<p>Transferable lesson: good discovery doesn&#39;t ask &quot;what else would you like&quot;. It asks which decision changes the structure. Two or three questions, each a fork in the road.<\/p>\n<h2>3. The uncomfortable question: how is this different from what already exists?<\/h2>\n<p>This is where it got interesting. With the structure sketched, it didn&#39;t start building \u2014 it logged an open risk:<\/p>\n<p>Wolt and Foodora already support scheduled orders. The switch test is unanswered: why exactly would someone move?<\/p>\n<p>That was uncomfortable because it was true. &quot;Tell us when you want it&quot; is not a gap in the market. When I asked about the unique value, it put three different bets in front of me \u2014 not three phrasings of the same one:<\/p>\n<table>\n<thead>\n<tr>\n<th>Positioning<\/th>\n<th>The unique value<\/th>\n<th>The riskiest assumption<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>The guarantee<\/td>\n<td>We promise a window and refuse your order if we can&#39;t hit it<\/td>\n<td>Will people accept &quot;no&quot; often enough for the promise to stay credible<\/td>\n<\/tr>\n<tr>\n<td>The backwards clock<\/td>\n<td>We tell you when to order so it lands in your gap<\/td>\n<td>Is the deadline the real pain, rather than the accuracy<\/td>\n<\/tr>\n<tr>\n<td>Calendar-native<\/td>\n<td>Your calendar plans lunch, not you<\/td>\n<td>Will people grant calendar access to a food app<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Its argument was that only the first survives the switch test: bets 2 and 3 make the incumbent experience nicer but give nobody a reason to leave. What you can&#39;t get anywhere is somebody being accountable for the window \u2014 and the reason nobody offers it is precisely that accountability is expensive.<\/p>\n<p>I picked 1 and 3. Combined:<\/p>\n<p>Your calendar picks the moment, and we guarantee the food lands in it \u2014 or we don&#39;t take the order.<\/p>\n<p>It immediately named the cost too: this carries two risky assumptions into the MVP at once, so the MVP can&#39;t be trimmed down to a thin test of a single thing.<\/p>\n<p>Transferable lesson: if a skill never asks what makes this better than the strongest alternative, you&#39;ll end up with a feature list rather than a product. This was the most valuable stretch of the whole process.<\/p>\n<h2>4. Positioning has to move the scope<\/h2>\n<p>It didn&#39;t stop at a slogan. The choice re-sliced the MVP:<\/p>\n<p>Promoted into the MVP: suggesting the best eating slot of the day; a minimum meal-break rule (without it the app offers five-minute gaps and looks broken); automatic compensation for a missed window; plus two new stories \u2014 seeing before I order what happens if the window is missed, and having the app place a lunch hold in my calendar so the slot doesn&#39;t get booked over.<\/p>\n<p>Dropped out of the MVP: live courier tracking. I liked the reasoning: if the window is guaranteed, watching a map is anxiety theatre.<\/p>\n<p>Transferable lesson: positioning is only worth something if you can see it on the board. If the MVP would look the same under any of the three bets, you haven&#39;t decided anything.<\/p>\n<h2>5. Backlog generation \u2014 with an approval checkpoint<\/h2>\n<p>story-map-creator then laid out the full proposal in chat, for approval \u2014 goals, steps and stories with releases and personas \u2014 without writing a single card. That&#39;s the right order: unpicking 100+ cards afterwards costs far more than reading a list.<\/p>\n<p>Only after I approved it did the real map get built in StoriesOnBoard: 9 goals, 24 steps, 99 stories, 4 personas, 3 releases.<\/p>\n<h2>6. What it added on its own \u2014 the &quot;didn&#39;t think of that&quot; category<\/h2>\n<p>This was the other surprise. My idea mentioned none of the following, but they landed anyway, because the skill carries a baseline checklist of what every product needs:<\/p>\n<p>Foundations: sign-up and login, password reset, profile editing, accepting the privacy policy, GDPR data export and account deletion, managing saved payment methods, notification preferences, an audit log, in-app support.<\/p>\n<p>Error states I&#39;d have skipped: an empty state for when no suitable slot exists; retry after a failed payment; narrowing calendar access to free\/busy only, so meeting contents stay private.<\/p>\n<p>The entire supply side: left to myself I&#39;d almost certainly have described only the consumer app. Instead the restaurant got its own goal (when to start cooking, accept\/reject, kitchen capacity), as did the courier (a day known in advance, marking handover, reporting a delay with a reason) and the dispatcher (capacity reserved ahead, spotting at-risk deliveries).<\/p>\n<p>My favourite addition: the miss-cause taxonomy. When I asked about analytics, it recommended making the analytics product its own story map, but keeping one thin slice in the MVP \u2014 every missed window recorded with a cause (kitchen late \/ no courier \/ travel \/ customer unavailable). The reasoning: without it you&#39;ll know your promise-kept rate is 87% and have no idea why, and it&#39;s nearly impossible to backfill.<\/p>\n<p>Transferable lesson: this is the section worth walking through in every use case. The question isn&#39;t whether the skill guessed the essence of your product \u2014 it&#39;s whether it supplied the 30\u201340% everyone forgets in the excitement.<\/p>\n<h2>7. Gap analysis: what was still missing<\/h2>\n<p>On the finished board I ran story-map-gap-finder. It didn&#39;t work from memory \u2014 it read the live map back, and found twelve gaps plus three structural problems.<\/p>\n<p>Missing journey phases:<\/p>\n<p>Delivery coverage. Nothing on the board decided whether an address was servable. With an own fleet in a single city that&#39;s the first gate \u2014 without it, a user outside the zone hits a dead end somewhere deep in the flow. Pricing. Payment existed; price didn&#39;t. Even though the guarantee is the one thing here that could plausibly carry a premium.<\/p>\n<p>Missing edge cases:<\/p>\n<p>The customer isn&#39;t there at handover. &quot;Customer unavailable&quot; appeared in the miss-cause list, but no story produced that outcome. And it&#39;s the likeliest real-world failure \u2014 a meeting ran long, which is precisely my target user. Capacity runs out during checkout. Refusing orders is the core mechanic, yet the moment it bites a real user mid-payment was uncovered. Refund on cancellation. I could take money and cancel, but never give it back. Expiring calendar token. In a calendar-native product, a stale OAuth token degrades the core feature invisibly. The restaurant accepted but can&#39;t cook it. Rejection before the promise existed; failure after it didn&#39;t. Plus: a courier can&#39;t hand back a job after a breakdown, restaurants have no day view of incoming orders, saved addresses can&#39;t be edited or deleted.<\/p>\n<p>Structural findings:<\/p>\n<p>One step had no MVP story at all \u2014 it slipped out during the re-slice, and an earlier check had wrongly passed it. The gap analysis caught it. Release 3 was down to two stories. Two stories isn&#39;t a release. Two admin stories were sitting under the wrong step (platform administration filed under the dispatcher&#39;s workflow).<\/p>\n<p>I accepted all of them. Final state: 9 goals, 26 steps, 111 stories \u2014 62 in the MVP, 49 in Release 2.<\/p>\n<h2>8. What isn&#39;t a gap, but a decision<\/h2>\n<p>It listed separately the things that look missing but may be deliberate scope cuts \u2014 and didn&#39;t &quot;fix&quot; them on its own: a manual time window without calendar access (right now, if you decline permission there&#39;s no path into the product at all), ops roles and permissions, acquisition and referral, tipping, multiple cities, company team ordering.<\/p>\n<p>That list matters more than it first appears. It&#39;s the place where the generator doesn&#39;t overwrite your intent.<\/p>\n<h2>9. What I&#39;m taking away<\/h2>\n<p>Structure-deciding questions first, cards later. Three good questions saved a complete rewrite. The switch test isn&#39;t optional. With no answer to why someone would leave the strongest alternative, you&#39;re building a feature list. Positioning must show up in the scope. If the decision doesn&#39;t move stories between MVP and Release 2, it wasn&#39;t a decision. Approval checkpoint before writing. Fixing things in chat is cheap; on the board it&#39;s expensive. Run the gap analysis on the built board, not the plan. What&#39;s missing from what got built differs from what&#39;s missing from what you imagined. Size is information too. A 62-story MVP isn&#39;t sloppy slicing \u2014 it&#39;s a consequence of the model: four sides plus two kinds of onboarding before one meal moves. If you want it smaller, change the model, not the backlog.<\/p>\n<p>These nine sections should map onto any other use case. The content will differ; the questions won&#39;t.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A calendar-timed food delivery app becomes a 111-story StoriesOnBoard backlog through discovery, positioning, and gap analysis.<\/p>\n","protected":false},"author":13,"featured_media":6391,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-6392","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-story-mapping","resize-featured-image"],"_links":{"self":[{"href":"https:\/\/storiesonboard.com\/blog\/wp-json\/wp\/v2\/posts\/6392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/storiesonboard.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/storiesonboard.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/storiesonboard.com\/blog\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/storiesonboard.com\/blog\/wp-json\/wp\/v2\/comments?post=6392"}],"version-history":[{"count":1,"href":"https:\/\/storiesonboard.com\/blog\/wp-json\/wp\/v2\/posts\/6392\/revisions"}],"predecessor-version":[{"id":6393,"href":"https:\/\/storiesonboard.com\/blog\/wp-json\/wp\/v2\/posts\/6392\/revisions\/6393"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/storiesonboard.com\/blog\/wp-json\/wp\/v2\/media\/6391"}],"wp:attachment":[{"href":"https:\/\/storiesonboard.com\/blog\/wp-json\/wp\/v2\/media?parent=6392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/storiesonboard.com\/blog\/wp-json\/wp\/v2\/categories?post=6392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/storiesonboard.com\/blog\/wp-json\/wp\/v2\/tags?post=6392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}