You can tag any transaction in a transaction portfolio with a value for one or more of the sub-holding keys (SHKs) registered with that portfolio. Tags are retained throughout the investment lifecycle and workflow.

By default, LUSID reports holdings for a portfolio at the instrument level, so all transactions impacting an underlying instrument such as BP contribute to a calculation of your current position (quantity and cost) in a single BP holding. Consider the following set of transactions upserted to a portfolio:

DateInstrumentTransaction TypeQuantity
20 May 2023BPBuy100
21 May 2023BPBuy150
22 May 2023BPBuy50
23 May 2023BPSell50

When you generate a holdings report after 23 May, LUSID calculates you have a single holding of 250 BP shares.

You could instead tag the same set of transactions with distinct values for an SHK representing investment strategies, for example:

DateInstrumentTransaction TypeQuantityStrategy
20 May 2023BPBuy100Growth
21 May 2023BPBuy150Income
22 May 2023BPBuy50Growth
23 May 2023BPSell50Income

This time, LUSID calculates you have two separate BP holdings, one in a Growth strategy with 150 shares and one in an Income strategy with 100 shares. For an in-depth demonstration, work through this tutorial on setting up a strategy-based transaction portfolio.

Under-the-hood, an SHK is a custom property. To tag a transaction, you must first set up the SHK, which means creating an underlying property type and registering it with the portfolio.

Then, you can add the SHK property and an appropriate value to a transaction:

  • When you create that transaction using the BatchUpsertTransactions API. See an example.
  • Subsequently by updating transaction properties using the UpsertTransactionProperties API, for example for Txn-0000001:
    curl -X POST 'https://<your-domain>'
      -H 'Content-Type: application/json-patch+json'
      -H 'Authorization: Bearer <your-API-access-token>'
      -d '{
      "Transaction/SHKs/Strategy": {
        "key": "Transaction/SHKs/Strategy",
        "value": {
          "labelValue": "Growth"

    Note: Do not use BatchUpsertTransactions to update an existing transaction's properties, since any properties omitted from the API request are deleted rather than augmented.