# Custom SKU revenue share

Set a per-product revenue share in the Publisher Dashboard, then include skuId on a transaction.

A product rate sets the revenue share a member receives on one specific product, separate from your Creator Program's default. You set it in the Publisher Dashboard, then include that product on a transaction with the `skuId` property.

<Aside type="note">
The dashboard calls these **product rates**, under **Revenue Shares**. The API still calls the identifier `skuId`, and the dashboard field is labelled "Product SKU ID", so the two line up: the product you add here is the `skuId` you send.
</Aside>

## Set a product rate

Open [Revenue Shares](https://www.nexus.gg/publisher/dashboard/program/commissions/product-rates) in the Publisher Dashboard and choose the **Product rates** tab. The table lists every product that has its own rate.

<ThemedImage light={productRatesLight} dark={productRatesDark} alt="The Product rates tab listing three products with their revenue share percentages." />

Select **Add product rate** to add one, or the edit action on a row to change one. Enter the product identifier as it appears in your sales data, then set the base rate. You can add rates for specific platforms, tiers, and creators on top of that base.

<ThemedImage light={addRateLight} dark={addRateDark} alt="The Add product rate panel with a product SKU ID, a priority toggle, and a base rate." />

**Prioritize this product's rate** decides how the product rate meets everything else:

* **Off.** The creator earns the higher of the product rate and their normal rate.
* **On.** The product rate replaces the group, tier, and member defaults, **even when it is lower**.

## Schedule a temporary rate

The **Scheduled rates** tab holds two kinds of temporary change, and they are not the same thing:

* **Group windows.** A temporary rate across every sale for a window. It reverts automatically when the window ends.
* **Per-product promos.** A temporary rate on specific products for a window. One promo can cover several products and lifts their rate while it is live.

<ThemedImage light={scheduledLight} dark={scheduledDark} alt="The Scheduled rates tab showing a group window table and the per-product promos section." />

Several schedules can be active at once. Where more than one covers the same product at the same time, Nexus uses the highest revenue share. The same logic applies to tier-specific and creator-specific values.

A product you create while scheduling a promo joins your program with no permanent rate of its own. When the promo ends, transactions for that product fall back to your Creator Program's default until you give it one.

## Send the product on a transaction

Once a product has a rate, include the `skuId` property when [attributing a transaction to a member](/creator-code-api/attributions/making-your-first-requests/#attribute-a-transaction-to-a-member).

<ApiMethod method="POST" path="/attributions/transactions" />
<LinkCard title="View full reference" description="Parameters, responses, and status codes." href="/api/operations/creatorattribution/" />

Here's how you call that with `curl`. The important part here is the `"skuId": "DiXZPiBjJjcUkAvan6yHc"`, with that id being a product you have given a rate in the Publisher Dashboard.

```bash
curl -X 'POST' \
  'https://api.nexus.gg/v1/attributions/transactions' \
  -H 'accept: */*' \
  -H 'Content-Type: application/json' \
  -H 'X-SHARED-SECRET: nexus_sk_your_key_here' \
  -d '{
  "playerName": "dustywusty",
  "memberId": "9jd7RBR_B2BZ0uWO3_lgv",
  "currency": "USD",
  "description": "1000 gems",
  "platform": "PC",
  "status": "Normal",
  "subtotal": 999,
  "transactionId": "d290f1ee-6c54-4b01-90e6-d701748f0851",
  "transactionDate": "2017-07-21T17:32:28Z",
  "skuId": "DiXZPiBjJjcUkAvan6yHc",
  "metrics": {
    "joinDate": "2017-07-22T17:32:28.000Z",
    "conversion": {
      "lastPurchaseDate": "2023-12-14T07:57:18.000Z",
      "totalSpendToDate": {
        "total": 129.99,
        "currency": "USD"
      }
    }
  }
  }'

```

The status should be `200` with a JSON response body that looks something like this:

```json
{
    "transaction": {
        "currency": "USD",
        "description": "1000 gems",
        "id": "BqtOoyoIHEq39i3uph_nO",
        "platform": "PC",
        "subtotal": 999,
        "transactionDate": "2017-07-21T17:32:28Z",
        "transactionId": "d290f1ee-6c54-4b01-90e6-d701748f0851",
        "transactionStatus": "Normal",
        "memberId": "9jd7RBR_B2BZ0uWO3_lgv",
        "skuId": "DiXZPiBjJjcUkAvan6yHc",
        "metrics": {
            "joinDate": "2017-07-22T17:32:28.000Z",
            "conversion": {
                "lastPurchaseDate": "2023-12-14T07:57:18.000Z",
                "totalSpendToDate": {
                    "total": 129.99,
                    "currency": "USD"
                }
            }
        }    
    }
}
```

## How revenue shares are calculated

By default Nexus uses the highest rate that applies to a transaction. Any of these can apply at once:

* your Creator Program's base revenue share
* the rate set for that specific product, and any scheduled promo covering it
* a [Group Tier](/creator-code-api/program-management/group-tiers/) the attributed member belongs to
* an active [Scheduled Temporary Revenue Share](/creator-code-api/program-management/scheduling-temporary-revenue-shares/)

For example, your Creator Program default is 15% and a product carries a 20% rate. If an active scheduled revenue share raises the group default to 25%, transactions for that product earn 25% instead of the 20% base while that schedule runs.

So a product rate set below your Creator Program's default normally never applies: the higher rate wins.

**Prioritize this product's rate** is the exception. Turn it on for a product and that product's rate replaces the group, tier, and member defaults, even when it is lower. Use it when a product genuinely needs to pay less than everything else, and expect it to override a rate the creator would otherwise have earned.

It should also be noted that when [Overriding A Member Revenue Share](/creator-code-api/attributions/making-your-first-requests/#overriding-member-revenue-share), the override value is always used regardless of any other factor.
