## 概要
ASPに計上される成果データを、Google広告・Yahoo!広告・Meta広告・Microsoft広告などへ
オフラインコンバージョンとして自動連携するSaaSです(利用者800名超)。
立ち上げ時からシステム担当として参画し、5年半以上継続しています。
## 体制と役割
- 事業側1名・技術側1名の2名体制で、技術側を単独で担当
- 事業側とプロダクト構想・開発の優先度をすり合わせ、仕様・工数・技術的な制約を説明したうえで合意する進め方を継続
- 要件定義から設計・実装・テスト・リリース・運用保守までの全工程を担当
- リポジトリ全5,788コミットのうち5,358コミット(92.6%)を担当
## 主な機能
- 100社超のASPとの成果データ連携(CSV取込・ポイントバック)
- Google Ads API v17.0/Yahoo!広告/Meta広告/Microsoft広告/TikTok広告 へのオフラインコンバージョン送信
- GMOペイメントゲートウェイと連携したポイント制課金(従量課金・繰越・有効期限管理・自動更新)
- A/Bテスト基盤(配信パターンの比較検証、表示数・クリック数・CTRのレポート)
- AWS(Lightsail/RDS/S3)による本番環境の構築・運用、本番サーバーの移行(PHP 7.4→8.3、Ubuntu+Nginx+PHP-FPM)
## 取り組んだ課題と判断
### ASPごとに異なるデータ仕様
ASPごとに、CSVの列の位置や列名、文字コード、税込・税抜の扱い、読み飛ばす行、
ポイントバックで受け取るパラメータ名などがすべて異なります。
ASPごとに個別のコードを書くと、連携先が増えるたびに改修が必要になるため、
これらの差分をコードではなく、設定テーブルのデータとして持たせる設計にしました。
ASP1社ごとに30項目を超える設定で取込・ポイントバックの挙動を切り替えられるため、
新しいASPの追加や仕様変更の多くを、コードを変えずに設定の変更で吸収できます。
一方、広告媒体ごとに異なるAPIの仕様そのものは、データでは吸収できないため、媒体ごとのサービスクラスに分け、パラメータの受け渡し方式が同じ媒体は共通のインターフェースでまとめています。1媒体の仕様変更が、他の連携先に波及しない構成です。
### レガシーPHPからLaravelへの移行
既存システムは自分の開発経験が浅い時期に書いたコードで、構造が整理されておらず、
自動テストもありませんでした。保守性と安全性を高めるため、Laravelへの移行を決めました。
一括で作り直す案は、移行に膨大な時間がかかるうえ、不具合が出た際に原因箇所を
特定しづらくなるため採用せず、モジュール単位の段階移行を選択しました。
移行済みのモジュールはアーカイブとして管理し、新旧を並行稼働させながら、
サービスを止めずに置き換えています。
移行後は2022年6月からPHPUnitでテストを整備し、Featureテスト167件・ユニットテスト17件(媒体ごとの連携処理など)を書いています。テストファイルの約9割は自分で作成しました。
### ジャンルの異なるサービスへのピボット
事業の主軸が、ポップアップ配信ツールから広告成果連携ツールへと大きく変わりました。
ジャンルがまったく異なるため、旧サービスと新サービスは、フロントエンド・バックエンドともに
別系統(Tools01/Tools02)として分離して運用し、両者に共通する部分だけを
上位の階層に切り出して共通化しました。決済の仕組みは大部分をそのまま流用し、
新サービスの立ち上げにかかる工数を抑えています。
### ポイント制課金の設計
ポイントの増減と残高(ストック)をDB上でどう持つかを設計の中心に置き、
繰越・有効期限・自動更新まで含めて整合が取れるテーブル構造を設計しました。
### 本番サーバーの移行(PHP 7.4 → PHP 8.3)
本番サーバーはセキュリティ更新が終了したPHP 7.4で動いており、さらにBitnamiのLAMP環境だったため、その上でPHPだけを上げるのは難しい状況でした。
そこで、稼働中のサーバーを直接更新する案は採らず、Ubuntu+Nginx+PHP-FPMの新しい環境を別に構築し、静的IPの付け替えで切り替えるBlue/Green方式を選びました。
問題が起きても静的IPを戻すだけで元に戻せ、サービスが止まる時間も付け替えの数十秒で済むためです。
- スペックは、2週間の負荷を実測したうえで、旧環境の半分に見直しました
- PHPStanで全コードを検査し、PHP 8での非互換が0件であることを確認しました(見つかった既存のバグは別タスクに分離)
- 静的解析では見つからない問題として、PHP 8でDBの数値の返し方が変わり、画面側の比較処理が一致しなくなる不具合を実機で発見・修正しました
- 本番と同じ手順で本番機を作る予行演習を行い、当夜の作業を差分の同期と設定の差し替えだけにしました
- ロールバックの手順も用意したうえで深夜に切り替え、ユーザーのログイン状態も引き継ぎました
## 実績
- ASPからの成果データ取込:180日間で802,540件
- Google広告へのオフラインコンバージョンAPI送信:約4か月間で15,625,595件
- 本番サーバーの移行(2026年9月):停止は静的IPの付け替えの数十秒のみ。ロールバックすることなく切替に成功