Ramen Joe 起步于里斯本的一家店。今天已经是五家门店、一个上架 App Store 的 iOS 应用、一个上架 Google Play 的 Android 应用、一个整合 Apple Wallet 和 Google Wallet 的会员计划,以及一个支撑集团运营的后台系统。全部跑在同一个平台上。
这篇文章讲清楚这个平台解决了什么,为什么选择自建而不是采购现成 SaaS,以及大多数餐饮集团在做同样尝试时是从哪里翻车的。
要点速览
任何一个开出两家以上门店的餐饮集团,通常都会撞上三个技术问题,而这三个问题在最开始几乎没人认真估算。预订被门店割裂。会员计划无法跟着顾客跨店走。运营数据散落在本地文件和 WhatsApp 群里。
Ramen Joe 把运营整合进一个系统。共享预订、单一顾客档案、会员体系、数字菜单、员工管理和集中式数据分析。落到实处就是:一位顾客在里斯本盖了章,到波尔图看到的是同一个积分余额;团队在同一个后台管理五家门店,也能随时增加新的门店。
这个选择的代价不低。但不做的代价会在后面出现,只是换了副面孔——客户流失、员工重复劳动、扩张决策靠拍脑袋。
业务问题
当一家餐厅长成一个集团,原本够用的软件就开始崩。不是因为它烂,而是因为它当初是为另一种场景设计的,而那种场景已经不是你的现实。
典型症状是这样:每家门店最后都用上自己那套预订模块,往往接的是 Google 或者某个特定 SaaS 工具。会员数据分散在每家店各自的数据库里,或者更糟,一本纸质本子。当你想知道集团层面到底有多少回头客时,没人答得上来。只有估算。
关键在这里。单店时,CRM 就是店长本人。他认得熟客,知道谁喜欢里面那张桌,知道谁周日会带全家人来。到了五家店,这种分散在人脑里的记忆就失效了。顾客感受得到。
为什么这件事重要
餐饮业的会员体系不是运营层面的小细节,它是商业模式的脊梁。获取一个新客的成本,是把老客拉回来的好几倍。这条规律几乎适用于所有行业,餐饮业也不例外。
如果你的会员计划无法跟着顾客跨店,那你等于把每一次到店都当成第一次。事实并非如此。顾客记得,只是系统不记得。
第二个角度是运营。一个开五家店的集团,产生的数据量足够支撑有依据的决策。哪些时段最先坐满。哪些工作日需要做活动。哪家店的失约率最高。没有统一平台,这些数据其实都在,只是没人读得出来。
这个平台做了什么
Ramen Joe 的架构建立在三块相互通信的模块之上。一个基于 Express 和关系型数据库的后端,一个面向终端顾客的 Next.js 公共前端,以及一套原生 App(iOS 用 SwiftUI,Android 原生),把网站体验搬到手机场景。
选择做原生 App 而不是 PWA,需要解释一下。这不是技术上的虚荣,是产品决策,理由具体,有三个。
- Apple Wallet 和 Google Wallet 只在原生 App 里能干净地接入——会员卡直接进手机钱包,积分变动时自动更新。
- iOS 的推送通知有些限制,Web 端绕不过去,绕了也会伤害体验。
- 门店员工的扫码要求相机自动对焦快、延迟接近零。这方面 Web 还是差一截。
在预订这块,系统按门店拆分排班日历。顾客在里斯本预订,只锁里斯本的桌位。但顾客档案、消费记录、座位偏好——这些都是全局的。
数字菜单和不依赖开发的扩张
平台也把五家店的数字菜单统一起来了。团队在同一个后台里管理商品、门店信息和各家门店的配置,网站和 App 上的体验保持一致,不需要按渠道重复维护。
多门店管理的设计目标是:集团要开新店时,不必再去找技术团队。团队自己就能录入新门店、设营业时间、联系方式、菜单、桌位、预订规则以及其他运营设置。
配置一完成,新门店就会通过同一份数据源出现在网站和 App 上。不需要为了多一家门店去发布一个新版本的网站或 App。这压缩了成本,也缩短了从决定扩张到新门店真正上线的时间。
跨店会员:一个决定改变全局
餐饮集团里最常见的摩擦点就在这里。每家店都想有自己的会员计划。每个店长都想看到自己维护的忠实顾客。每次营销活动往往被绑死在一家门店里。
Ramen Joe 走的是反方向。一个计划,一份积分,一位顾客。这在财务上有些不简单的问题——里斯本盖的章、波尔图兑换掉了,谁来"付账"?——但这些用内部结算规则就能处理,不必把系统拆碎。
顾客不应该被迫思考这些。事实上他们也没在想。App 装一次,把卡加到 Wallet 里,走到集团任何一家店体验都一样。这就是会员计划意义上的 product-market fit。
员工的角色
数字会员系统只有在员工配合的情况下才跑得起来。如果盖章流程比过去在纸卡上盖一戳还慢,员工会想办法绕过——不是恶意,是高峰时段撑不住。
Ramen Joe 的扫码器就是围绕这个约束设计的。登录后的员工打开 App,把相机对准顾客的二维码,两秒内积分就到账。没有菜单,没有中间确认,没有手动输入。
发放积分的权限和访问后台的权限是分开的。服务员负责盖章。店长看报表。集团管理员改规则。这种分层在企业级 SaaS 里稀松平常,但在餐饮软件里经常被忽略——然后大家就纳闷为什么会出现内部积分舞弊。
预订:少一点自动化,多一点掌控
任何一套现代预订系统都存在同一种诱惑:把一切自动化。自动确认、自动提醒、自动应答变更。大多数场景下这套做法工作良好。
但在讲究品质的餐饮里,效果就没那么好。周六晚上十二人的一张预订,不应该在没人看过大堂情况的前提下就自动确认。指定桌位的请求应该经过一个懂这家店的人。临时的例外情况需要人来判断。
Ramen Joe 的平台按门店支持两种模式并存。常规预订走自动。人数多或者带特殊要求的预订进入审批队列。同时还有一条基于 Telnyx 的短信通道,会在预订前一小时发送提醒,这一项就把失约率压下来了,也没有变成骚扰。
短信设计得很短。姓名、时间、门店。一个取消链接。别的都没有。商务套餐一开始按每年 1500 条短信估算,是根据预期预订量算出来的。这不是技术上限:运营量增长,配额可以跟着调。
两个 App:iOS 和 Android 同时启动
iOS 和 Android 版本是同时启动的。Android 上架晚一些,是因为 Google Play 的审核周期更长,并不是产品上有意分阶段发布,也不是偏袒某个平台。
两个应用是并行开发的,价值主张一致:预订、会员,以及在两个平台之间保持一致的体验。它们在商店里出现的时间差,仅仅来自各家应用市场审核节奏的不同。
代价很明显:两套原生代码,而不是像 React Native 或 Flutter 这类跨平台方案的一套代码。这是一个清醒的权衡。回报是 App 表现符合平台自身的调性,而不是所有平台的最小公约数。
这类项目通常在哪里翻车
大多数试图搭建同类平台的餐饮集团,会犯同样的三个错。值得点名。
- 从 App 开始动手。没有成熟的后端,也没有清晰的业务规则,App 只会变成一层好看的壳,把运营上的混乱搬到手机屏幕上重现一遍。
- 依赖 WordPress 插件做预订和会员。单店能撑住,五家店就散架。
- 找按项目结算的外包团队,交付完就消失。软件不是在上线那天结束,而是在上线那天开始。
这三点的解药是同一个。把软件当成基础设施,不是一次营销活动。先在地基上花钱——后端、数据库、认证、权限、持续部署——然后才轮到看得见的表面。
值得的一些工程实践
有些决策看似小事,但在生产环境里带来的效果远超预期。
第一:git 作为唯一事实来源。每一次改动都走 commit,每一次上线都通过 GitHub Actions 自动完成。这种做法直接消灭了"在我电脑上是好的"这一整类 bug,也让生产环境出问题时能在几分钟内回滚。GitHub 官方关于持续部署的文档把原则讲得很到位。
第二:认真做国际化。网站支持葡语和英语,所有文案集中在翻译文件里。这对里斯本的一家餐厅听起来像过度设计,直到你意识到旅游区里有 30% 的顾客不说葡语。而且,将来开一家新城市的店时,系统已经支持多语言就轻松得多。
第三:把 sandbox 和生产严格区分,规则明确。Ramen Joe 有一套 sandbox 环境,镜像生产,但只用测试数据。任何改动都先在那里跑一遍。这样做,测试新功能时把真实预订搞坏的概率就小得多。
这种模式适用于哪些场景
Ramen Joe 的架构和拉面没有关系。它适用于任何多门店、且有回头客基础的零售或服务业。餐饮集团、连锁咖啡、连锁理发、多个院区的诊所、多间馆的健身房,都能套用。
共同点在于:顾客是一个,运营却是分布式的。如果软件没能反映这一点,你就在用运营摩擦,去偿还本来该以会员留存赚回来的那笔账。
关键要点
- 多门店的餐饮集团必须要有统一平台——分散的预订所带来的成本,远超整合它们的软件成本。
- 真正意义上的多门店平台,让团队自己就能录入新门店、菜单和运营规则,不必要求技术团队改网站或 App。
- 跨店会员不是可选项,如果你在乎真正的顾客留存。顾客不会在意钱花在哪家店。
- 当 Wallet、推送通知和快速相机是体验核心时,做原生 App 才说得过去。
- 员工和顾客一样是系统的用户。流程比原来还慢,系统就会被高峰期的压力压垮而遭到绕过。
- git 作为唯一事实来源、sandbox 与生产严格分离、第一天就上 i18n。这些都是地基决策,能省下后期昂贵的重构。
- 最贵的错误是后端还没成熟就先做 App。
处于这个阶段的集团,下一步不是再堆功能,而是去做度量。哪些盖章带来了第二次到店。哪家店留客率更好。哪些活动真正拨动了指针。有了统一平台,这种分析才有可能。剩下的,就是愿意去看。