🏷️ ブランド管理
ブランド横断マトリクス
| ブランド | フロント構成 | モバイル構成 | brand識別子 | 特徴 | 注意点 |
|---|---|---|---|---|---|
| 🐱 猫アプリ | Web: neko-web (Next.js) | iOS/Android: neko-mobile (Expo) | neko | 写真アップロード型サービス | アップロード量が多い。Expo側の大容量処理に注意 |
| 🐶 犬アプリ | Web: dog-web (Next.js) | iOS/Android: dog-mobile (Expo予定) | dog | 猫と同構成(犬向け商品カタログ) | brand分離を厳格にしないと履歴混在リスク |
| 🎨 日本画アプリ | Web: nihonga (Next.js) | モバイルなし | nihonga | 作品選択型サービス(オンデマンド印刷) | 作品の権利管理・額シミュレーション処理が必須 |
| 🛠 管理画面 | Web: admin (Next.js) | モバイルなし | admin | 社内専用コンソール(注文/工場/監査) | Cloudflare Access + Firebase admin claims 必須 |
ブランド一覧
| ブランドID | サービス名 | ドメイン | フォルダ構成 | ステータス |
|---|---|---|---|---|
| neko | Nekomata (ネコマタ) | neko.contents-print.jp | apps/brands/neko/ | 🚀 開発中 |
| tokinoe | 時の絵(TOKINOE) | tokinoe.contents-print.jp | apps/brands/tokinoe/ | 📋 計画中 |
| dog | 犬写真アプリ(未定) | 未定 | 未定 | 🤔 検討中 |
詳細設定
🐱 猫又商店(neko)
ブランドID: neko
サービス名: 猫又商店(仮名)
ドメイン: neko.contents-print.jp
フォルダ構成:
- apps/brands/neko/web/ # Next.js Webアプリ
- apps/brands/neko/mobile/ # Expo モバイルアプリ
商品: 猫写真89mm正方形プリント
配送期間: 3営業日以内
🎨 時の絵(tokinoe)
ブランドID: tokinoe
サービス名: 時の絵(TOKINOE)
ドメイン: tokinoe.contents-print.jp
フォルダ構成:
- apps/brands/tokinoe/web/ # Next.js Webアプリ
- apps/brands/tokinoe/mobile/ # 将来対応
商品: 日本画・アート作品オンデマンド印刷
配送期間: 7営業日以内(制作工程含む)
🐶 犬写真アプリ(dog)
ブランドID: dog
サービス名: 未定(検討中)
ドメイン: 未定
フォルダ構成: 未定
商品: 未定
配送期間: 未定
ステータス: 開発検討中
データ管理・システム連携
Shopifyメタフィールド設定
注文レベルメタフィールド
# 基本ブランド識別
order.metafields.nekomata.brand:
type: "single_line_text_field"
value: "neko" | "tokinoe" | "dog"
description: "注文元ブランドの識別"
# 注文元ドメイン
order.metafields.nekomata.source_domain:
type: "single_line_text_field"
value: "neko.contents-print.jp" | "tokinoe.contents-print.jp"
description: "注文発生元ドメイン"
# 配送期間設定
order.metafields.nekomata.delivery_days:
type: "number_integer"
value: 3 | 7
description: "ブランド別配送期間(営業日)"
商品レベルメタフィールド
# 商品カテゴリ
product.metafields.nekomata.category:
type: "single_line_text_field"
value: "photo_print" | "art_print"
description: "商品カテゴリ分類"
# ブランド制限
product.metafields.nekomata.allowed_brands:
type: "list.single_line_text_field"
value: ["neko"] | ["tokinoe"] | ["neko", "tokinoe"]
description: "販売可能ブランド制限"
BFF(Backend for Frontend)API設計
ブランド判定エンドポイント
// GET /api/brand/detect
interface BrandDetectionRequest {
domain?: string;
subdomain?: string;
userAgent?: string;
}
interface BrandDetectionResponse {
brandId: "neko" | "tokinoe" | "dog";
brandName: string;
config: BrandConfig;
features: string[];
}
ブランド設定API
// GET /api/brand/config/{brandId}
interface BrandConfig {
brandId: string;
name: string;
description: string;
domain: string;
deliveryDays: number;
supportEmail: string;
// UI設定
theme: {
primaryColor: string;
secondaryColor: string;
logo: string;
favicon: string;
};
// 機能設定
features: {
mobileApp: boolean;
customSizes: boolean;
bulkUpload: boolean;
artworkTemplates: boolean;
};
// 商品設定
products: {
allowedCategories: string[];
defaultSize: string;
priceModifier: number;
};
}
アプリケーション設定
// ブランド設定マスタ
const BRAND_CONFIG: Record<string, BrandConfig> = {
neko: {
brandId: "neko",
name: "猫又商店",
description: "猫写真プリントサービス",
domain: "neko.contents-print.jp",
deliveryDays: 3,
supportEmail: "support@contents-print.jp",
theme: {
primaryColor: "#FF6B35", // 猫らしいオレンジ
secondaryColor: "#2D3748",
logo: "/brands/neko/logo.svg",
favicon: "/brands/neko/favicon.ico"
},
features: {
mobileApp: true,
customSizes: false,
bulkUpload: true,
artworkTemplates: false
},
products: {
allowedCategories: ["photo_print"],
defaultSize: "89mm_square",
priceModifier: 1.0
}
},
tokinoe: {
brandId: "tokinoe",
name: "時の絵(TOKINOE)",
description: "日本画・アート作品オンデマンド印刷",
domain: "tokinoe.contents-print.jp",
deliveryDays: 7,
supportEmail: "support@contents-print.jp",
theme: {
primaryColor: "#8B4513", // 日本画らしい茶色
secondaryColor: "#2F4F4F",
logo: "/brands/tokinoe/logo.svg",
favicon: "/brands/tokinoe/favicon.ico"
},
features: {
mobileApp: false,
customSizes: true,
bulkUpload: false,
artworkTemplates: true
},
products: {
allowedCategories: ["art_print"],
defaultSize: "A4",
priceModifier: 1.5
}
},
dog: {
brandId: "dog",
name: "未定",
description: "開発検討中",
domain: "未定",
deliveryDays: 0,
supportEmail: "support@contents-print.jp",
theme: {
primaryColor: "#000000",
secondaryColor: "#000000",
logo: "",
favicon: ""
},
features: {
mobileApp: false,
customSizes: false,
bulkUpload: false,
artworkTemplates: false
},
products: {
allowedCategories: [],
defaultSize: "",
priceModifier: 1.0
}
}
};
ブランド別設定
配送期間
- 猫又商店: 通常3営業日以内
- 犬写真アプリ: 未定(検討中)
- 時の絵(TOKINOE): 通常7営業日以内(制作工程のため)
商品カテゴリ
- 猫又商店: 写真プリント(89mm正方形)
- 犬写真アプリ: 未定(検討中)
- 時の絵(TOKINOE): アート作品印刷(複数サイズ対応)
UI・UX差別化
- 猫又商店: 猫・和風テイストのデザイン・コピー
- 犬写真アプリ: 未定(検討中)
- 時の絵(TOKINOE): 日本画・アート志向の上品なデザイン
システム連携フロー
注文処理フロー
sequenceDiagram
participant F as Frontend
participant B as BFF API
participant S as Shopify
participant E as Electron App
F->>B: ドメインベースブランド判定
B->>F: ブランド設定・UI config
F->>S: 注文作成 + brand metafield
S->>E: Webhook + brand情報
E->>E: ブランド別印刷処理
E->>S: 出荷完了 + tracking
S->>F: ブランド別通知メール
API認証・制限
// ブランドベースAPI制限
interface ApiLimitations {
rateLimit: {
neko: "100req/min",
tokinoe: "50req/min", // アート系は低頻度想定
dog: "10req/min" // 開発中のため制限
};
features: {
bulkUpload: ["neko"], // 猫のみ一括アップロード可能
customSizes: ["tokinoe"], // アート系のみカスタムサイズ
artworkTemplates: ["tokinoe"] // アート系のみテンプレート
};
}
新ブランド追加手順
1. データ設定
# 新ブランド設定登録
brand_id: "example"
brand_name: "サンプルブランド"
domain: "example.contents-print.jp"
delivery_days: 5
2. Shopify設定更新
- メタフィールド定義にブランドID追加
- 商品のallowed_brands設定
- 通知テンプレートのcase文追加
3. BFF API更新
- BRAND_CONFIGにエントリ追加
- ドメイン判定ロジック更新
- API制限設定追加
4. UI・UX準備
- ブランドテーマ設定(色・ロゴ)
- 専用コピーライティング
- 商品カタログ・制限設定
5. インフラ設定
- ドメイン・DNS設定
- Cloudflare Pages設定
- 分析・トラッキング設定
ブランド間の共通要素
統一項目
- サポート窓口: support@contents-print.jp
- 決済システム: Shopify統合
- 工場システム: 同一のElectron App
- 基本技術スタック: Next.js + Cloudflare
差別化項目
- デザイン・UI: ブランド個別
- 商品カタログ: ブランド特化
- 配送期間: サービス特性に応じて
- マーケティングメッセージ: ターゲット別
管理の利点
運営効率
- ✅ 統一インフラ: 共通システムでコスト削減
- ✅ 一元管理: サポート・決済の統合
- ✅ 拡張性: 新ブランド追加の容易さ
ユーザー体験
- ✅ 専門性: 各ブランドに特化した体験
- ✅ 一貫性: 品質・サポートレベルの統一
- ✅ 安心感: 統一サポート窓口による信頼性
開発効率
- ✅ コード共有: 共通機能の再利用
- ✅ 保守性: 変更時の影響範囲の明確化
- ✅ テスト: 共通テストスイートの活用