--- title: "Cross-Client Subscriptions" slug: "cross-client-subscriptions" updated: 2026-07-09T05:18:32Z published: 2026-07-09T05:18:32Z canonical: "help.frisbii.com/cross-client-subscriptions" --- > ## 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 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: ```json {    "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. ```php $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(); } ``` > [!NOTE] > 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 ```php // @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: ```json {    "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: ```php // @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: ```json {    // 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 - [useCrossClientVoucher](https://api.plenigo.com/#tag/Subscriptions/operation/useCrossClientVoucher) - [searchProductOffersShared](https://api.plenigo.com/api/v3.0/products/offers/shared) ---