我一开始只是想做一辆小狗咖啡车

我一开始只是想做一辆小狗咖啡车

我最开始真没把它想得那么严肃。
当时脑子里大概只有几个东西:小狗、咖啡、骨头、等级、一个暖一点的点单页面。

尾巴咖啡最早在我心里,不太像一个系统。它更像一个带点个人趣味的小项目。移动咖啡车,有一只小狗店长,有用户来投喂,有骨头,有成就,有等级,有一点 Furry 圈的身份感。用户不要只是“顾客”,最好能像一个有名字、有物种、有档案的人。他喝过几杯,攒了多少骨头,解锁过什么成就,能不能生成一张分享卡,这些东西比“下单成功”本身更让我有兴趣。

现在回头看,这个起点其实挺危险的。因为它太容易让我沉迷在“可爱”里。

可爱是很迷人的。你给按钮换一段毛茸茸的文案,给个人页做一个暖色卡片,给等级起一套狗狗相关的名字,给成就加一点收集感,项目立刻就不像普通点单页了。它有气质,有记忆点,也有一点只有我自己懂的偏执。那段时间我很享受这种感觉:我像是在做一个小小的世界,不太像在做一个卖东西的页面。

但生意不会因为你的小世界可爱,就对你客气。


订单先把我拽回来了

第一个把我拉回现实的东西,是订单。

订单这个东西很粗鲁。它不管你的文案可不可爱,也不管你的卡片有没有质感。用户点下去之后,钱、券、库存、状态、取餐、取消、退款,全都会变成硬问题。

打烊了还能下单怎么办?余额不够怎么办?优惠券用了之后取消订单要不要返还?订单金额能不能被前端篡改?库存是不是跟着扣?店员接单之后,用户那边有没有同步?如果订单卡住,用户看到的是一只可爱小狗,还是一个不靠谱的系统?

这时候我才意识到,所谓“点单小程序”,真正难的不是让用户点下去。真正难的是点下去之后,所有事情都得对。

我一开始很容易把 C 端看得太重。用户看到什么,点哪里,页面滑起来顺不顺,动效是不是舒服,文案是不是有尾巴咖啡的气口。这些当然要做。但只要牵涉真钱,项目就从体验设计跳到了信任契约。余额、优惠券、退款、库存、订单状态,这些东西没有情绪价值,只有对错。错一次,用户不会说“这个小狗品牌还挺可爱”。他只会觉得你这玩意不行。

这个地方很丢人,也很有用。

它逼我把项目从“好玩”往“可信”推。数据库里的事务,后台的权限,订单创建的校验,取消订单时的回滚,库存扣减和商品上下架,这些原本看起来没那么有趣的部分,慢慢变成项目真正的地基。没有这些,前面的可爱只是贴纸,撕下来以后什么都没有。


位置又教育了我一次

第二次把我拉回现实的,是位置。

固定门店有一个天然优势:它在那里。你可以在页面上写地址,可以在地图上放一个点,可以默认用户知道去哪里。coffee truck 没这个资格。它今天停在这里,明天可能换地方;今天营业,明天可能打烊;用户打开页面的时候,第一句话不是“我想喝什么”,而是“车在哪”。

这个问题一出来,整个产品都变了。

首页不再只是欢迎页。它要告诉用户现在出不出摊,距离远不远,能不能下单,打烊时该去哪看下一次安排。位置页不再只是地图。它要承担一种承诺:我现在告诉你的,是这辆车公开给你的状态。后台也不再只是商品管理。店长要能更新位置,能切换营业状态,能看停靠点,能处理移动带来的各种边界。

我当时才慢慢理解,移动咖啡车不是固定门店的缩小版。它有一套自己的麻烦。

固定门店的线上化,经常是把柜台搬到手机里。coffee truck 的线上化更像是给一件会移动的东西绑一根线,让用户别在城市里找丢它。这个比菜单麻烦多了。菜单只是商品,位置才是关系的入口。用户如果找不到你,再好的菜单都没意义。


现场会打碎桌面端幻想

然后是现场。

屏幕上的东西会骗人。你在电脑上看后台,订单卡片排得很整齐,按钮也清楚,状态也能切。你会以为 B 端差不多了。直到你把它想象成店员在 Pad 上横屏使用,一边看订单,一边收钱,一边接单,一边听提示音,一边还要贴标签。那时候所有“差不多”都会露馅。

听单页后来变得越来越像一个工作台,不是因为我突然爱上后台设计,而是因为现场不允许你偷懒。新订单要醒目,取餐号要大,规格要一眼看懂,备注不能藏太深,接单和出餐不能误点,右侧 POS 不能把主区域挤裂。店员没有时间欣赏你的界面。他只需要少想一步。

POS 也是这样。在线订单和现场收银混在一起之后,订单来源、支付状态、待收款、线下补单,都会进入同一套经营秩序。你如果只是做一个后台页面,很快就会被现场打穿。现场不是网页,它有手、眼睛、纸、杯子、声音和时间压力。

热敏打印更残酷。

我之前在屏幕上调标签版式,觉得差不多能看。真正开始考虑出纸,才发现这事完全不是那么回事。字号小了不行,灰阶脏了不行,方向错了不行,留白多了不行,信息太满也不行。标签不是一个 UI 截图,它会贴在杯子上,会被店员扫一眼,会被用户拿走。它既要操作准确,又会变成品牌的一部分。

所以后来才会有 Android WebView 壳,有打印桥,有接单后自动打印,有真实尺寸的标签预览,有二维码、小票插图、品牌周边感这些东西。听起来像技术扩展,其实是现场倒逼。屏幕说“我很好看”没用,纸会审判它。


用户关系也不是自动发生的

再往后,我又被用户关系教育了一次。

我原本以为,小程序做得够顺,用户自然会回来。后来想想,这也挺天真。用户不会每天没事打开你的点单页。尤其是一个 coffee truck,用户可能只是某天路过喝了一杯,下一次想起来已经是两周后。你要让他记得你,就不能只等他主动打开页面。

这就是 QQ botPWA、分享卡、抽奖、商城这些东西出现的背景。

PWA 是降低入口摩擦。用户不需要一上来装原生 App,能打开、能保存、能再次进入就够了。QQ bot 更直接:用户本来就在群里,那就让他在群里查状态、查位置、签到、看排行榜、抽奖、看卡券、进商城。你别把所有行为都赶回小程序,用户在哪里,就从哪里接住他。

这件事让我对“社群”这个词的看法变了。社群不是发公告的地方,也不是每天喊大家来买咖啡的地方。它更像一条低成本的回忆通道。有人在群里抽奖,别人会看见;有人查位置,别人也知道今天车可能出摊;有人晒分享卡,品牌关系就被轻轻拉了一下。用户和品牌之间的联系,经常不是靠一次大活动建立的,而是靠这些很小的提醒。

骨头、等级、成就、兑换商城也是同一件事。它们不是为了“游戏化”这个词。说实话,这个词现在被用得太滥了。对尾巴咖啡来说,它们更像消费后的回声。

用户喝完一杯,不应该只剩一笔订单。他应该留下点什么:几根骨头,一个等级进度,一个成就,一张下次想用的券,一个可以兑换的小东西。哪怕这些东西很轻,它也让“我来过”变得可见。

但这些东西做多了,又会把你推向另一个阶段:经营。


后来我开始关心这到底是不是一门生意

一开始我关心的是用户看见什么。后来我关心的是用户能不能顺利下单。再后来我开始关心,店长能不能知道自己到底在做什么生意。

哪款商品卖得动?哪个时段高峰?线上订单和现场订单怎么分?游客和会员差别在哪?哪个停靠点有线索?用户热力图是不是真的能看出一点东西?抽奖记录开给了谁?优惠券有没有讲清楚?库存和成本能不能解释?

这些问题听起来没有前台页面性感,但它们决定这辆车是不是只能凭感觉出摊。

“我觉得今天这里人多”当然有价值。线下生意不能没有直觉。但只靠直觉,时间一长就会变成玄学。忙的时候觉得今天不错,闲的时候觉得位置不行,某个新品卖出去几杯就觉得应该加量。经营复盘存在的意义,就是把这种体感压回具体数字。

哪天,几点,哪个商品,哪类用户,哪个地点,哪种渠道。数字不一定给你答案,但它会阻止你太快骗自己。

这也是我后来越来越重视生产环境和部署可靠性的原因。一个玩具项目可以坏几天,一个真实运营系统不行。登录挂了,用户进不来;订单挂了,店员接不到;地图挂了,用户找不到车;数据库状态错了,会员奖励和库存都会乱。上线以后,项目就不再只属于代码仓库。它属于当天要出摊的人,属于准备点单的人,属于已经付过钱的人。


到这里,它已经不是玩具了

技术栈在这里其实没那么重要。Next.js、Supabase、Realtime、R2、自托管服务器、Nginx、systemd,这些都是底座。它们当然要稳,也要能查、能修、能部署、能回滚。但它们不是这篇文章的主角。

真正的主角是:我一开始想做一个有小狗气口的点单小程序,后来一步步发现,这个东西如果真的要用,就必须承接交易、现场、关系、品牌和经营。

这条路挺别扭的。因为每往前走一步,最初那个“可爱的小项目”都会被现实削掉一点幻想。

你想写一句轻松的文案,结果发现要先处理错误态。你想做一个漂亮的会员卡,结果发现等级规则和历史奖励要对齐。你想做一个贴纸感标签,结果发现热敏打印只认黑白和尺寸。你想做一个抽奖,结果发现后台要能查是谁抽中了。你想让搜索结果显得有品牌调性,结果发现陌生人最需要的是“南京移动咖啡车,在哪,怎么点”。

这不是坏事。

它让尾巴咖啡从一个“我觉得挺可爱”的东西,慢慢变成一个我不敢随便糊弄的东西。它还很小,也有很多地方会继续改。可我现在已经不太敢把它当玩具了。一个玩具不需要解释库存,不需要处理退款,不需要出纸,不需要在群里回应用户,不需要在生产环境里活着。

尾巴咖啡需要。

这大概就是它开始像一个小品牌的时刻。

我一开始只是想做一辆小狗咖啡车

https://blog.dominoh.com/3427790584.html

作者

多米诺

发布于

2026-04-27

更新于

2026-04-27

许可协议

评论