使用Stripe Connect建立藝術家預訂平台
我在六年內建立了三個市場平台,而娛樂預訂領域是最有趣——也是最棘手的——垂直市場之一。你要處理兩種非常不同的用戶類型(討厭行政工作的藝術家和需要可靠性的活動策劃者)、時間敏感的預訂、可變定價、取消風波,以及永遠存在的「誰持有資金?」問題。讓我帶你了解如何實際建立其中一個平台。
現場娛樂預訂市場是分散的。GigSalad 有超過 110,000 名表演者。GigMasters 在美國和加拿大年收入約為 4,700 萬美元。Gigstarter 已在 8 個歐洲國家擴展。但大多數這些平台是多年前用老化技術堆棧建立的,確實有機會建立更好的東西——特別是如果你從第一天開始就用 Stripe Connect 完善支付架構。

目錄
- 理解雙邊市場模式
- 選擇你的技術堆棧
- 藝術家目錄的數據建模
- 搜尋、過濾和發現
- Stripe Connect:支付骨幹
- 預訂流程架構
- 處理爭議、取消和退款
- 實際可行的貨幣化模式
- 建立信任:評論、驗證和託管
- 性能和擴展考量
- 常見問題
理解雙邊市場模式
雙邊市場在其 DNA 中內置了雞蛋和雞的問題。你需要藝術家來吸引客戶,也需要客戶來吸引藝術家。在你寫任何一行代碼之前,你需要決定你要先啟動哪一邊。
對於娛樂預訂,我幾乎總是建議先啟動供應方(藝術家)。原因如下:藝術家願意在任何可能給他們帶來演出機會的地方列出。另一方面,活動策劃者不會訪問你的平台,除非已經有大量人才可以瀏覽。
核心用戶旅程
藝術家方:
- 註冊並建立個人資料(簡介、照片、視頻、音頻樣本)
- 設定可用性、定價和服務區域
- 收到預訂詢問或回應演出發佈
- 接受預訂並在活動後收到付款
- 通過評論建立聲譽
客戶方:
- 按流派、位置、日期和預算搜尋藝術家
- 查看個人資料、觀看演示視頻、聆聽樣本
- 發送詢問或直接預訂
- 通過平台付款(資金以託管方式持有)
- 在活動後留下評論
該平台位於中間,便於發現、溝通、支付和信任。
選擇你的技術堆棧
這是我有強烈看法的地方。對於這樣的市場,你需要一個能很好地處理動態內容的堆棧,支持實時功能(消息、可用性更新),並給你構建自定義預訂邏輯的靈活性。
| 組件 | 推薦 | 原因 |
|---|---|---|
| 前端 | Next.js (App Router) | 藝術家個人資料的 SSR 用於 SEO,React 用於互動預訂流程 |
| 後端 API | Next.js API Routes 或單獨的 Node.js 服務 | Stripe webhooks、預訂邏輯、身份驗證 |
| 資料庫 | PostgreSQL (via Supabase 或 Neon) | 關聯數據完美適合市場模式 |
| CMS | Sanity 或 Payload CMS | 藝術家個人資料需要帶有媒體的結構化內容 |
| 身份驗證 | Clerk 或 NextAuth.js | 基於角色的身份驗證(藝術家 vs. 客戶 vs. 管理員) |
| 搜尋 | Meilisearch 或 Algolia | 跨流派、位置、價格的快速分面搜尋 |
| 支付 | Stripe Connect | 為市場付款量身定制 |
| 文件存儲 | Cloudflare R2 或 AWS S3 | 音頻樣本、視頻、宣傳照片 |
| 託管 | Vercel 或 Cloudflare Pages | 邊緣渲染以加快藝術家個人資料加載 |
如果你有興趣走 Next.js 開發 路線,那就是我對大多數團隊的建議。服務器組件用於 SEO 關鍵藝術家目錄頁面和客戶端組件用於互動預訂表單的組合難以超越。
對於想要目錄部分的超快速靜態頁面和預訂動態島的團隊,Astro 也值得考慮——特別是如果平台的目錄側是內容密集的。

藝術家目錄的數據建模
早期獲得正確的數據模型能為你節省數月的重構時間。以下是我發現適用於娛樂市場的東西:
-- 核心藝術家個人資料
CREATE TABLE artists (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
stripe_account_id TEXT, -- Stripe Connect 帳戶
display_name TEXT NOT NULL,
slug TEXT UNIQUE NOT NULL,
bio TEXT,
headline TEXT,
profile_image_url TEXT,
base_price_cents INTEGER,
price_type TEXT CHECK (price_type IN ('per_hour', 'per_event', 'custom')),
travel_radius_miles INTEGER,
is_verified BOOLEAN DEFAULT FALSE,
is_featured BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 流派/分類標記(多對多)
CREATE TABLE artist_genres (
artist_id UUID REFERENCES artists(id),
genre_id UUID REFERENCES genres(id),
PRIMARY KEY (artist_id, genre_id)
);
-- 服務區域
CREATE TABLE artist_service_areas (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
artist_id UUID REFERENCES artists(id),
city TEXT,
state TEXT,
country TEXT,
lat DECIMAL(10, 8),
lng DECIMAL(11, 8)
);
-- 可用性日曆
CREATE TABLE artist_availability (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
artist_id UUID REFERENCES artists(id),
date DATE NOT NULL,
status TEXT CHECK (status IN ('available', 'booked', 'blocked')),
UNIQUE (artist_id, date)
);
-- 媒體資產
CREATE TABLE artist_media (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
artist_id UUID REFERENCES artists(id),
media_type TEXT CHECK (media_type IN ('image', 'video', 'audio')),
url TEXT NOT NULL,
thumbnail_url TEXT,
title TEXT,
sort_order INTEGER DEFAULT 0
);
注意藝術家表上的 stripe_account_id。這是 Stripe Connect 的連接帳戶 ID——你需要它來進行每次付款。稍後會詳細介紹。
重要的分類
根據 GigSalad、ShowBird(8,000+ 名藝術家涵蓋 45+ 個分類)和 StarClinch(14 個分類,17,000+ 名藝術家)正在發揮作用的情況,以下是推動最多預訂的分類:
- 現場樂隊(婚禮樂隊、翻唱樂隊、爵士樂團)
- 獨奏音樂家(吉他手、鋼琴家、小提琴手)
- DJ
- 歌手和聲樂家
- 古典樂團(弦樂四重奏、管弦樂隊)
- 致敬樂隊
- 喜劇演員
- 魔術師和雜技演員
- 名人出場
- MC 和主持人
不要試圖在啟動時成為一切。選擇 3-4 個分類,主導一個地理區域,然後擴展。
搜尋、過濾和發現
搜尋是任何目錄市場的成敗功能。如果客戶在 30 秒內找不到合適的藝術家,他們會離開。
必要的搜尋過濾器
- 流派/分類:具有子分類的多選
- 位置:基於半徑的地理搜尋(「奧斯汀 50 英里內的爵士樂隊」)
- 日期可用性:只顯示在客戶活動日期可用的藝術家
- 價格範圍:帶有最小/最大值的滑塊
- 評分:最小星級評分過濾器
- 僅驗證:驗證藝術家的切換
對於搜尋引擎本身,我會在新建項目中選擇 Meilisearch 而不是 Algolia。它是開源的、自託管的,分面搜尋非常好。Algolia 也能運作,但隨著你的索引增長,成本增加很快——在他們的付費計劃上每 1,000 個搜尋請求需要 1 美元以上。
// 示例:Meilisearch 藝術家搜尋查詢
const results = await searchClient.index('artists').search(query, {
filter: [
`genres IN ["jazz", "blues"]`,
`base_price_cents >= 15000`,
`base_price_cents <= 75000`,
`_geoRadius(30.2672, -97.7431, 80467)`, // 奧斯汀方圓 50 英里
],
sort: ['rating:desc', 'booking_count:desc'],
facets: ['genres', 'price_range', 'rating'],
hitsPerPage: 20,
});
日期可用性是最棘手的過濾器。你不想將可用性數據推送到搜尋索引並保持同步。相反,從 Meilisearch 獲取更廣泛的集合,然後使用數據庫查詢在應用層按可用性過濾。這是一個額外的步驟,但它能讓你的搜尋索引保持乾淨。
Stripe Connect:支付骨幹
這是事情變得真實的地方。Stripe Connect 是雙邊娛樂市場的正確選擇。我評估了替代方案(PayPal for Marketplaces、Adyen for Platforms、Mangopay),Stripe Connect 在開發者體驗、文檔和全球覆蓋方面勝出。
哪種 Stripe Connect 類型?
Stripe 提供三種 Connect 帳戶類型。對於藝術家預訂平台,以下是細分:
| 帳戶類型 | KYC 負擔 | 儀表板訪問 | 最佳用於 |
|---|---|---|---|
| 標準 | Stripe 處理 KYC | 藝術家獲得完整的 Stripe 儀表板 | 藝術家想要控制的平台 |
| 快速 | Stripe 處理 KYC | 有限的嵌入式儀表板 | 大多數市場(推薦) |
| 自定義 | 你處理 KYC | 無——你構建一切 | 白標平台 |
使用快速帳戶。 藝術家快速上線(Stripe 處理身份驗證),他們獲得有限的儀表板來查看他們的付款,你保持對支付流程的控制。除非你正在建立白標解決方案,否則自定義帳戶都是多餘的。
將藝術家納入 Stripe Connect
// 為新藝術家建立 Stripe Connect 快速帳戶
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
export async function createConnectAccount(artistId: string, email: string) {
const account = await stripe.accounts.create({
type: 'express',
email,
capabilities: {
card_payments: { requested: true },
transfers: { requested: true },
},
business_type: 'individual',
metadata: {
artist_id: artistId,
},
});
// 存儲帳戶 ID
await db.artists.update({
where: { id: artistId },
data: { stripe_account_id: account.id },
});
// 生成上線連結
const accountLink = await stripe.accountLinks.create({
account: account.id,
refresh_url: `${process.env.APP_URL}/artists/onboarding/refresh`,
return_url: `${process.env.APP_URL}/artists/onboarding/complete`,
type: 'account_onboarding',
});
return accountLink.url;
}
處理預訂付款
關鍵概念是目標地址費用。客戶支付你的平台,Stripe 自動分割資金——你的平台費用留在你這裡,其餘的去到藝術家的連接帳戶。
export async function createBookingPayment(
bookingId: string,
amountCents: number,
artistStripeAccountId: string,
platformFeePercent: number = 15
) {
const platformFeeCents = Math.round(amountCents * (platformFeePercent / 100));
const paymentIntent = await stripe.paymentIntents.create({
amount: amountCents,
currency: 'usd',
application_fee_amount: platformFeeCents,
transfer_data: {
destination: artistStripeAccountId,
},
metadata: {
booking_id: bookingId,
},
// 持有費用——不要立即捕獲(類似託管的行為)
capture_method: 'manual',
});
return paymentIntent;
}
注意 capture_method: 'manual'。這對預訂平台至關重要。你在預訂確認時授權費用,但不在活動日期之前或活動發生後才捕獲(實際扣款)。這給你類似託管的功能而無需構建實際託管。
重要限制: Stripe 上的手動捕獲必須在授權後 7 天內捕獲。對於更遠的活動,你需要不同的方法——立即收取定金,活動日期前收取餘額,或使用 Stripe 的單獨費用和轉帳模式,你立即向客戶收費但延遲轉帳給藝術家。
Stripe Connect 定價(2025)
Stripe 目前的 Connect 費用:
- 標準處理:2.9% + $0.30 每筆交易
- Connect 費用:額外 0.25% + $0.25 每次付款到連接帳戶(快速/自定義)
- 即時付款:付款金額的 1%(可選,藝術家喜歡)
所以在 $2,000 預訂上有 15% 平台費($300),數學看起來像:
- 客戶支付:$2,000
- Stripe 處理:~$58.30(2.9% + $0.30)
- 平台費:$300
- Connect 付款費:~$5.25($1,700 的 0.25% + $0.25)
- 藝術家收到:~$1,636.45
你需要明確說明誰承擔 Stripe 費用。大多數平台要麼將其納入平台費,要麼作為「服務費」傳遞給客戶。
預訂流程架構
以下是我發現適用於娛樂平台的預訂流程:
客戶搜尋 → 查看藝術家個人資料 → 檢查可用性 →
發送詢問(可選) → 提交預訂請求 →
藝術家檢查並接受 → 客戶卡被授權 →
活動發生 → 平台捕獲付款 → 藝術家獲得報酬
詢問 vs. 即時預訂辯論
一些平台(如 GigSalad)使用詢問優先模式,客戶發送消息並獲得自定義報價。其他允許以列出的價格進行即時預訂。我的建議?兩者都支持。
- 即時預訂:對於藝術家有明確固定定價的情況(例如,「4 小時 DJ:$800」)。更高的轉換率。
- 詢問/報價:對於自定義活動(例如,「10 人樂隊為公司盛會」)。更高的平均預訂價值。
讓藝術家在他們的設定中選擇他們偏好的模式。
預訂的狀態機
預訂需要明確的狀態。我使用狀態機模式:
const BOOKING_STATES = {
INQUIRY: 'inquiry', // 客戶發送了消息
QUOTED: 'quoted', // 藝術家發送了價格
PENDING: 'pending', // 客戶提交了預訂(等待藝術家)
ACCEPTED: 'accepted', // 藝術家接受了
PAYMENT_AUTHORIZED: 'authorized', // 卡被授權
CONFIRMED: 'confirmed', // 雙方都確認了
IN_PROGRESS: 'in_progress', // 活動正在進行
COMPLETED: 'completed', // 活動完成,付款已捕獲
CANCELLED: 'cancelled', // 任何一方取消了
DISPUTED: 'disputed', // 客戶提出了爭議
REFUNDED: 'refunded', // 發佈了退款
} as const;
每個狀態轉換都會觸發特定的操作:電子郵件、Stripe 操作、日曆更新等。
處理爭議、取消和退款
這是沒人想思考的部分,但如果你沒有計劃,它會讓你窒息。
取消政策層級
讓藝術家從預定層級中設置自己的取消政策:
| 政策 | 提前 30+ 天 | 14-30 天 | 7-14 天 | 7 天以內 |
|---|---|---|---|---|
| 靈活 | 全額退款 | 全額退款 | 50% 退款 | 無退款 |
| 溫和 | 全額退款 | 50% 退款 | 25% 退款 | 無退款 |
| 嚴格 | 50% 退款 | 25% 退款 | 無退款 | 無退款 |
像 GEM 這樣的平台使用託管金庫方法——資金被持有直到活動完成。你可以用 Stripe 的單獨費用和轉帳來近似:立即向客戶收費,但只在活動後轉帳給藝術家。這給你完全控制退款時間。
藝術家爽約
噩夢場景。如果藝術家沒有出現,你需要:
- 立即向客戶全額退款
- 如果他們已經獲得報酬,從藝術家的連接帳戶中扣除(Stripe Connect 支持反向轉帳)
- 標記藝術家的帳戶
- 可能從平台保險基金中補償客戶
構建報告系統,客戶可以在活動後 24 小時內標記爽約。
實際可行的貨幣化模式
根據頂級平台在 2025 年正在做的事情:
| 模式 | 示例 | 優點 | 缺點 |
|---|---|---|---|
| 每次預訂佣金 | 10-20% 平台費 | 收入隨著預訂而擴展 | 藝術家討厭高提成,脫離平台 |
| 訂閱層級 | Gigstarter:免費 / €9.99/月 / €14.95/月 | 可預測的循環收入 | 對新藝術家更難銷售 |
| 線索費 | 每次收到詢問支付 | 對藝術家的低摩擦 | 如果線索不轉換可能感覺詐欺 |
| 精選列表 | GigMasters:$30-40/月用於專業/精選 | 輕鬆增售 | 可能稀釋搜尋品質 |
| 混合 | 免費列表 + 佣金 + 高級層級 | 多個收入流 | 複雜性 |
我會從佣金模式開始(藝術家方 12-15% 平台費,客戶方 5-8% 服務費),一旦你有了牽引力就添加訂閱層級。總平台提成 17-23% 符合行業規範。
建立信任:評論、驗證和託管
信任在市場上是一切,在這裡有人支付 $2,000+ 購買他們從未親眼見過的婚禮樂隊。
驗證級別
- 電子郵件驗證:基本,每個人都獲得這個
- 身份驗證:政府身份證檢查(Stripe Connect 在上線期間處理)
- 背景檢查:第三方服務如 Checkr
- 平台驗證:你的團隊進行的手動審查(StarClinch 用專門驗證人員進行)
評論系統
只允許已完成預訂的評論。這可以防止虛假評論並確保每條評論代表真實交易。顯示聚合評分和個別評論詳情。
// 只有在預訂完成時才建立評論
async function submitReview(bookingId: string, rating: number, text: string) {
const booking = await db.bookings.findUnique({ where: { id: bookingId } });
if (booking.status !== 'completed') {
throw new Error('Only review completed bookings');
}
if (booking.reviewed_at) {
throw new Error('Booking already reviewed');
}
return db.reviews.create({
data: {
booking_id: bookingId,
artist_id: booking.artist_id,
client_id: booking.client_id,
rating,
text,
},
});
}
性能和擴展考量
藝術家個人資料頁面是你流量最高的頁面,也是你對 SEO 最重要的頁面。每個藝術家個人資料本質上是一個登錄頁面,應該對搜尋進行排名,如「在芝加哥雇用爵士樂隊」。
SSR + ISR 策略
使用 Next.js,為藝術家個人資料使用增量靜態再生成:
// app/artists/[slug]/page.tsx
export async function generateStaticParams() {
const artists = await db.artists.findMany({
select: { slug: true },
where: { is_active: true },
});
return artists.map((a) => ({ slug: a.slug }));
}
export const revalidate = 3600; // 每小時再驗證一次
這給你靜態頁面性能和新鮮數據。個人資料視圖、定價和可用性在下次再驗證週期中更新。
對於搜尋/目錄頁面,SSR 更有意義,因為內容根據過濾器和位置而改變。將流式傳輸與 Suspense 一起使用以立即顯示頁面外殼,同時搜尋結果加載。
如果你在權衡這類項目的不同框架,我們的團隊對 Next.js 和 Astro 都有深入的經驗——正確的選擇取決於你的預訂流程需要多動態,相對於你的目錄有多內容密集。
CDN 和媒體優化
藝術家上傳高分辨率照片和視頻。你需要:
- 圖像優化管道(Next.js Image 組件 + Cloudflare Images 或 imgix)
- 視頻託管在專門的服務(Mux、Cloudflare Stream 或 Bunny Stream)
- 音頻波形生成和流傳輸(前端的 WaveSurfer.js)
不要提供原始上傳。在服務器端將所有內容處理成優化格式。
常見問題
建立藝術家預訂平台要花多少錢? 一個基本的 MVP,具有藝術家個人資料、搜尋、預訂流程和 Stripe Connect 集成,通常需要 $40,000-$80,000,有經驗的開發團隊,或 3-5 個月的構建時間。一個功能齊全的平台,具有消息、行動應用和高級搜尋,可以運行 $150,000+。如果你想談論具體情況,請查看我們的定價頁面了解我們如何確定市場項目的範圍。
為什麼使用 Stripe Connect 而不是手動構建支付分割? Stripe Connect 處理困難的部分:40+ 個國家的藝術家 KYC/身份驗證、美國藝術家收入超過 $600 的 1099 稅務報告、自動付款計劃和退單處理。自己構建這個需要專門團隊 6+ 個月並讓你暴露於監管風險。每次付款 0.25% + $0.25 的費用絕對值得。
娛樂預訂平台的典型佣金率是多少? 大多數平台在藝術家方面收取 10-20% 之間的費用,並收取 5-10% 的客戶服務費。GigSalad 和 GigMasters 在這個範圍內運作。Gigstarter 值得注意的是收取零佣金並通過訂閱層級(€9.99-€14.95/月)進行貨幣化。你的理想費率取決於你的市場——婚禮娛樂可以承受更高的佣金而不是酒吧演出。
你如何處理藝術家可用性並防止雙重預訂? 實施一個基於日曆的可用性系統,其中藝術家將日期標記為可用、已預訂或已阻止。當預訂確認時,自動阻止該日期。在 (artist_id, date) 上使用數據庫級別的唯一約束以防止競爭條件。對於一天進行多場活動的藝術家(如 DJ),添加時間槽到可用性模式而不是全日塊。
我應該構建一個無頭 CMS 驅動的目錄或一個完全自定義的數據庫? 混合方法效果最好。使用無頭 CMS 進行編輯內容(推動 SEO 流量的博客文章、城市指南、分類登錄頁面)和自定義 PostgreSQL 數據庫用於交易數據(預訂、支付、可用性、評論)。試圖通過 CMS 運行預訂邏輯是痛苦的配方。
我如何在我的平台上獲得前 100 名藝術家? 直接外展有效。從公開音樂家目錄、婚禮供應商網站和本地活動列表中抓取。用明確的價值主張向藝術家發送電子郵件——免費列表、無前期成本,你會為他們帶來預訂。提供前 50 名藝術家「創始成員」徽章和永久降低的佣金率。與本地音樂學校和場地合作。前 100 名是手動工作,句號。
關於國際支付和多種貨幣呢? Stripe Connect 支持在 40+ 個國家進行付款和 135+ 種貨幣。當德國藝術家被美國客戶預訂時,Stripe 自動處理貨幣轉換。你將支付 Stripe 的 FX 費(大約在標準處理上的 1%),但這遠便宜於自己構建多貨幣支持。以客戶的貨幣設置你的平台費並讓 Stripe 處理到藝術家本地貨幣的轉換。
我如何在雙邊市場上防止詐欺? 多個層次:藝術家的 Stripe Connect 內置身份驗證、客戶方付款詐欺檢測的 Stripe Radar、高價值預訂的手動審查(超過 $5,000)、速度檢查(標記快速建立許多預訂的帳戶)和在藝術家付款前的持有期(活動完成後 3-7 天)。持有期是你最大的保護——它給客戶時間在資金離開你的平台之前報告問題。