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
In the Frisbii Media backend, create a cross-client connection between the master company and the client company
In the master company's backend, configure a webhook URL pointing to the client company's endpoint
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",
...
}
]
}
]
}