TinyPilot: Month 37

Michael Lynch

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,3007,800-500 (-6%)
銷售營收$88,378.45$79,635.02-$8,743.43 (-10%)
企業訂閱$290.70$290.700
權利金$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 的網頁應用程式讓任何裝置都能取得最新版的 TinyPilot Pro

TinyPilot Pro 的軟體並不會追蹤它是否綁定了有效的授權。有些在 2020 年 8 月購買的使用者,現在已經進入一年期授權的第三年了。

絕大多數客戶根本沒意識到自己的授權已經過期。他們很自然地認為,既然 TinyPilot 還持續推送更新到裝置上,授權應該就還是有效的。

客戶偶爾還是會發現授權過期了,但總是在特別不方便的時機。

TinyPilot 使用 microSD 卡作為儲存媒體。microSD 特別容易發生檔案系統損毀。當 microSD 上的檔案系統壞掉時,唯一的解決辦法就是用 TinyPilot Pro 的映像檔重新燒錄 microSD。

要下載 TinyPilot Pro 映像檔,客戶需要輸入訂單資訊。在提供映像檔之前,我們會檢查客戶是否仍持有有效授權。

要求使用者輸入訂單編號與電子郵件地址以下載 TinyPilot Pro 映像檔的表單截圖

下載 TinyPilot Pro microSD 映像檔的頁面上的授權驗證

從客戶的角度來看,這是得知授權過期最糟的方式。他們的檔案系統已經損毀,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 分鐘重置裝置,因而放棄更新。

手動發送到期通知

這個月我想到一個點子,試著在客戶授權到期時寄送電子郵件通知。這件事當然可以自動化,但在投入太多自動化之前,我先手動寄了幾封信,看看是否有人會回覆或因此購買。

我是 TinyPilot 的創辦人 Michael Lynch。我寫信是因為注意到您一年期的 TinyPilot Pro 授權最近已到期。續訂授權是自由選擇的,但續訂後您將能持續取得 TinyPilot 軟體的新功能與錯誤修正。我們每兩到三個月就會發布更新,您可以在公開的更新日誌中看到我們最近的成果。續訂 TinyPilot Pro 授權也能讓您享有私人電子郵件支援,以及在公開支援論壇中的優先支援。作為一家小公司,我們仰賴授權續訂來資助軟體的改進,因此如果您選擇續訂,先在此致謝!如果您暫時不想續訂,我建議您下載一份您仍符合資格的最新版 TinyPilot Pro(TinyPilot Pro 2.6.0)。這個映像檔能在您日後需要時,用來將裝置恢復原廠設定。

為了測試這個想法,我寄出了七封信,但沒有任何收件人續訂或回覆。樣本太小,無法下定論。如果我需要 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 之上的抽象層。
  • 填充 Nix store 的速度慢到讓人無法接受。
    • 有一個 nixos/nix Docker 映像檔可以在 CircleCI 上很快啟動,但為我的 Nix+Go flake 建置 Nix 環境卻要花大約兩分鐘。
    • 這意味著我執行的任何 CI 步驟都得先花兩分鐘來初始化 Nix。
    • 我試過快取 Nix store,但它大約有 3 GB,CircleCI 需要約兩分鐘來下載與解壓縮。我認為 CircleCI 是把快取檔存在 Amazon S3 上,所以除非快取大小小於 1 GB,否則效能會非常糟糕。

總結

完成了什麼?

學到的教訓

  • TinyPilot 似乎已經耗盡了從部落格和 YouTube 評測中獲得的行銷價值。
  • 提供自動續訂的 TinyPilot 授權選項,是測試經常性收入市場最划算的方式。

下個月的目標

  • 盡快將製造轉移至委外製造商。
  • 制定搬離 TinyPilot 本地辦公室的詳細計畫。
  • 測試自動續訂 TinyPilot 授權的選項。

需要協助的事

  • 如果你有使用 Shopify 第三方經常性訂閱應用程式的經驗(無論好壞),特別是針對數位產品,歡迎來信告訴我。
  • 如果你能找到那篇我印象模糊的 Basecamp 故事,請在留言中告訴我。

本文章由 muse-spark-1.2-contributor 進行翻譯

留言