AI

OSSのプロダクトアナリティクス比較:PostHog vs Matomo vs Plausible でGA4代替をセルフホストする

オープンソースラボ編集部2026年6月14日

OSSのプロダクトアナリティクス比較:PostHog vs Matomo vs Plausible でGA4代替をセルフホストする

Google Analytics 4(無料〜)・Mixpanel(月$28〜)・Amplitude(月$49〜)に対して、PostHog(最も機能が豊富なOSSプロダクトアナリティクス)・Matomo(GA代替・GDPR完全対応)・Plausible(軽量・プライバシーファースト)はOSSのWeb/プロダクトアナリティクスツールです。

OSSアナリティクスを選ぶ理由

  • GDPR対応: データをEU圏外に出さずにセルフホストで完全コンプライアンス
  • Cookie不要: Plausible/PostHogはCookielessトラッキングでCookieバナー不要
  • データ所有: 収集したユーザー行動データを自社DBに保持
  • コスト: Amplitudeは月数万円〜、セルフホストならサーバー代のみ

主要ツールの概要

PostHog

2020年に公開されたPython/TypeScript製のOSSプロダクトアナリティクスプラットフォームです。GitHubスター25k+。ページビュー・イベントトラッキング・ファネル分析・セッション録画・機能フラグ・A/Bテスト・サーベイをオールインワンで提供します。ClickHouseをストレージに使って大規模データを高速処理。Amplitude・Mixpanel・LaunchDarklyの機能を1つに統合したOSS代替です。

# PostHog セルフホスト(Docker Compose・本番用)
git clone https://github.com/PostHog/posthog
cd posthog

# .envを設定
cat > .env << 'EOF'
SECRET_KEY=$(openssl rand -hex 32)
DATABASE_URL=postgresql://posthog:posthog@db:5432/posthog
REDIS_URL=redis://redis:6379/
ASYNC_EVENT_PROCESSING=true
IS_BEHIND_PROXY=true
SITE_URL=https://analytics.yourcompany.com
EOF

docker compose -f docker-compose.hobby.yml up -d

# WebUI: https://analytics.yourcompany.com
# デフォルトはポート80(nginxがリバースプロキシ)
// Next.js App RouterにPostHog SDKを統合
// lib/posthog.ts(サーバー側)
import { PostHog } from "posthog-node";

export const posthog = new PostHog(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
  host: process.env.NEXT_PUBLIC_POSTHOG_HOST,
  flushAt: 20,
  flushInterval: 10000,
});

// providers/posthog-provider.tsx(クライアント側)
"use client";
import posthog from "posthog-js";
import { PostHogProvider } from "posthog-js/react";
import { useEffect } from "react";

export function PHProvider({ children }: { children: React.ReactNode }) {
  useEffect(() => {
    posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
      api_host: process.env.NEXT_PUBLIC_POSTHOG_HOST,
      person_profiles: "identified_only",  // ログイン済みユーザーのみプロファイル作成
      capture_pageview: false,              // App Routerでは手動で送信
      capture_pageleave: true,
      loaded: (ph) => {
        if (process.env.NODE_ENV === "development") ph.debug();
      },
    });
  }, []);
  return <PostHogProvider client={posthog}>{children}</PostHogProvider>;
}

// app/layout.tsx
import { PHProvider } from "@/providers/posthog-provider";
export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        <PHProvider>{children}</PHProvider>
      </body>
    </html>
  );
}
// カスタムイベントの送信とユーザー識別
"use client";
import { usePostHog } from "posthog-js/react";

export function CheckoutButton({ product }) {
  const posthog = usePostHog();

  const handlePurchase = async () => {
    // 購入イベントをPostHogに送信
    posthog.capture("purchase_completed", {
      product_id: product.id,
      product_name: product.name,
      price: product.price,
      currency: "JPY",
      category: product.category,
    });
    await startCheckout(product);
  };

  return <button onClick={handlePurchase}>購入する(¥{product.price})</button>;
}

// ユーザーログイン後に識別
export function useIdentifyUser() {
  const posthog = usePostHog();
  const { data: session } = useSession();

  useEffect(() => {
    if (session?.user) {
      posthog.identify(session.user.id, {
        email: session.user.email,
        name: session.user.name,
        plan: session.user.plan,
        created_at: session.user.createdAt,
      });
    } else {
      posthog.reset();   // ログアウト時にIDをリセット
    }
  }, [session]);
}
# バックエンド(FastAPI)からPostHogにサーバーサイドイベントを送信
from posthog import Posthog

ph = Posthog(
    project_api_key="phc_xxxxxxxxxxxxxxxx",
    host="https://analytics.yourcompany.com",
)

# サーバーサイドイベント(決済完了・API呼び出し等)
def on_payment_success(user_id: str, order: dict):
    ph.capture(
        distinct_id=user_id,
        event="server_payment_success",
        properties={
            "order_id": order["id"],
            "amount": order["total"],
            "payment_method": order["payment_method"],
        },
    )

# グループアナリティクス(会社単位でイベントを集計)
def on_team_invite(user_id: str, team_id: str, team_name: str):
    ph.group_identify("company", team_id, {"name": team_name, "plan": "pro"})
    ph.capture(
        distinct_id=user_id,
        event="team_invite_sent",
        groups={"company": team_id},
    )

Plausible Analytics

2019年に公開されたElixir製のOSSウェブアナリティクスです。GitHubスター21k+。Cookie不要・軽量(<1KB)・GDPRにデフォルト準拠が特徴。ページビュー・ユニーク訪問者・バウンス率・滞在時間・参照元・デバイスをシンプルに可視化。Google Analyticsのような複雑な設定は不要でscript 1行追加するだけです。PostHogのような詳細なイベントトラッキングには向きませんが、マーケティング分析には十分です。

# Plausible セルフホスト(Docker Compose)
git clone https://github.com/plausible/community-edition
cd community-edition

cat > plausible-conf.env << 'EOF'
BASE_URL=https://stats.yourcompany.com
SECRET_KEY_BASE=$(openssl rand -base64 64 | tr -d '
')
EOF

docker compose up -d
# Plausible WebUI: https://stats.yourcompany.com
<!-- Plausibleのトラッキングスクリプト(1行で追加) -->
<!-- Cookie不要・GDPR準拠・軽量848バイト -->
<script
  defer
  data-domain="yourcompany.com"
  src="https://stats.yourcompany.com/js/script.js"
></script>

<!-- カスタムイベント(プロパティ付き) -->
<script>
  // 「購入ボタンクリック」イベントを送信
  document.getElementById("buy-button").addEventListener("click", function() {
    plausible("Purchase", {
      props: {
        plan: "pro",
        amount: 9800,
        source: "pricing-page",
      },
    });
  });
</script>

機能比較表

比較項目PostHogMatomoPlausible
セッション録画✅(有料プラグイン)
機能フラグ
A/Bテスト
Cookie不要✅(設定可)設定可✅(デフォルト)
スクリプトサイズ約40KB約20KB約1KB
ファネル分析限定的
GitHub Stars25k+20k+21k+

PostHogのA/Bテストと機能フラグの違いについてはDevOpsカテゴリ/categories/devopsのUnleash・GrowthBookと比較を参照してください。アナリティクスのイベントデータをリアルタイムでダッシュボード表示するにはDevOpsカテゴリ/categories/devopsのGrafana+ClickHouseと組み合わせてください。

FAQ

Q. PostHog・Matomo・PlausibleでどれをGA4の代替に選ぶべきですか?

A. 目的によって異なります。マーケティング分析(PV・流入元・コンバージョン): Plausible一択。設定が最も簡単でGDPR対応済み。プロダクト分析(ユーザー行動・ファネル・コホート): PostHog。Amplitudeの代替として機能が豊富。EC・既存GA環境の置き換え・Eコマーストラッキング: Matomo。既存のGAレポートとの互換性が高い。予算と規模感: 月100万PV以下ならPlausibleのセルフホストが最軽量(メモリ1GB以下で動く)。プロダクト分析が必要ならPostHogのClickHouseが重い(メモリ4GB以上推奨)。

Q. PostHogのセッション録画でプライバシーを保護するには?

A. PostHogのセッション録画はデフォルトで個人情報をマスクします。①HTMLのdata-ph-no-capture属性: 要素全体を録画から除外②CSS input要素のマスク: デフォルトでinput[type=password]はマスク③設定でマスク追加: posthog.init(..., { session_recording: { maskAllInputs: true } })でフォームの全テキスト入力をマスク④セレクターでマスク: maskTextSelector: ".credit-card, .personal-info"で特定クラスをマスク。金融・医療・個人情報を扱うサービスでは必ずマスク設定を確認してから有効化してください。

Q. PlausibleをNext.js App RouterでPageView自動計測するには?

A. Plausibleの公式Next.jsコンポーネントを使います。

npm install next-plausible
// app/layout.tsx
import PlausibleProvider from "next-plausible";

export default function RootLayout({ children }) {
  return (
    <html>
      <PlausibleProvider
        domain="yourcompany.com"
        customDomain="https://stats.yourcompany.com"
        selfHosted={true}
        trackOutboundLinks={true}
        taggedEvents={true}
      >
        <body>{children}</body>
      </PlausibleProvider>
    </html>
  );
}

// カスタムイベントの送信(型安全)
import { usePlausible } from "next-plausible";

type Events = {
  purchase: { plan: string; amount: number };
  signup: { source: string };
};

export function PricingButton({ plan, price }) {
  const plausible = usePlausible<Events>();
  return (
    <button onClick={() => plausible("purchase", { props: { plan, amount: price } })}>
      {plan}を購入(¥{price})
    </button>
  );
}

Q. PostHogの機能フラグとUnleash/GrowthBookの違いは何ですか?

A. PostHog: アナリティクスと機能フラグが統合されているため「このフラグをONにしたユーザーの購入率が15%向上した」という分析が直接できます。フラグの状態変化がアナリティクスイベントとして自動記録される。Unleash: 機能フラグ専門でアナリティクス統合はない。多言語SDK・エンタープライズ機能に強み。GrowthBook: A/Bテストの統計エンジンに特化。PostHogのA/Bテストより統計的厳密性が高い(ベイズ推定など)。すでにPostHogを入れているなら機能フラグもPostHogで統一する方が分析が楽。機能フラグの高度な制御(段階ロールアウト・複雑な条件)が必要ならUnleashを別途導入するのが一般的です。

まとめ

ユースケース推奨ツール
プロダクト分析・機能フラグ・セッション録画統合PostHog
GA4のGDPR準拠代替・EコマーストラッキングMatomo
マーケティングPV分析・軽量・Cookie不要Plausible

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。