TinyPilot:第 37 個月
原文由 Michael Lynch 于 發布,訂閱此部落格
一句話總結
TinyPilot 該如何增加經常性收入?
第一次來嗎?
嗨,我是 Michael。我是一名軟體開發者,也是 TinyPilot 的創辦人,這是一家獨立的電腦硬體公司。我在 2020 年創立這家公司,現在每月營收約 6 萬至 8 萬美元,另外聘雇了七位夥伴。
每個月我都會發表一篇像這樣的回顧,分享公司營運與我個人工作近況。
本月亮點
- 我仔細思考了為 TinyPilot Pro 加入訂閱制需要做些什麼。
- 我進一步探索了用 Nix 來管理開發環境。
目標成績單
每個月月初,我都會訂下當月想完成的目標。以下是這個月的達成情況:
達成 9.8 萬美元銷售營收
- 結果:營收下滑 10%,降至 8.4 萬美元
- 評分:C
儘管我們獲得了幾個新的好評,營收還是下滑了:
我們損失了一部分銷售額,是因為 Amazon 透過其繁瑣如卡夫卡小說般的帳號健康政策調降了我們的商品排名。現在我們已重新獲得他們的信任,銷售也再次回升。
我也聽其他創辦人說,每年這個時候通常會遇到夏季銷售低潮。而 TinyPilot 在 2022 年 7 月也確實經歷了 11% 的營收下滑。
按計畫將 TinyPilot 轉移至委外製造商
- 結果:時程已延後三週
- 評分:D
製造時程延後,是因為委外製造商的下游供應商需要更多時間來生產電源轉接器和 USB 線材等零件。在轉換期間,我們的庫存還能撐大約三週才會見底,但情況已經有點吃緊。
這個目標本身設計得不太好,因為期限不是我訂的,而且我能掌控的程度有限。我真正能做的,只有確保 TinyPilot 這端不會卡關,並督促委外製造商遵守時程。
花在電子郵件上的時間少於 40%
- 結果:大部分時間都花在電子郵件上
- 評分:F
結果我花在電子郵件上的時間遠比預期多。七月我休假出遊,卻沒考慮到休假期間會累積多少待回的郵件。
最終,這個月我大部分時間都在回信和審核團隊夥伴的工作成果。
TinyPilot 數據
| 指標 | 2023 年 6 月 | 2023 年 7 月 | 變化 |
|---|---|---|---|
| 不重複訪客 | 8,300 | 7,800 | -500 (-6%) |
| 銷售營收 | $88,378.45 | $79,635.02 | -$8,743.43 (-10%) |
| 企業訂閱 | $290.70 | $290.70 | 0 |
| 權利金 | $4,399.66 | $3,777.52 | -$622.14 (-14%) |
| 總營收 | $93,068.81 | $83,703.24 | -$9,365.57 (-10%) |
| 獲利 | $30,907.55 | $26,359.62 | -$4,547.93 (-15%) |
雖然營收下滑,獲利仍維持在 2 萬至 3 萬美元之間。這個數字有點虛高,因為我的支出被刻意壓低了。隨著轉向委外製造,我正逐步收掉自己的生產線,所以已經停止採購新材料。
儘管有這麼多新評測上線,網站訪客卻不增反減,讓我有點意外。看起來 TinyPilot 在自架實驗室(homelab)評測這個行銷管道上,可能已經暫時飽和了,所以我應該把重心放在其他類型的銷售與行銷上。
TinyPilot 該如何增加經常性收入?
每當 TinyPilot 銷售下滑,我就會開始多想經常性收入這件事。如果能有一份穩定的收入,不用一直靠開發新客戶,那該有多好。
我很擔心總有一天,所有想買 TinyPilot 的人都已經買了。到那時我該怎麼辦?
我一開始的規劃就是讓 TinyPilot 擁有經常性收入。客戶一次性購買硬體,之後每年續訂軟體授權,來支持後續的軟體開發與技術支援。
問題是,我從來沒有真正建立起向客戶收取經常性收入的機制。三年過去了,除了少數企業客戶外,我們幾乎沒有任何經常性收入。
在這篇回顧裡,我想好好思考 TinyPilot 增加經常性收入的可能路徑。
TinyPilot Pro 目前的授權運作方式
我在 2020 年推出最初的 DIY 版 TinyPilot 套件後幾週,就開始著手開發 TinyPilot 軟體的付費進階版。
我為 TinyPilot Pro 最早開發的功能之一就是授權驗證。既然要販售付費版軟體,就得有辦法檢查使用者的授權是否有效。
當我開始設計授權驗證系統時,我意識到以我身為創辦人還要兼顧其他所有事務的情況下,光是這個模組就要花上好幾個月。如果授權管理要花三個月,我還得再花兩個月去實作其他進階功能,客戶才有足夠的誘因購買 TinyPilot Pro。
公司才成立幾個月,我不想因此讓動能大幅放緩,讓使用者等上五個月才有下一個版本。
有一篇 Basecamp 的部落格文章我現在找不到了,裡面提到他們在還沒寫好收費系統前就開始販售 SaaS 產品。(編按:Nathan Coleman 找到了,文章出自 Basecamp 的書《Getting Real》中的這一篇。)他們的邏輯是,軟體的帳單是在每個服務月結束時才到期,所以在第一筆銷售之後,他們還有一個月的時間去想辦法收款。
我為 TinyPilot 採用了類似的策略。我決定採用榮譽制來執行授權,心想自己還有一年的時間可以實作真正的授權管理解決方案。
如今三年過去了,我在 TinyPilot Pro 的授權強制執行上仍然毫無進展。
在最糟的時機才執行授權驗證
我們向客戶宣傳 TinyPilot 裝置享有 12 個月的免費更新。但我們沒說出口的祕密是,一旦你在裝置上安裝了 TinyPilot Pro,就可以透過裝置的網頁介面永遠免費更新軟體。

TinyPilot 的網頁應用程式讓任何裝置都能取得最新版的 TinyPilot Pro
TinyPilot Pro 的軟體並不會追蹤它是否綁定了有效的授權。有些在 2020 年 8 月購買的使用者,現在已經進入一年期授權的第三年了。
絕大多數客戶根本沒意識到自己的授權已經過期。他們很自然地認為,既然 TinyPilot 還持續推送更新到裝置上,授權應該就還是有效的。
客戶偶爾還是會發現授權過期了,但總是在特別不方便的時機。
TinyPilot 使用 microSD 卡作為儲存媒體。microSD 特別容易發生檔案系統損毀。當 microSD 上的檔案系統壞掉時,唯一的解決辦法就是用 TinyPilot Pro 的映像檔重新燒錄 microSD。
要下載 TinyPilot Pro 映像檔,客戶需要輸入訂單資訊。在提供映像檔之前,我們會檢查客戶是否仍持有有效授權。

從客戶的角度來看,這是得知授權過期最糟的方式。他們的檔案系統已經損毀,TinyPilot 因此中斷了他們的工作。為了解決問題,他們得親自走到裝置前,取出 microSD 並重新燒錄。結果這時候我們還要跟他們多收錢?
如果客戶不想購買新的映像檔,只要聯絡客服,我們還是會提供舊版映像檔的存取權限。但他們仍得等上最多一個工作天才能收到我們的回覆,如果這段時間工作被卡住,體驗就很差。
這個系統對我們來說也不理想,因為索取舊版 TinyPilot Pro 的請求會消耗客服資源。而且一旦客戶拿到新的映像檔,他們又會回到「永遠免費更新」的模式,因為又可以從裝置的網頁介面持續更新軟體。
怎樣的經常性訂閱才值得投入心力?
任何形式的授權強制執行都很花成本。最起碼,我們得在 TinyPilot 的網頁介面中加入讓客戶輸入授權資訊的功能,然後還需要在網路上有一台伺服器,能根據授權來判斷使用者是否有資格取得更新。
這之所以昂貴,是因為需要數週的開發工作,而且當使用者難免寫信來說他們刪掉了含有訂單資訊的 TinyPilot 郵件、因而無法取得更新時,客服負擔也會增加。
如果我費了這麼大功夫,卻發現對續訂率毫無影響,那該怎麼辦?
要讓授權續訂值得投入,每年至少要帶來 3 萬美元的額外獲利。我估計授權的金流處理成本約為 3%,因此每筆授權續訂可為 TinyPilot 淨賺約 77 美元。
要達到每年從授權額外獲利 3 萬美元的目標,每年至少需要 390 位客戶續訂(390 x 77 美元 = 3 萬美元)。
自 2020 年推出以來,TinyPilot 總共已售出約 5,000 台裝置。目前每年約售出 2,700 台新裝置。要達到 390 位付費訂戶,意味著只需說服現有使用者中的 7.8% 付費以持續取得更新,這似乎是可行的。
該如何測試客戶續訂授權的意願?
好,我得說服 7.8% 的現有客戶購買續訂授權,但要如何在不投入完整授權管理系統的情況下,確認 7.8% 是否真的能達成?
強制恢復原廠設定
今年稍早,我們必須將 TinyPilot 的底層作業系統從 Debian Buster 切換到 Debian Bullseye。Raspberry Pi OS 並沒有支援大版本升級的官方方式,因此我們不得不要求每位使用者手動重新燒錄 microSD來完成遷移。
我很不喜歡把這個成本轉嫁給使用者,但我們找不到其他辦法。一個正面的副作用是,它終結了「永遠免費」的更新列車。如果使用者的授權已過期,就必須付費購買新的 12 個月授權才能繼續接收更新。
我們在 4 月 27 日推出了這項變更,因此我比較了變更前三個月與後三個月的授權續訂情況:
| 已售授權數 | 授權營收 | |
|---|---|---|
| 1 月 26 日至 4 月 26 日 | 33 | $2,400 |
| 4 月 27 日至 7 月 27 日 | 55 | $4,469 |
| 變化 | +22 (67%) | $2,070 (+86%) |
一方面,這些變化令人鼓舞,因為強制付費升級帶來了 67% 的續訂成長。另一方面,這也令人擔憂,因為三個月內只有 55 位使用者續訂。我估計約有 2,500 台裝置的授權已過期,也就是說只有 2.2% 的人付費更新。
有幾個因素可能讓續訂率比實際情況偏低:
- 我們近期的大量工作都集中在讓更新體驗更快、更不容易出錯。這很有用,但沒有人會為了讓未來的更新更順暢而特地去更新。
- 透過恢復原廠設定來升級的阻力很大。有些使用者可能就是不想花 20 到 30 分鐘重置裝置,因而放棄更新。
手動發送到期通知
這個月我想到一個點子,試著在客戶授權到期時寄送電子郵件通知。這件事當然可以自動化,但在投入太多自動化之前,我先手動寄了幾封信,看看是否有人會回覆或因此購買。
為了測試這個想法,我寄出了七封信,但沒有任何收件人續訂或回覆。樣本太小,無法下定論。如果我需要 7.8% 的客戶續訂,那大約是每 12 到 13 人中就有 1 人。
我不太想繼續這個實驗,因為有許多不利因素:
- 這些郵件在他們未必在意是否要繼續接收 TinyPilot 更新的時候寄達。如果提示是在使用者於 TinyPilot 網頁應用程式中點擊「Update」按鈕時出現,會是更有意義的測試。
- 有些客戶是用看起來像是收垃圾信用的次要帳號購買 TinyPilot,所以他們可能根本沒看到我的信。
- 這些客戶可能會發現,即使不付費續訂,還是能繼續收到新更新,因此沒有動力續訂。
新增自動續訂選項
我們目前只提供一次性的授權續購。我還沒探索過經常性訂閱的選項,因為 Shopify 原生只支援一次性購買。
要在 Shopify 上收取經常性付款,我得使用第三方 Shopify 應用程式,而我很討厭這麼做。以我的經驗,Shopify 應用程式品質不佳,而且會要求我開放客戶資料的廣泛存取權限,甚至包括那些交易根本不會經過該第三方整合的客戶。
不過,與其他實驗相比,自動續訂選項在測試客戶訂閱意願方面,CP 值相當高。如果我只是在授權購買頁面上多加一個選項,例如「或以 9 折購買年繳訂閱」,就能看出是否有客戶願意訂閱。
新增一個訂閱按鈕相對容易,而且我們大概不需要改變其他任何流程或系統,因為這些訂閱只會以一般的 Shopify 訂單形式出現。
業餘專案
What Got Done
我最近一直在嘗試 Nix,其中一個讓我感興趣的功能是 nix develop。它能讓你建立一個自給自足的 shell 環境,裡面正好包含建置與測試專案所需的所有開發工具。
我在各種軟體專案中常遇到的一個困擾,就是維護依賴套件的困難。我的專案依賴特定版本,例如 Go 1.19 或 Node.js 16。每當需要升級到下一個版本時,要弄清楚如何在開發環境中安裝它,然後在持續整合(CI)設定中更新版本號,都很麻煩。
更糟的是,如果同一台系統上有多個專案,為其中一個專案更新 Node.js,就會讓其他專案拿到非預期的 Node.js 和 npm 版本。
nix develop 的承諾是,我可以在一個地方定義依賴:一個 Nix flake。舉例來說,如果我需要升級到下一個 Go 版本,只要更新一個檔案,重新執行 nix develop,就能在本地 shell 中取得正確版本的 Go。CI 環境也會執行相同版本。這個環境僅限於該目錄,因此變更套件版本不會影響同一系統上的其他專案。
我開始在 What Got Done 中嘗試 nix develop,因為它依賴 Go 和 Node.js,而版本管理一直是個痛點。
在 What Got Done 的開發環境中玩 Nix 很有趣,但目前我遇到了以下幾個障礙:
- 我一直搞不懂怎麼讓 Go 的靜態二進位檔建置正常運作,而解法給人的感覺就像是:「你本來就該知道這個神奇咒語。」
- 沒有簡單的方法可以指定依賴套件的精確版本。
- 我原本以為可以像 Docker 那樣宣告版本,例如
go:1.19.3,但 Nix 並不支援這種語意。 - 對於一個如此強調可重現性的工具來說,這讓我很意外。
- 我找到最接近的解法是使用第三方工具來找出與套件版本對應的 nixpkgs hash,然後將套件釘選到該 hash。這裡是 What Got Done 其中一個依賴的實際範例。
- Devbox 解決了這個問題,但那就變成間接使用 Nix,還得去學習 Devbox 在 Nix 之上的抽象層。
- 我原本以為可以像 Docker 那樣宣告版本,例如
- 填充 Nix store 的速度慢到讓人無法接受。
- 有一個
nixos/nixDocker 映像檔可以在 CircleCI 上很快啟動,但為我的 Nix+Go flake 建置 Nix 環境卻要花大約兩分鐘。 - 這意味著我執行的任何 CI 步驟都得先花兩分鐘來初始化 Nix。
- 我試過快取 Nix store,但它大約有 3 GB,CircleCI 需要約兩分鐘來下載與解壓縮。我認為 CircleCI 是把快取檔存在 Amazon S3 上,所以除非快取大小小於 1 GB,否則效能會非常糟糕。
- 有一個
總結
完成了什麼?
- 發表了〈在 Raspberry Pi 4 上安裝 NixOS〉
- 學會使用 hurl 來取代以 curl 為基礎的 HTTP API 整合測試。
- 造訪了北卡羅來納州夏洛特和加拿大蒙特婁。
學到的教訓
- TinyPilot 似乎已經耗盡了從部落格和 YouTube 評測中獲得的行銷價值。
- 相較於一年前新評測帶來的效果,現在新評測的邊際效益正在遞減。這絕對不像兩年前一篇評測就讓銷售額幾乎翻三倍的盛況。
- 提供自動續訂的 TinyPilot 授權選項,是測試經常性收入市場最划算的方式。
下個月的目標
- 盡快將製造轉移至委外製造商。
- 制定搬離 TinyPilot 本地辦公室的詳細計畫。
- 測試自動續訂 TinyPilot 授權的選項。
需要協助的事
- 如果你有使用 Shopify 第三方經常性訂閱應用程式的經驗(無論好壞),特別是針對數位產品,歡迎來信告訴我。
- 如果你能找到那篇我印象模糊的 Basecamp 故事,請在留言中告訴我。
隨機一篇部落格

留言
登入後參與討論