🌊

HubspotとLaravel連携

2022/09/07に公開

目的

アップデートのお知らせとかメンテナンスのお知らせとか、システムから直接通知飛ばした方が良いケースもあれば、CRMの方に連絡先共有して、CRM上で適宜連絡するケースが良い場合もある。
今回のケースにおいては、定期的に現在アクティブなユーザーリストをピックしてHubsportのコンタクトリストを作成するために連携する。

環境

HubspotのApiはv3が最新なのでそちらを使いたいが、いくつかのリソースは未対応なのでレガシーVerを使う。
最新Ver(一部リソース未対応)
https://github.com/HubSpot/hubspot-api-php
レガシー
https://github.com/HubSpot/hubspot-php

laravel9
php8.1

auth tokenの取得

  • Hubspotのアカウントにログインして設定ページへ移動
  • サイドメニューの非公開アプリを選択して、作成
  • oAuth2 tokenが発行できるのでコピー
    • アプリの権限も決められるので適宜設定
    • 今回はリスト作れればいいのでリストとコンタクトのRead/Writeつける。

package install

 composer require "hubspot/hubspot-php"

command書く

ExportEmails.php

public function handle(UserRepository $userRepository)
    {
        $token = config('app.hubspot_token');
        if (! $token) {
            echo 'Hubspot token is not provided. process skipped.'.PHP_EOL;

            return 0;
        }
        $hubspot = Factory::createWithOAuth2Token($token);
        $contact_chunks = $userRepository->getUsers()->map(function ($user) {
            return ['email' => $user->email, 'properties' => [['property' => 'firstname', 'value' => $user->name]]];
        })->chunk(1000);
        $contact_chunks->map(function ($contacts) use ($hubspot) {
            $hubspot->contacts()->createOrUpdateBatch($contacts->toArray());
        });
        $list_name = (new Carbon())->format('Y-m-d H:i:s');
        $list = $hubspot->contactLists()->create(['name' => $list_name]);
        $list_id = $list->getData()->listId;
        $email_chunks = $contact_chunks->flatten(1)->pluck('email')->chunk(500);
        $email_chunks->map(function ($emails) use ($hubspot, $list_id) {
            $hubspot->contactLists()->addContact($list_id, [], $emails->toArray());
        });

        return 1;
    }    

update_or_create batch
https://legacydocs.hubspot.com/docs/methods/contacts/batch_create_or_update
いちいち存在確認しなくてもbatch upsert的なこと可能。上限あり(Max:1000件 per request)

create contacts list
https://legacydocs.hubspot.com/docs/methods/lists/create_list

add contacts to list
https://legacydocs.hubspot.com/docs/methods/lists/add_contact_to_list
emailでもidでも追加可能。それぞれ上限あり。(Max:500 emails/ids per request)

ちなみに、listにメールアドレスだけ詰め込めるかなと思ったらコンタクトがあること前提になるので、コンタクトのUpsert経てからリストに追加するような処理にしました。

スケジューリング

頻度に応じてで良いかと思いますが、Kernel.phpに追記

$schedule->command('export:userEmails')->everyFifteenMinutes()->environments('production')->onOneServer();

Discussion