🦒

[Next.js]HubSpot APIで会社に関連付けたコンタクトを作成する方法

2024/02/01に公開

1. associations APIを使う方法

ライブラリの公式Docに書いてある方法。

https://github.com/HubSpot/hubspot-api-nodejs?tab=readme-ov-file#example-create-contact-company-and-associate-created-objects

APIを2回リクエストする。

async createContact(
    companyId: string,
    contact: Partial<ContactData['properties']>
  ): Promise<any> {
    const res = await this.apiClient.crm.contacts.basicApi.create({
      properties: {
        ...contact,
      },
      associations: []
    })
    await this.apiClient.crm.associations.v4.basicApi.create(
      'companies',
      Number(companyId),
      'contacts',
      Number(res.id),
      [
        {
          associationCategory: 'HUBSPOT_DEFINED',
          associationTypeId: AssociationTypes.companyToContact,
        },
      ]
    )
    return res
  }

2. 外部キーフィールドを使う方法

APIのリクエストは1回で済むが、公式によるとread-onlyのプロパティのため、使うべきではない。

https://developers.hubspot.com/changelog/2019-01-24-update-the-associatedcompanyid-contact-property-will-become-read-only-on-april-26th

hubspot-api-nodejsでは一応期待通りレコードは作成された。

async createContact(
    companyId: string,
    contact: Partial<ContactData['properties']>
  ): Promise<any> {
    const res = await this.apiClient.crm.contacts.basicApi.create({
      properties: {
        ...contact,
        associatedcompanyid: companyId,
      },
      associations: []
    })
    return res
  }

3. associationsプロパティを使う方法

basicApi.createの型定義に合わせて、associationsを指定する。

この方法だとエラーになったので、動作するところまで確認できていない。

async createContact(
    companyId: string,
    contact: Partial<ContactData['properties']>
  ): Promise<any> {
    const res = await this.apiClient.crm.contacts.basicApi.create({
      properties: {
        ...contact,
      },
      associations: [
        {
          to: {
            id: companyId,
          },
          types: [
            {
              associationCategory: 'HUBSPOT_DEFINED',
              associationTypeId: AssociationTypes.companyToContact,
            },
          ],
        },
      ],
    })
    return res
  }

結論

1の方法が公式Doc通りなので、望ましそう。

Discussion