Skip to content
Last updated

Partner-initiated WABA and Sender Creation

Meta has deprecated the "On-Behalf-Of (OBO)" account ownership model and replaced it with partner-initiated WABA creation.

Partner-initiated creation:

  • Gives business customers the opportunity to review their account information and data access settings before their account is created.
  • Gives business customers direct ownership of their account, allowing them to use WhatsApp Manager for common actions like creating templates and viewing analytics.
  • Removes the requirement for ASP customers to provide clients with access to the Sinch Build Dashboard, or for clients to share their credentials with the ASP.

Partner-initiated WABA Creation Steps

The sub-sections below describe the steps required to create a WABA using the partner-initiated method:

1. Initiation Step

Partner-initiated WhatsApp Business Account (WABA) creation is initiated at Meta by Sinch.

This feature is currently available for business customers who are clients of our ASP customers (resellers).

Sinch requires the following data for the WABA creation request at Meta:

  • Client Business Manager ID (also called Business Portfolio ID): Business Portfolios can be created at https://business.facebook.com/ by the business customer. They can find their business ID using this Meta guide or they can copy the value for business_id search parameter from the URL.
  • WABA name
  • Sender data:
    • Display name for a sender to be created in the WABA.
    • Business category for the sender (see API reference for available categories).
  • Optional values:
    • Business Manager to be used on Sinch side.
    • Custom region and Meta local storage region values.
Note the following:
  • Sender creation during WABA creation is optional, but Meta requires sender data. The business customer decides in the Notify Customer and get Customer approval step if they want to use this data for creating a sender.
  • If the optional values are not provided, default region for the billing account country will be used.

The above data can be provided via Sinch Build Dashboard or the Provisioning API endpoint for creating account:

async function createAccount() {
  const resp = await fetch(
    `https://provisioning.api.sinch.com/v1/projects/${PROJECT_ID}/whatsapp`,
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        Authorization:
          'Basic ' +
          Buffer.from(ACCESS_KEY + ':' + ACCESS_SECRET).toString('base64'),
      },
      body: JSON.stringify({
        wabaName: 'End-user business name',
        clientBusinessManagerId: '73584377235956321',
        senderDetails: {
          displayName: 'Desired sender name',
          businessCategory: 'FOOD_AND_GROCERY',
        },
      }),
    }
  );

  const data = await resp.json();
  return data;
}
Note:

Requesting WABA creation is currently a manual process on Meta’s side and may take some time to complete. This means that while the response to the above request includes details about the newly created partner-initiated account, the WABA itself has not yet been initiated by Sinch on Meta’s end at that stage.

2. Get the Request ID

After the creation request is made by Sinch, the account enters into the PENDING_FACEBOOK_VERIFICATION state. In this state, the business customer needs to approve the WABA creation request on their end. To detect the account entering into this state, register a webhook with WhatsApp Account triggers or use the GET account endpoint.

When the partner-initiated account enters into the PENDING_FACEBOOK_VERIFICATION state, the field named partnerInitiatedRequestId is set by Sinch. This value can be used for the next step. It can be retrieved with the GET account endpoint:

async function getAccountData() {
  const resp = await fetch(
    `https://provisioning.api.sinch.com/v1/projects/${PROJECT_ID}/whatsapp`,
    {
      method: 'GET',
      headers: {
        Authorization:
          'Basic ' +
          Buffer.from(ACCESS_KEY + ':' + ACCESS_SECRET).toString('base64'),
      },
    }
  );

  const data = await resp.json();
  return [data.state, data.partnerInitiatedRequestId];
}

3. Notify Customer and get Customer approval

Notify the business customer that an action is needed on their end. The customer then needs to approve the WABA creation request at Meta.

The URL where the business customer can approve their WABA can be built as follows: https://business.facebook.com/latest/settings/requests?business_id=<clientBusinessManagerId>&selected_request_id=<partnerInitiatedRequestId>

Alternatively, the business client can follow Meta's official steps:

  1. Access Meta Business Suite at https://business.facebook.com.
  2. If you have multiple business portfolios, select the appropriate portfolio using the drop-down menu in the upper left section of the page.
  3. Navigate to the Settings > Requests > Other Requests panel and click the Received tab.
  4. Locate the invitation and review its contents (or decline the invitation).
  5. Add and verify a business phone number (optional).
  6. Confirm the invitation.
  7. Navigate to the Accounts > WhatsApp account panel and confirm that your WhatsApp Business Account has been created and shared with your Solution Partner.
Note:

The optional sender created by the business customer during the approval process can also be of type "Use a display name only". A phone number is not needed for that case; Meta will generate a virtual number for the business sender.

4. Meta approval

After Meta approves the WABA and the optional sender, Sinch shares the credit line with the business customer. The business can then start sending messages.

5. Sender Creation via Provisioning API

If no sender was created during WABA approval or additional senders are needed, they can be created using Provisioning API:

async function createSender() {
  const resp = await fetch(
    `https://provisioning.api.sinch.com/v1/projects/${PROJECT_ID}/whatsapp/senders`,
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        Authorization:
          'Basic ' +
          Buffer.from(ACCESS_KEY + ':' + ACCESS_SECRET).toString('base64'),
      },
      body: JSON.stringify({
        region: 'EU',
        metaLocalStorage: 'DE',
        phoneNumberProvider: 'CUSTOMER',
        details: {
          countryCode: '48',
          phoneNumber: '777777777',
          displayName: 'Test name',
          description: 'Test description',
          vertical: 'EDUCATION',
          email: 'test@test.com',
          address: 'Test address',
          websiteOne: 'https://example-1.com',
          about: 'Test about',
          photoUrl: 'https://example.com/photos/1.png',
        },
      }),
    }
  );
  const data = await resp.json();
  return data;
}

If region and metaLocalStorage are not provided, default values will be used.

A one-time password (OTP) for verifying client-provided phone numbers can be requested via /senders/:senderId/register, and the sender can be verified via /senders/:senderId/verify. Alternatively, the OTP verification can be done in Meta Business Suite by the business customer.