Open APIs

 View Only
Expand all | Collapse all

TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

  • 1.  TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Oct 19, 2023 10:05

    I am looking at the version 5 TMF620 and pleased to find the 'Selection Group' problem has been solved.

    However I am struggling with some of the options given for definitions.

    I believe I understand the basic premise, e.g. if my "Consumer Broadband" consists of 

    ProductOffering: Consumer Broadband (isBundle=true)

        BundledGroupProductOfferingOption

            1: { name=Routers , numberRelOfferLowerLimit=1, numberRelOfferUpperLimit=1, productOffering: [ ... some routers .. ] }

            2: { name=Gifts , numberRelOfferLowerLimit=0, numberRelOfferUpperLimit=1,, productOffering: [ ... some gifts.. ] }

    I can see how things like Speed can go in here, though at some point you are looking at it really being a different Offering altogether (if the customer ends up with a different item, for a different price, is it really the same thing? But that's down to the data going in.

    This is extremely close to something we implemented internally, albeit with different key names. Migrating should be straightforward.

    However, in JSON Examples in TMF620 document, on page 62, the bundledGroupProductOfferingOption array attribute is directly beneath productOffering

    But in the swaggerfile itself, the productOffering has bundledGroupProductOffering (with a name) which in turn has bundledGroupProductOfferingOption (an object with the lower, upper and array of the Offerings actually in the group).

    In situations like this, which is definitive?

    Second, what I think is my more conceptual misunderstanding, is the purpose of "bundledProductOffering" - which features in many places, but is left empty in all the JSON examples. 

    I assume the 'top level' bundledProductOffering is for when the offering is an older (pre v5) style bundle whereby the ProductOffering consists of multiple things stuck together. This is of less interest to implement for us as most 'bundles' will have some degree of flex.

    Where I get completely lost is the attribute bundledProductOffering within bundledGroupProductOffering - is there a documented use cases envisaged for this, or is it just residue from subclassing? 

    What does it mean to populate bundledGroupProductOffering.bundledProductOffering and not just bundledProductOffering directly? Have others used this for a specific case?

    The description "Child offerings, from which instances can be created as direct or hierarchically indirect children of the parent offering." is not leaving me any wiser.



    ------------------------------
    Andrew Torrance
    Cerillion Technologies Limited
    ------------------------------


  • 2.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Oct 20, 2023 11:06

    Hi Andrew,

    let me try to explain:

    You are right, the JSON example is incorrect, the bundledGroupProductOfferingOption is not directly an attribute of the ProductOffering; as in the OAS file and the diagram, the ProductOffering has an array of BundledGroupProductOfferings. Such a Group is a collection of BundledProductOfferings, and it can have a Option that defines how many instances of the BundledProdictOfferings you may choose in total. On the individual BundledProductOfferings contained in the group, you can also have an Option that defines how many instances you can have from that offering. And to make it even more flexible, you can have a tree structure of Groups, with Options on all levels, so that you can build very complex options for selection.

    Putting the "Routers" and "Gifts" in the same Group as in your example would mean that the customer can choose between them, and get exactly one Router and optionally (up to) one Gift; but for that you would not need the Group, just attach the BundledProductOffering directly to the Top-Level productOffering, with corresponding BundledProductOfferingOptions. But you if want to let your customer choose between two different types of Gifts, and he can have zero to two in total, but only one of Type A and up to two of Type B, you can express that by setting up:

    ProductOffering: Consumer Broadband (isBundle=true)
         bundledProductOffering [  1: { name=Router, bundledProductOfferingOption { numberRelOfferLowerLimit=1, numberRelOfferUpperLimit=1 }  ]  // you get exactly 1 Router
         bundledGroupProductOffering [   // you can choose ...
         1: {
                 name=Gifts,
                 bundledGroupProductOfferingOption { numberRelOfferLowerLimit=0, numberRelOfferUpperLimit=2 },   // between 0 and 2 in total
                 bundledProductOffering [
                     { name=GiftTypeA, bundledProductOfferingOption { numberRelOfferLowerLimit=0, numberRelOfferUpperLimit=1 },  // one may be of type A
                     { name=GiftTypeB, bundledProductOfferingOption { numberRelOfferLowerLimit=0, numberRelOfferUpperLimit=2 },  // up to 2 may be of type B
                ]
         ]

    And yes, also having an array of BundledProductOfferings is for backward compatibility, and can still be used for the simpler cases where you do not need the complexity of the Group.

    Does this make sense to you?



    ------------------------------
    Lutz Bettge
    Deutsche Telekom AG
    ------------------------------



  • 3.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Oct 20, 2023 11:44

    Lutz, thank you for confirming

    I think I follow this example so long as Router, GiftTypeA and GiftTypeB represent actual gifts Product Offerings rather than another collection of things (so if there were up to 10 different prizes available, this would be an array of length 10)

    e.g. If there were 2 models of Router and the customer had to make a choice, that would be within a bundledGroupProductOffering , right?

    (If the Router was something the customer didn't have an active say in at all, i suppose it wouldn't be a Product at all but some linked Resource)

    So in summary

    bundledProductOffering = array of ProductOffering that are always included

    bundledProductOffering[0] = the first Product that's bundled (i.e. customer forced to have it)

    bundledGroupProductOffering = array of groups

    bundledGroupProductOffering[0].bundledGroupProductOfferingOption = Definition of how many things from the group I'm allowed

    bundledGroupProductOffering[0].bundledProductOffering[0] = Definition of how many instances of that thing I'm allowed within the group (for optional services rather than physical gifts this will usually be 0/1 as it only makes sense to have HBO or Voicemail once per bundle)

    .. and a mandatory item could be represented inside bundledProductOffering[] or inside bundledGroupProductOffering[x].bundledProductOffering[y] with LowerLimit=1.

    Thanks again!



    ------------------------------
    Andrew Torrance
    Cerillion Technologies Limited
    ------------------------------



  • 4.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Oct 23, 2023 12:02
    Edited by Matthieu Hattab Oct 24, 2023 08:34

    @Andrew Torrance

    You wrote:

    bundledProductOffering = array of ProductOffering that are always included

    bundledProductOffering[0] = the first Product that's bundled (i.e. customer forced to have it)

    As far as I understand English (I'm not a native speaker), there is no difference between these phrases:

    • "always included"
    • "first product" / "forced to have it"

    A bundle PO can have manybundledProductOffering but each bundledProductOfferingrepresents a single product offering (PO)available in the bundle PO.

    The only thing you can do is to define how many instances of a bundled PO can be procured in the bundle. This is achieved using these attributes controlling the cardinality of bundled PO:

    • numberRelOfferLowerLimit
    • numberRelOfferUpperLimit

    Do you see another meaning or do you see another functionality?

    @Lutz Bettge

    you've created the new functionality of BGPO, does this make sense:

    business wants this:

    And this is my current understanding on how it is modelled in V5:

    is this correct?



    ------------------------------
    Kind regards,

    Matthieu Hattab
    Lyse Platform
    ------------------------------



  • 5.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Oct 23, 2023 13:04

    @Matthieu Hattab

    Thanks for your comments and the diagram - I agree something that takes a real business offer and represents how that turns into the real objects would be invaluable.

    I think you may have misread part of my remarks. In my summary I am referring to elements as they would appear in the finished JSON. I believe you are referring to class names (but changing the case). Just talking about the classes introduces ambiguity as I am asking about different uses of the same class.

    The top level element bundledProductOffering is an array. If it is supposed to be a single item, there is a fairly important error with the OAS spec!

    The elements within that array are objects of class BundledProductOffering. I think this is what you're referring to when you say bundledProductOffering(sic) is a single offer. The case unfortunately matters. 

    As far as I know, there is no concept of "first product", "always included" and "forced to have it"

    In my comment  bundledProductOffering[0] just means the first element of that array (which is an object of type BundledProductOffering). I was appealing to JSONPath, but forgot to prefix everything with '$.'. I agree the ordering of this is arbitrary, I just wanted a way to be extra-clear I was talking about an element of the array and not the whole array.

    "Always Included" or less formally "forced to have it" would be an item where Lower Limit is greater than zero. 

    I agree that bundledProductOffering[x].bundledProductOfferingOption.numberRelOfferLowerLimit (and UpperLimit)  could be used to express selection rules providing they relate to cardinalities of the individual offers only and there is no grouping.

    For most Telecoms-adjacent Services most of the time that's going to be lower=upper=1 , or lower=0&upper=1. 

    The Groups are what provides the true selection capability, especially if the thing you're trying to model is picking a bunch of things for a fixed price (e.g. select 10 basic TV channels and 3 premium ones; or select exactly 1 router from a choice of models). 

    I note your queries about the diagram are addressed to @Lutz Bettge - I'll add my €0.02.

    The lines on the diagram appear to be the correct ERD but as a representation of a concrete example, seeing lines from the TV Box to both the top-level bundle and the Group is confusing.

    In the JSON representation (going from Lutz's earlier correction to my example) , I think in this case the TV boxes would be within a bundledGroupProductOffering only (whereas the 5G Gateway would be at the top-level bundledProductOffering) - so it would be helpful for diagram to make this obvious. As seeing the generic 'possible' relations in the same arrow style as the concrete relations in this case makes it harder to follow for those of us who don't already have the correct answer.

    This is especially important when the same classes are being re-used.

    FInally, Thank you for highlighting numberRelOfferDefault - I had missed that when going through!

    Thanks

    Andrew



    ------------------------------
    Andrew Torrance
    Cerillion Technologies Limited
    ------------------------------



  • 6.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Oct 24, 2023 08:30

    Hi Andrew,
    I quoted Lutz Bettge because he participated to the elaboration of bundledGroup functionality and hopefully can help.

    The lines on the diagram appear to be the correct ERD but as a representation of a concrete example, seeing lines from the TV Box to both the top-level bundle and the Group is confusing.

    You are probably right. The relationships with the bundledGroupProductoffering (BGPO) should be enough. I updated the diagram. 

    @Jonathan Goldberg could confirm this.

    The Groups are what provides the true selection capability, especially if the thing you're trying to model is picking a bunch of things for a fixed price (e.g. select 10 basic TV channels and 3 premium ones; or select exactly 1 router from a choice of models). 

    I'll send you a private message on the topic of pricing in bundled group.



    ------------------------------
    Kind regards,

    Matthieu Hattab
    Lyse Platform
    ------------------------------



  • 7.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    Posted Sep 23, 2025 04:35

    @Matthieu Hattab

    Can we include pricing in a bundled group like @Matthieu Hattab mentioned in his BGPO diagram?



    ------------------------------
    Abhishek Palla
    TO BE VERIFIED
    ------------------------------



  • 8.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Sep 23, 2025 08:11

    @- Abhisekh Jaiswal,

    bundled group has only one purpose: create rules to "Pick N of M from this set" with group-level cardinality (and optional default).

    pricing is done at the Product Offering level. IF you have complex pricing, you can use a policyRef.



    ------------------------------
    Kind regards,

    Matthieu Hattab
    Digital Sales Domain Architect
    Lyse Tele AS
    ------------------------------



  • 9.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Apr 23, 2025 23:25

    Why is this the case "The top level element bundledProductOffering is an array. If it is supposed to be a single item, there is a fairly important error with the OAS spec"?



    ------------------------------
    Srinivasa Vellanki
    Jio Platforms Limited
    Any opinions and statements made by me on this forum are purely personal, and do not necessarily reflect the position of my employer or TM Forum.
    ------------------------------



  • 10.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Apr 24, 2025 03:10

    Each of the elements of the array is a (refers to a) single offering, and the corresponding option states how many of these things you can select. The individual array elements are not interrelated in any way, there is no lower/upper limit of the total of things you can take.

    If in the example there was only one Set-Top-Box, e.g. the Android one, still with its option {default=1, lowerLimit=0, upperLimit=3}, you could also model it as a bundledProductOffering (with the same option), and then the customer can choose (as before) between 1 and 1 HomeGateways, and between 0 and 3 Android Boxes.

    So this is definitely not an error in the OAS.



    ------------------------------
    Lutz Bettge
    Deutsche Telekom AG
    ------------------------------



  • 11.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Apr 24, 2025 03:44

    Thank you @Lutz Bettge, this helps. New to this functional area, we will need multiple so was checking.



    ------------------------------
    Srinivasa Vellanki
    Jio Platforms Limited
    Any opinions and statements made by me on this forum are purely personal, and do not necessarily reflect the position of my employer or TM Forum.
    ------------------------------



  • 12.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Oct 24, 2023 10:09

    @Matthieu: Sorry for the late response; yes, this is exactly how it is meant to be used!



    ------------------------------
    Lutz Bettge
    Deutsche Telekom AG
    ------------------------------



  • 13.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Sep 23, 2025 09:41
    Edited by Matthieu Hattab Sep 30, 2025 03:24

    It's a good thing that this old discussion surfaces again. After playing a lot with the 620 and 760 APIs lately and had some conversations the author of the 760 API, I came to these recommendations and clarifications

    1. Gaps between  620 and 760 API in how they construct bundledProductOffering

    • in 760 API, bundled offers cannot exist without a group.
    • in 620 API, bundled offers can exist without a group.

    You should not force bundle PO to exist in a group. Group are meant to solve a specific problem: "Pick N of M from this set". If you don't have such a business requirement, you should be forced to use a product group.

    This, unfortunately, means 760 has to manage synthetic product groups for offers that are not defined in a product group in 620.

    2. bundledGroupProductOfferingOption vs  bundledProductOffering[*] 

    They are not competing with each other. Both must be used in TMF620 because they serve different purposes:

    • bundledGroupProductOfferingOption[*] → solves one commercial capability: "Pick N of M from this set" with group-level cardinality (and optional default, i.e. Pick up to 3 Channel Packages of ouf these 10 channel Packages from the "Sport Channel package" product group). 

    • bundledProductOffering[*] → is the authoritative child list, (= BOM, i.e. bill of material) where each child has its own bundledProductOfferingOption with per-child cardinalities and defaults (numberRelOfferLowerLimit, numberRelOfferUpperLimit, numberRelOfferDefault which are more relevant that per group cardinalities.


    ------------------------------
    Kind regards,

    Matthieu Hattab
    Digital Sales Domain Architect
    Lyse Tele AS
    ------------------------------



  • 14.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Sep 29, 2025 09:46

    Hi all,

    1. Gaps between  620 and 760 API in how they construct bundledProductOffering

    • in 760 API, bundled offers cannot exist without a group.
    • in 620 API, bundled offers can exist without a group.

    I personally disagree with TMF760 approach, you should not force bundled PO to exist in a group. Group are meant to solve a specific problem: "Pick N of M from this set". If you don't have such a business requirement, you should be forced to use a product group.

    This, unfortunately, means 760 has to manage synthetic product groups for offers that are not defined in a product group in 620.

    You can compose bundled offerings without groups in TMF760. ProductConfiguration is comprised of ProductConfiguration(s) and each configuration points at ProductOffering. ProductOfferingRef is discriminated as ProductOffering or BundledProductOffering (through polymorphism/discriminator introduced with OAS3).

    BundledGroupProductOffering is indeed used to model the case when you need to pick N of M budnled offerings from a group.

    And to limit cardinality of individual bundled offerings within a bundle offering, use BundledProductOfferingOption(min/max/defaultnumberofbundledofferings).

    Hope this helps.



    ------------------------------
    Bostjan Keber
    Marand, software ltd
    ------------------------------



  • 15.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Sep 30, 2025 05:41

    @Bostjan Keber

    your approach for bundles is what I call the H2: Containment via nested ProductConfiguration[]

    I see 2 other patterns for bundles:

    • H1: Containment via nested queryProductConfigurationItem[]
    • F1: Containment via sibling queryProductConfigurationItem[] (+ parent relationship on the child ...Item)
      • this is the IG1228 (Fiber contract) example (with some tweaks that we discussed) you provided in the 760 OAS file

    so we have 3 patterns to represent the bundle structure/runtime configuration tree in 760.

    And to limit cardinality of individual bundled offerings within a bundle offering, use BundledProductOfferingOption(min/max/defaultnumberofbundledofferings).

    I agree. Keep authoring simple (620): set per-child limits once in productOfferingbundledProductOffering{}.

    I may suggest : 

    (if possible) only use a single source of truth for child offers' cardinalities:

    • 620: productOffering.bundledProductOffering.bundledProductOfferingOption{}
    • 760: productConfiguration.bundledProductOffering.bundledProductOfferingOption{}

    which means, avoid (both 620 and 760) using:

    bundledGroupProductOffering.bundledProductOffering.bundledProductOfferingOption{}

    • it introduces a risk of drifting when cardinalities are not consistent
    • API clients would have to check cardinalities from 2 different nodes
    • if you require drifting (say TV Box is max=4 in the bundle but max=2 in a specific group) or want to reference TV Box in 2 different groups, make sure all values are consistent in the catalogue.


    ------------------------------
    Kind regards,

    Matthieu Hattab
    Digital Sales Domain Architect
    Lyse Tele AS
    ------------------------------



  • 16.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

    TM Forum Member
    Posted Sep 30, 2025 06:46
    Edited by Lutz Bettge Sep 30, 2025 06:47

    In TMF620, when introducing the BundledGroupProductOffering (the better term would have been BundledProductOfferingGroup), it was decided to keep the direct link between ProductOffering and BundeledProductOffering for reasons of backward compatibility, and also to avoid having to use the Group in simple cases.
    So the two structures - linking a BundledPO directly to the PO, or using the Group - are alternatives and should not be mixed together.

    For example:

    productOffering:
    {
        bundledProductOffering:
        [
            {
                id=4711           // points to some ProductOffering
                bundledProductOfferingOption: { min=1, max=2 }
            }
        ],
        bundledGroupProductOffering:
        [
            {
                bundledProductOffering:
                [
                    {
                        id=4711     // points the same ProductOffering
                        bundledProductOfferingOption: { min=3, max=4 }
                    }
                ]
            }
        ]
    }

    means that you can choose between 1 and 2 instances of the 4711 ProductOffering as simple bundledPO, and in addition you can choose between 3 and 4 additional 4711 ProductOfferings via the bundledGroupPO; these two ways are independent of each other!
    And in principle, the direct link from ProductOffering to BundledProductOffering is not needed (but simplifies the structure if more complex choices from a group of different things are not needed).

    The interplay of the BundledProductOfferingOption and BundledGroupProductOfferingOption can be seen in the following example, showing that there is no risk of drifting inconsistencies of cardinalities:

    productOffering:
    {
        bundledGroupProductOffering:
        [
            {
                bundledProductOffering:
                [
                    {
                        id=4711           // points to some ProductOffering
                        bundledProductOfferingOption: { min=2, max=4 }
                    },
                    {
                        id=4712           // points to some other ProductOffering
                        bundledProductOfferingOption: { min=1, max=2 }
                    }
                ],
                bundledGroupProductOfferingOption: { min=2, max=5 }
            }
        ]
    }

    This means that you can choose between 2 and 4 instances of the 4711 ProductOffering and between 1 and 2 instances of the 4712 ProductOffering, but in total it must be between 2 and 5 instances of any of the two ProductOfferings.
    So if you e.g. choose only one 4712 instance, you have to add at least one 4711 instance,
    and if you choose four 4711 instances, you cannot add more than one 4712 instance.

    By nesting BundledGroupProductOfferings, with Options on each level, you can formulate very complex restrictions on the number of PO instances you can have.



      ------------------------------
      Lutz Bettge
      Deutsche Telekom AG
      ------------------------------



    • 17.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

      TM Forum Member
      Posted Sep 30, 2025 10:36

      hello @Lutz Bettge,

      Thank you for sharing this view. I did not expect that.

      can you confirm if your suggestion is an implementation choice or a requirement in 620?

      because this approach has some concerns.

      when we define a bundle, we define allowances (min, max, default) in accordance with OSS rules or commercial agreement with partners.

      If they say you can only buy 1 Sport+UHD offer in this bundle, it has to be max=1

      • If Sport+UHD appears in 2 groups ("UHD offers, pick 4 out of 10)), (Sport Offers, pick 20 out of 20), I cannot have customer select Sport+UHD 1x in each group because that will make 2 instances of Sport+UHD in my bundle. This is one example of drifting.
      • with Sport+UHD, I need to check 2 sets of cardinalities: a global limit per bundle + a local limit per group.

      your approach can work,  but it comes at extra complexity and risks. It will require good catalogue governance and also making sure that this is well understood by 620 API, product configurator and 760 API and frontend clients

      I hope we still have the options to model child offers allowances with bundledProductOffering and/or with bundledGroupProductOffering



      ------------------------------
      Kind regards,

      Matthieu Hattab
      Digital Sales Domain Architect
      Lyse Tele AS
      ------------------------------



    • 18.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

      TM Forum Member
      Posted Sep 30, 2025 11:16

      That is a good question, I have to ask a colleague who is involved in the actual product modelling. Will take a while, but I will come back to this as soon as I have an answer.



      ------------------------------
      Lutz Bettge
      Deutsche Telekom AG
      ------------------------------



    • 19.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

      TM Forum Member
      Posted Oct 01, 2025 11:03

      Interesting conversation.

      @Lutz Bettge Imagine 4711 is mentioned in both direct `bundledProductOffering` as well as `bundledGroupProductOffering` as you gave an example.

      productOffering:
      {
          bundledProductOffering:
          [
              {
                  id=4711           // points to some ProductOffering
                  bundledProductOfferingOption: { min=1, max=2 }
              }
          ],
          bundledGroupProductOffering:
          [
              {
                  bundledProductOffering:
                  [
                      {
                          id=4711     // points the same ProductOffering
                          bundledProductOfferingOption: { min=3, max=4 }
                      }
                  ]
              }
          ]
      }

      At the time of order, let's say a customer orders 2 of this PO. However, later, she wants to buy 2 more of these, as per your explanation, it should be allowed. For this to happen, we will need to store the group information in the `customer product inventory` as well. AFAIK, inventory doesn't store the group information in `product` instance. Then how does it work? 



      ------------------------------
      Manu
      ------------------------------



    • 20.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

      TM Forum Member
      Posted Oct 01, 2025 11:14

      Yes, this is true; I think the APIs that are based on the product structure as defined by TMF620 are not yet fully aligned. It is probably not only the Product Inventory, Product Offering Qualification, Quote, Shopping Cart, Product Ordering, maybe more ...
      Detailed analysis is necessary, but probably we need an "instance" of the BundledGroupPO in the Product structure. In the end, after having processed a ProductOrder and stored the Product in the Inventory, when the customer wants to change some detail of his product, like purchasing another item, deleting/modifying/..., one must be able to align the Product elements back to the Product Model in the catalog, so that validity of the changed configuration can be checked against the model, including all the cardinality restrictions (min/max) defined by the  BundledGroupProductOfferingOption and BundledProductOfferingOption.



      ------------------------------
      Lutz Bettge
      Deutsche Telekom AG
      ------------------------------



    • 21.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

      TM Forum Member
      Posted Oct 02, 2025 05:27
      Edited by Matthieu Hattab Oct 03, 2025 10:14

      Manu,

      In Lutz's example, 

         id=4711     // points the same ProductOffering
                          bundledProductOfferingOption: { min=3, max=4 }

      Your customer could not have ordered 2x 4711. The configurator would have rejected it, since the group-level option enforces a minimum of 3.

      There is no need to store group information in the product inventory. Groups exist in the catalogue to declare business rules; the configurator enforces them. You should not store rules in the inventory.

      When the customer buys the bundle and selects 4711, those instances are stored in the inventory.

      Later, if they want more, they go to My products, click modify on the bundle. 

      At that point, the configurator:

      •  retrieves the product bundle from the inventory (what the customer has)
      •  retrieves the bundle offer definition (including group rules and cardinalities) from the catalogue (what the customer can get)
      • computes a fresh runtime product configuration (based on the above)

      TMF760 client will then show the product configuration in the UI

      • customer will see their existing 4711 instances and will be allowed to add more 4711  (up to 4).
      • if customer already has 4x active 4711 instances, UI would not allow to add more or configurator would reject the validation


      EDIT: you do have an issue if the same offers is referenced in 2 different groups.
      ------------------------------
      Kind regards,

      Matthieu Hattab
      Digital Sales Domain Architect
      Lyse Tele AS
      ------------------------------



    • 22.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

      TM Forum Member
      Posted Oct 02, 2025 07:30

      Matthieu,

      you are right, in the so far discussed examples it is not necessary to have the group information in the inventory, but there are cases where you need them.

      The problem is the missing step in what you describe as the configurator's tasks:

      • retrieves the product bundle from the inventory (what the customer has)
      • retrieves the bundle offer definition (including group rules and cardinalities) from the catalogue (what the customer can get)
      • links all the elements retrieved from the inventory to the corresponding elements retrieved from the Catalog; only then you can validate which changes are allowed by the catalog
      • computes a fresh runtime product configuration (based on the above)

      If the 4711 PO is included not only in one selection group, but in two:

      productOffering:
      {
          bundledGroupProductOffering:
          [
              {
                  id: 1
                  name: "first selection group"
                  bundledProductOffering:
                  [
                      {
                          id=4711           // points to some ProductOffering
                          bundledProductOfferingOption: { min=0, max=1 }
                      },
                      {
                          id=4712           // points to some other ProductOffering
                          bundledProductOfferingOption: { min=0, max=1 }
                      }
                  ],
                  bundledGroupProductOfferingOption: { min=0, max=1 }
              },
              {
                  id: 2
                  name: "second selection group"
                  bundledProductOffering:
                  [
                      {
                          id=4711           // points to the same ProductOffering as included in the first group
                          bundledProductOfferingOption: { min=0, max=1 }
                      },
                      {
                          id=4713           // points to some other ProductOffering
                          bundledProductOfferingOption: { min=0, max=1 }
                      }
                  ],
                  bundledGroupProductOfferingOption: { min=0, max=1 }
              }
          ]
      }

      then you have to know from which of the two selection groups you have chosen the 4711 instance.

      In this example, you can choose via the first group 0 or 1 instance of either 4711 or 4712, and you can choose via the second group 0 or 1 instance of either 4711 or 4713.

      If in the inventory you find one 4711 instance,

      • if it was selected from the first selection group, you cannot add a 4712, but you can add a 4713.
      • if it was selected from the second group, you can add a 4712, but you cannot add a 4713.

      So you must get the information on the group from the inventory to be able to validate any modification.



      ------------------------------
      Lutz Bettge
      Deutsche Telekom AG
      ------------------------------



    • 23.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

      TM Forum Member
      Posted Oct 03, 2025 10:32
      Edited by Matthieu Hattab Oct 03, 2025 10:35

      Hi Lutz,

      we agree. the possibility to reference the same bundled PO in 2 groups was always going to be a problem, even for the first purchase because 620 user guide (and conformance profile) has no guidance for managing bundled PO cardinalities.

      After doing some testing on how configurator consumes 620 and compute a runtime configuration tree, I came up with a few guidelines for our product catalogue implementation

      • rule 1: do not use Groups to organise your Bundled Product offerings (=BPO).  Groups are logical containers for offers that require "pick N of M" rules across a defined set of child offerings, it's not meant to define a presentation layer, it's meant to control quantities of a group of product offers. anything related to the presentation layer shall be Done in our CMS (product content mode) or using 620's product categories.
      • rule 2: Use a single source of truth for BPO cardinalities.
        • We recommend to only use [bundle-level] BPO cardinalities* as the authoritative reference as defined with OSS, network and commercial partners. 
        • You can still define [group-level] BPO cardinalities* but their allowance shall never exceed (below min or above max)  [bundle-level] BPO cardinalities*. you need to validate the catalogue.
          • ❗validating cardinalities can be very challenging if you use nested sub-groups
      • rule 3: Never reference a BPO in more than 1 product group in the bundle:
        •  you will not be able to modify the bundle later,  to change the quantity of the BPO,  as the inventory has no knowledge of the product group that contained the BPO when it was first purchased.

      * we have 3 locations in the API to specify cardinalities that affect BPOs:

      • [group-level] group cardinalities (affect any offer in the group)
      • [group-level] BPO cardinalities  (affect a specific offer in the group)
      • [bundle-level] BPO cardinalities (affect a specific offer in the bundle)
      {
        "productOffering": {
          "@type": "ProductOffering",
          "id": "po-iptv",
          "bundledGroupProductOffering": [
            {
              "@type": "BundledGroupProductOffering",
              "id": "grp-wifi-everywhere",
              "bundledProductOffering": [
                {
                  "id": "po-mesh-router",
                  "bundledProductOfferingOption": { "min": 1, "max": 7, "default": 1 } // [group-level] BPO cardinalities for wifi router in this group
                },
                {
                  "id": "po-mesh-point",
                  "bundledProductOfferingOption": { "min": 0, "max": 7, "default": 0 } // [group-level] BPO cardinalities for wifi point in this group
                }
              ],
              "bundledGroupProductOfferingOption": { "min": 1, "max": 7 } // [group-level] group cardinalities
            }
          ],
          "bundledProductOffering": [
            {
              "id": "po-mesh-router",
              "bundledProductOfferingOption": { "min": 1, "max": 7, "default": 1 }. // [bundle-level] BPO cardinalities
            },
            {
              "id": "po-mesh-point",
              "bundledProductOfferingOption": { "min": 0, "max": 7, "default": 0 } // [bundle-level] BPO cardinalities
            }
          ]
        }
      }

      ------------------------------
      Kind regards,

      Matthieu Hattab
      Digital Sales Domain Architect
      Lyse Tele AS
      ------------------------------



    • 24.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

      TM Forum Member
      Posted Oct 06, 2025 00:36

      Hi Matthieu,

      as mentioned, your example defines:

      • via the bundledGroupProductOffering, you can choose at least 1, max 7 po-mesh-..., which can be ...-router or ...-point, but at least one of them must be a po_mesh-router.
      • via the bundledProductOffering, you additionally can add between 1 and 7 ...-router, and additionally between 0 and 7 ...-point

      The BGPO and the BPO are independent of each other!
      At least this is how it was meant, of course you are free to implement the logic differently, but this then not compliant to the TMF model.



      ------------------------------
      Lutz Bettge
      Deutsche Telekom AG
      ------------------------------



    • 25.  RE: TMF620 v5 - BundledProductOffering v BundledGroupProductOffering

      TM Forum Member
      Posted Oct 06, 2025 00:52

      Hi Matthieu,

      you are right here, it is NOT possible using only the BGPO/BPO structures (including Options) to solve the problem that one BPO can be in several groups and the total number of this BPO is restricted to a lower number than the sum of the max numbers allowed in the groups;
      in your example, it is not possible to state that the "Sport+UHD" can be chosen only once, either from the "UHD offers, pick 4 out of 10" group or from the "Sport Offers, pick 20 out of 20" group.
      To express this additional restriction, we would need some "cross-group-rule", e.g. a BundledProductOfferingRelationship between the two "Sport+UHD" in the two groups (which does not exist so far) with relationshipType="excludes" or maybe a Policy for even more complex scenarios.
      Maybe should be added in a future version ....



      ------------------------------
      Lutz Bettge
      Deutsche Telekom AG
      ------------------------------