閉店後、レジ締めに毎日30分。
1人サロンにとって、この30分はとても重い。1ヶ月で15時間、1年で180時間。時給換算3,000円なら、54万円分の時間を毎年捨てている計算になる。
ある日、この作業が全部コードで済むことに気づいた。結果、いまはレジ締めにかかる時間が0分になった。
この記事では、その実装を順を追って書く。コードはすべて動いている本番環境のものだ。
手作業でやっていたこと
以前のフローは、こうだった。
- レジ(タブレット型POS)の日報を印刷
- 現金売上・カード売上・QR決済の内訳を手で電卓
- Excelに日次テーブルを転記
- 会計ソフトに仕訳を入力
- 現金残高を実機と照合
ここまでで、だいたい30分。慣れても早くならない。なぜなら、作業そのものが目視・転記・照合で構成されているからだ。
どこを自動化したか
考えた結果、次の3点に絞って自動化した。
- POSのAPIから当日売上を取得
- 会計ソフトにAPI経由で仕訳投入
- 照合結果をLINE/Slackに通知
つまり、「印刷しない」「転記しない」「照合を人間がやらない」この3つを守れば、0分になる。
実装の骨子
スクリプトはPythonで書いた。cronで毎日23:30に実行している。
import requests
from datetime import date
# 1. POS API から当日売上を取得
def fetch_sales(target_date: date) -> dict:
res = requests.get(
"https://api.pos-service.example/daily",
headers={"Authorization": f"Bearer {API_KEY}"},
params={"date": target_date.isoformat()},
)
res.raise_for_status()
return res.json()
# 2. 会計ソフトに仕訳投入
def post_journal(entries: list[dict]) -> None:
for entry in entries:
requests.post(
"https://api.accounting.example/journals",
headers={"Authorization": f"Bearer {ACC_TOKEN}"},
json=entry,
)
# 3. 通知
def notify(text: str) -> None:
requests.post(SLACK_WEBHOOK, json={"text": text})
if __name__ == "__main__":
today = date.today()
sales = fetch_sales(today)
entries = build_entries(sales)
post_journal(entries)
notify(f"{today} のレジ締め完了:売上 {sales['total']}円")実測値
| 項目 | Before | After |
|---|---|---|
| 所要時間 | 30分/日 | 0分/日 |
| 年間節約時間 | — | 約180時間 |
| ヒューマンエラー | 月2〜3件 | ゼロ(3ヶ月運用) |
| 現金差異チェック | 目視 | 自動(差額>500円で通知) |
注意点
- APIキーはコードに直書きしない .envファイルに分離。Gitにも絶対に含めない。
- 失敗時の通知を必ず入れる 静かに失敗する自動化は最悪。try/exceptで掴んでSlackに吐かせる。
- 最初の1ヶ月は毎日手動照合 ゼロ分を信じすぎない。差分が出たときの原因特定ができるように、最低30日は目視で並走する。
まとめ
- レジ締めは、人間がやる必要のない作業
- 年間180時間を戻すために、Python1本で十分
- 最初は並走期間を取り、通知と照合を必ず残す
サロン経営の「感覚」を、1つずつ数字とコードに置き換えていく。
次は「売上を会計ソフトに自動転記する仕組み」を書きます。
※ 当サイトの一部リンクには、アフィリエイトリンクが含まれます。
