Documentation Index

Fetch the complete documentation index at: https://help.frisbii.com/llms.txt

Use this file to discover all available pages before exploring further.

Cross-Client Subscriptions

Prev Next

Cross-company subscriptions allow two Frisbii Media companies to share a subscription. The master company sells and invoices the subscription. The client company receives a webhook and provisions access for the customer on its own platform.

A typical use case: a media group sells a bundle subscription centrally, and individual titles (each a separate Frisbii Media company) grant the customer access.


Setup

  1. In the Frisbii Media backend, create a cross-client connection between the master company and the client company

  2. In the master company's backend, configure a webhook URL pointing to the client company's endpoint

  3. The client company implements the webhook receiver described below


Webhook: receiving the cross-company order

When a customer purchases a cross-company subscription in the master company, Frisbii Media sends a webhook of type CROSS_CLIENT_ORDER to the client company's registered URL.

The payload looks like this:

{
    "entityType": "CROSS_CLIENT_ORDER",
    "callbackType": "CREATION",
    "entityId": "1235184",
    "entity": {
        "email": "jane.doe@example.com",
        "voucherCode": "YTQQ-B3Y4-MV2S"
    }
}

The client company needs two values from this payload: entity.email and entity.voucherCode.


Step 1 – Create or retrieve the customer

Look up the customer by email. If they do not exist yet in the client company, create them.

$email = $callbackPayload->entity->email;
// @see https://api.frisbii-media.com/#tag/Customers/operation/searchCustomers
$response = $client->request('GET', "customers?email={$email}", [
    'headers' => ['X-plenigo-token' => eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9],
]);
$customer = json_decode($response->getBody()->getContents())?->items[0] ?? null;
if (empty($customer)) {
    // @see https://api.frisbii-media.com/#tag/Customers/operation/createCustomer
    $response = $client->request('POST', '/customers', [
        'headers' => ['X-plenigo-token' => eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9],
        'json'    => [
            'email'           => $email,
            'language'        => 'de',
            'sendWelcomeMail' => true, // sends login instructions to the customer (requires mail template)
        ],
    ]);
    $customer = json_decode($response->getBody()->getContents()) ?: new stdClass();
}

If you are using an external SSO system, create the customer in your SSO first, then create them in Frisbii Media as shown above.


Step 2 – Redeem the voucher code to create the subscription

// @see https://api.frisbii-media.com/#tag/Subscriptions/operation/useCrossClientVoucher
$response = $client->request('POST', '/subscriptions/useCrossClientVoucher', [
    'headers' => ['X-plenigo-token' => eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9],
    'json'    => [
        'customerId'  => $customer->customerId,
        'voucherCode' => $callbackPayload->entity->voucherCode,
    ],
]);
$success = (json_decode($response->getBody()->getContents()) ?: new stdClass())?->success;

After this call, the customer has an active subscription in the client company and the corresponding access rights.


Understanding a cross-company subscription object

When you retrieve the subscription from the client company side, you will see these additional fields compared to a regular subscription:

{
    "plenigoOfferId": "C_2UP0WMNHH2X156JXDX",
    "subscriptionType": "CROSS_COMPANY_TIME_BASED",
    "connectedOffer": true,
    "connectedOfferInfo": {
        "companyId": "MX8IXMTBBO2UKO37W65X",
        "contractCompanyId": "L_YMCGIJHIHM5UWFEW2NN",
        "customerId": "124913",
        "plenigoOfferId": "O_2UP0WMNHH2X156JXXX"
    }
}

The connectedOfferInfo points back to the master company's offer and customer record.


Retrieving shared offer information

To get additional product details (e.g. tags, cost centre) for the shared offer from the master company:

// @see https://api.frisbii-media.com/api/v3.0/products/offers/shared
$response = $client->request('GET', '/products/offers/shared', [
    'headers' => ['X-plenigo-token' => eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9],
]);
$sharedOffers = json_decode($response->getBody()->getContents()) ?: new stdClass();

The response groups shared offers by the originating company:

{
    // https://api.frisbii-media.com/api/v3.0/products/offers/shared
    "items": [
        {
            "companyName": "Target Company",
            "companyId": "MX8IXMTBBO2UKO37W65X",
            "offers": [
                {
                    "createdDate": "2025-05-05T17:04:23.969637Z",
                    "createdBy": "10002",
                    "createdByType": "MERCHANT",
                    "changedDate": "2025-07-15T06:31:39.209252Z",
                    "changedBy": "10010",
                    "changedByType": "MERCHANT",
                    "offerId": 100081,
                    "plenigoOfferId": "O_2UP0WMNHH2X156JXXX",
                    ...
                }
            ]
        }
    ]
}

API reference