Bops
A team of AI bots that runs your business ops: inbox, pipeline, invoices, reports. Each one has its own computer, email and phone number, and remembers everything.
DearTuft 内部经营系统:客户、订单、广告与周月复盘。
Translation pending
BusinessGitHub @xuxingyu6OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗DearTuft 的内部经营系统。用来记 Instagram 询盘、跟进、定制订单、手工广告和周/月复盘。界面是中文,导航用英文:Overview、Customers、Marketing、Orders、Weekly Review、Monthly Review、Settings。
不做 Shopify、Meta、Instagram 同步,不发邮件,不导 CSV,没有 AI,客户列表不是看板。产品规则在 SPEC.md。
没有 Supabase 时,应用使用本地 JSON(data/local-db.json,已 gitignore)和三个演示账号。这只适合本机演示,不要部署这种模式。
npm install
npm run dev
| 角色 | 邮箱 | 密码 |
|---|---|---|
| 创始人 admin | [email protected] | deartuft-admin |
| 客服 cs | [email protected] | deartuft-cs |
| 内容 content | [email protected] | deartuft-content |
npm test
npm run typecheck
npm run build
supabase/migrations/20261027140000_init.sql,或者用 CLI:supabase db push。supabase db reset 会在迁移之后跑 supabase/seed.sql。种子数据全部带 is_demo,名字以【Demo】开头。应用里更方便的做法是用创始人账号打开 Settings,点「载入 Demo」。那个按钮按 Asia/Shanghai 的今天生成日期,总览默认不把 Demo 算进指标。.env.example 为 .env.local,填入:NEXT_PUBLIC_SUPABASE_URL=https://<project>.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=<anon key>
不要把 service role key 放进这个应用。权限靠 RLS 和页面上的角色检查。
raw_user_meta_data.role 是 content 或 cs,就按这个角色建档;再写 admin 也不会再生出一位创始人,会落到客服。角色之后在 Settings 里改,最后一位创始人不能被降级。本地填了这两个变量之后,登录页不再显示演示账号,改走 Supabase Auth。
npm install,构建命令 npm run build。NEXT_PUBLIC_SUPABASE_URL 和 NEXT_PUBLIC_SUPABASE_ANON_KEY。LOCAL_SESSION_SECRET 只给本地模式的 cookie 签名,生产不需要。| admin | cs | content | |
|---|---|---|---|
| 客户、询盘、跟进 | 读写 | 读写 | 只读 |
| 订单、收款、成本、利润 | 读写 | 读写 | 看不到 |
| 广告和内容 | 读写 | 只读 | 读写 |
| 周复盘、月复盘文字 | 读写 | 读写 | 只读 |
| 汇率、月目标、角色 | 读写 | 不能打开 | 不能打开 |
客服保存订单时,汇率由数据库函数读取,不需要打开 Settings。内容角色的总览只保留询盘和广告,不拿 0 冒充订单和利润。
$1.00 = 100)。人民币存整数分。7.20 存成 7200000。usd_cents = round(cny_fen * 1_000_000 / fx_cny_per_usd_e6)。100 分 = 1 元,100 美分 = 1 美元,所以分除以汇率直接得到美分。来源字段可以空着。系统不会猜测这条询盘来自哪条广告。
用创始人账号。总览先是空的,卡片上的数字都是从库里算的。
179,约定定金 60,制作成本 400(人民币),物流 80,支付手续费 0.60,下单日是今天,状态保持已确认。保存。此时还没有收款,所以它还不是有效付费订单,未收是 $179.00。60,到账日今天。汇率快照会停在保存订单时的 7.20(除非你改过设置)。广告前利润约为 $111.73:净销售额 $179.00,制作成本换成 $55.56,物流 $11.11,手续费 $0.60。未收是 $119.00。收款是 $60.00。这三列不是同一个数。20,展示 10000,点击 200。不要在订单上填归因广告。$179.00,本期收款 $60.00,未收 $119.00,广告花费 $20.00,广告前利润约 $111.73,混合 CAC $20.00,归因 CAC 是 —。广告没有被摊进这张订单。客服账号能做第 1–4 步,不能改广告和设置。内容账号能做第 5 步,能看客户,看不到订单金额。
profiles、customers(规范化 Instagram 唯一)、customer_status_history、inquiries、follow_ups、orders、order_payments、order_cost_lines、ad_daily_stats、content_posts、weekly_reviews、monthly_reviews、app_settings。
流失原因:价格高、工期、运费、信任、没有预算、随便看看、选了别人、不回复、其他。已流失可以改回任意阶段,原因会清掉。