プロ機材向けレンタルマーケットプレイス

ダブルブッキング防止、分割決済、保証金、リアルタイムメッセージ、空間検索を備えたRails製二面型マーケットプレイス。

課題

同じ機材が重なる日程で二重予約されることを確実に防ぎ、プラットフォーム手数料、オーナー支払い、保証金という複数のお金の流れを扱う必要があった。 小規模なチームでも、メッセージや予約更新をリアルタイムに扱うUXが求められた。

ソリューション

RailsとPostgreSQLのtstzrange/GiST排他制約で重複予約をDBレイヤーで拒否。Stripe Connectで分割決済と保証金を設計し、Hotwire、Action Cable、Sidekiqでリアルタイム更新と非同期処理を実装した。

成果

ダブルブッキングが構造上起きない二面型マーケットプレイスを構築し、決済、保証金、検索、メッセージ、通知を単一のRailsコードベースで提供した。

チーム

Small team, 12 weeks

Railsフルスタック・決済・マーケットプレイス・リアルタイム

役割

予約整合性、Stripe Connect、Hotwire、空間検索、Sidekiq、認可を担当。

PostgreSQL制約とバックグラウンドジョブへ正しさを寄せながら、HotwireでリアルタイムUXを構築しました。

技術スタック

FrameworkRuby on Rails 7
DatabasePostgreSQL / tstzrange / GiST
PaymentsStripe Connect / Manual-capture Deposit
RealtimeHotwire / Turbo Streams / Action Cable
JobsSidekiq / Redis
AuthDevise / Pundit

主要機能

01

DB制約によるダブルブッキング防止

02

Stripe Connectによる分割決済と保証金

03

Hotwireによるリアルタイムメッセージ・予約更新

04

空き状況を考慮した空間検索

05

Sidekiqによる決済・通知・再インデックス処理

注力した点

データベースが強制する予約整合性

PostgreSQLの範囲型と排他制約で、重複する確定予約をDBエンジン自身が拒否する構成にしました。

3つのお金の流れを分けて設計

レンタル料、オーナー支払い、保証金をStripe Connectと手動キャプチャで分け、実務上の返金・解放まで扱えるようにしました。