Creating a Basic Compensation Plan in XML

Warning: Compensation Plans should be programmed with the guidance of an experienced compensation plan expert.

Creating an entire compensation plan template can be complicated and confusing; however, the individual pieces are simple. When you combine the elements, you have infinite options to build your custom plan.

Using XML

The XML Editor uses XML to describe compensation plans. Every template will begin with the line:

<?xml version="1.0" encoding="UTF-8"?>

This defines the XML version and the character encoding (8-bit Unicode Transformation Format (UTF-8)).

Next, we have to define the template. Contain templates within the opening and closing <Template> tag.

<Template>

</Template>

Every element in an XML document must have a beginning and ending tag or begin and end within one tag:

<SetRank Rank="5" />

The <SetRank> tag above is self-closing because it ends with /``; meaning, it doesn’t need a separate` closing tag.

This <SetRank> element also has an attribute named Rank. Use attributes to set simple values for an element. For more complex values, nest elements inside each other.

For example, the <Template> below has <Rules> within it. One of the rules is Name="G2" Description="Gold 2", which has conditions required to meet. If met, you will become a Rank 5 Associate.

<Template>
  <Rule Name="G2" Description="Gold 2">
    <And>
      <MeetsRule Rule="Active" />
      <MeetsRule Rule="G1" />
      <PVCondition Max="-1" Min="150" Volume="pqv" />
    </And>
    <Result>
      <SetRank Rank="5" />
    </Result>
  </Rule>
</Template>

In this example, the Associate needs to meet the conditions (<MeetsRule>) for "Active" and "G1", as well as have at least 150 (Min="150") Personal Volume from Volume="pqv". You must define these terms elsewhere in the <Template>.

As you build your commission template, you define:

  • Different types of volume
  • Where they come from
  • How to earn them.

You then use these volumes later on in:

  • Calculating payouts
  • Determining which Rank the Associate has earned

Template Names

The template’s name is defined in the <ComPeriod> which has general information about the template, such as the Name and <VolumeRange> (date range) included for each period.

The Name here must match the name of the file in the Template Selector and must be the last attribute defined in <ComPeriod>.

<?xml version="1.0" encoding="UTF-8"?>
<Template>
  <ComPeriod TrackRealtimeRankAdvancements="False" EnrollTree="Enrollment" RoundPrecision="3" Usage="CommissionRun, StateStats, RealtimeStats" Name="MonthlyUI">

   ...
   ...
   ...

  </ComPeriod>
</Template>

Typically, the template name is the same as the period it represents (Weekly, Monthly, Bi-Monthly, etc.).

It’s also important, when working with the XML Compensation Plan Editor, that every template name must have a revision and <ComPeriod Name=""> with the same name to function properly. Template Names and Template Revisions are case sensitive and can be no longer than 50 characters.

Template Name in XML Editor

Volume Ranges (Data Range)

At the beginning of a compensation plan, you always have a <ComPeriod> with the template’s details. Within that ComPeriod, you always have to have a single <VolumeRange> that serves as the compensation plan’s default date range.

<ComPeriod>
    <VolumeRange>
        <VolumeRange Name="Monthly">
            <RangeType>
                <Monthly StartOffset="0" EndOffset="0"/>
            </RangeType>
      </VolumeRange>
    </VolumeRange>
</ComPeriod>

Use Volume Ranges to set separate date ranges to count volume. For example, let’s say you gave orders placed in the first week of the month double volume.

 <VolumeRange Name="First7DaysOfTheMonth">
    <RangeType>
        <MovingDays BeginDays="0" EndDays="7" />
    </RangeType>
 </VolumeRange>

Then define another range for the beginning of the month that adds up the volume.

 <VolumeRange Name="LastMonth">
    <RangeType>
        <Monthly StartOffset="1" EndOffset="0" />
    </RangeType>
 </VolumeRange>

Each Volume Range has a Name attribute. Set the name as anything you want. You can reference the name throughout the compensation plan. The core part of the Volume Ranges is the Range Type.

Read more: Volume Ranges (Data Range)

Volumes

The best way to think of Volumes is as a bucket that you are putting orders into (a bucket of volume). The inventory items in the orders have CV and QV—two of the most common Volume Groups—volume amounts filled in.

Volume Groups

Volume Groups determine from where the volume comes. Other volume groups include:

Value Definition
CV The Commissionable Volume set on the items purchased.
QV The Qualifying Volume set on the items purchased.
SubTotal Value of orders placed excluding tax and shipping.
Total Value of orders placed including tax and shipping.
OrderCount The number of orders placed.
ItemCount Quantity of items sold (an order with an item quantity of five equals five volume).
UniqueItems Number of items sold (an order with an item quantity of five counts as one volume).

Each volume defined will assign a value to each Associate. Use volume to:

  • Qualify for a rank
  • Calculate a commission bonus
  • Display as KPI

The way you create volume buckets is with Volume Accumulators.

Volume Accumulators

When we’re talking about Volume Accumulators, you’re looking from the perspective of a specific individual. For example, “you”. What is “your” volume bucket.

    <VA_Personal AssociateBaseTypes="" Name="CV">
      <VolumeType>
        <DefVolType VolumeGroup="CV" />
      </VolumeType>
    </VA_Personal>

This example is a simple Volume Accumulator. The AssociateBaseTypes is blank, so it applies to all Associate Types. It’s looking at the CV of their order for the designated Volume Range. This example doesn’t have a Volume Range selected, meaning it will use the compensation plan’s default Volume Range. The Volume Type determines what volume on the order you are summing.

📝Volume Types:

  • <DefVolType> - This basic default Volume Type looks at an order and assigns a Volume Group (CV, QV, etc.) to the order.
  • <OrderTypeVolume> - Looks at all the orders and adds an extra filter for Order Types. You can then assign that Order Type a default Volume Group.

See Reference: Volume Types for details on each Volume Type available.

Each Volume Accumulator is assigned a name of your choosing. In the preceding example, the Volume Accumulator is named “CV”. Later in the compensation plan, you can reference this name to assign the volume to specific conditions:

<Rule Description="Commission Active" Name="ComACT">
      <And>
        <PVCondition Max="-1" Min="200" Volume="CV" />
      </And>
       <Result>
        <SetStat Name="ComACT" Description="Commission Active" />
      </Result>
</Rule>

This example calls the Volume named "CV". It states that to be considered "Active", an Associate must have at least 200 "CV" volume.

The hardest part when setting up a comp plan has to do with Volume Accumulators. They are vital to get correct and should be the first thing you figure out when creating a compensation plan. You’ll notice, when you’re creating Volume Accumulators, you almost always have more than one. You’ll have ones for paying out Unilevel or Binary Trees, qualifying for ranks, CV, QV, and they’re all different. You’re going to end up with five or more (sometimes as many as 20) to get the results you need.

There are different Volume Accumulator types to use for specific scenarios.

Read more: Volumes

Tree Volumes (Tree ACRs)

Tree Volumes sum each person’s downline volume. <Volumes> don’t reference a tree; they assign values to individuals.

The majority of the time you’ll use the standard TreeVolume:

  <TreeVolumes>
    <TreeVolume Volume="PS" Tree="Enrollment" Name="TS" />
  </TreeVolumes>

What you do is you name it just like everything else. The example is named “TS”. Then you declare a Tree. This example is using the Enrollment Tree, but you could use Binary, Unilevel, Matrix, etc. For this example, we’re going to assign the <VA_RetailRollup> Volume named “PS” that looks like this:

<VA_RetailRollup Name="PS">
      <VolumeType>
        <DefVolType VolumeGroup="QV" />
      </VolumeType>
</VA_RetailRollup>

What our Tree Volumes example is going to do is for each person in the Enrollment tree below an Associate (but doesn’t include the Associate), it gets all of their "PS", sums up this volume, and puts that number as "TS". So this becomes your Group Volume.

A very common Condition that goes along with this is GVCondition that you can call "TS":

<GVCondition PersonalVolume="PS" MaxPersonal="-1" IncludeCompressed="True" CompressRule="" Level="-1" MaxPerLeg="-1" Max="-1" Min="1000" TreeVolume="TS" />

In this example, you need a 1000 "TS" to get this option.

Or in a GroupVolumeTree:

<GroupVolumeTree TreeVolume="TS" />

So for example, we have a <VA_Personal> Volume Accumulator, Tree Volume would walk down an Associate’s entire organization, whatever Tree defined, and give them the total of everybody below’s personal volume. You can pass in any Volume Accumulator you want.

You could do <VA_RetailRollup>, which would basically give an Associate everyone’s volume below them in the Tree that’s a Distributor with all their customer volume included.

Read more: Tree Volumes (Tree ACRs)

Rules

DirectScale’s compensation plan system is option-based. You create different options, or “Rules”, to program many different compensation plan types. The system cycles through every Rule to see if it’s meets the defined Conditions. Once an Associate meets the Rule conditions, it awards volume, bonus, or a new Rank. Use Rules for qualifying and defining Ranks and bonuses. You reference the Rule names in other Rules as requirements to meet.

<Rule Name="Act" Description="Active">
    <And>
        <PVCondition Volume="PS" Min="140" Max="-1" Description="Total Personal and Customer QV"/>
        <AssociateTypeCondition AssociateBaseType="1" Description="Distributor"/>
    </And>
    <Result>
        <SetStat Name="ComACT" Description="Commission Active"/>
    </Result>
</Rule>

Each Rule has a Name and Description. The names have a ten-character max. You use the names later on in the compensation plan to reference the Rule. The description is a way to keep in mind what this Rule is doing.

Inside of each Rule, you have a Condition or group of Conditions.

Conditions

You can group Conditions with Conditional operators:

    <And>
        <PVCondition Volume="PS" Min="140" Max="-1" Description="Total Personal and Customer QV"/>
        <AssociateTypeCondition AssociateBaseType="1" Description="Distributor"/>
    </And>

In this example, it takes a <PVCondition>, which checks if a Volume Accumulator contains a Min amount for the Associate. This example references a Volume Accumulator created earlier in the compensation plan called "PS". The Associate must have a minimum of 140 volume. The Max parameter is set to -1, which in the system always means infinity, so there’s essentially no maximum cap.

The other condition passed is <AssociateTypeCondition>, which checks the Associate Type. It passes the parameter AssociateBaseType set to Associate Type 1, which, by default, is a Distributor Associate. You can pass any of your created Associate Types here.

To meet this Rule, an Associate must be a Distributor and have at least 140 of the PS volume. If both of those conditions are true, they will qualify for the <Result>.

You can also set up a <NotHitOption>:

<Rule Description="Not a Distributor" Name="NotDist">
    <AND>
        <NotHitOption Rule="Dist" />
    </AND>
</Rule>

Using <NotHitOption> negates the passed Rule; meaning, if the Rule "Dist" is true for an Associate, then the preceding "NotDist" Rule will be false. Likewise, if "Dist" were false, then “NotDist” would be true. <NotHitOption> is a way to determine if an Associate is not something rather than checking if they are. For example, it’s a way to find out who are Distributors and who are just customers.

Read more: Rules

Payments

<Payments> is the element that goes into a result to say you want to pay somebody something. There are not multiple payments. Every time you wish to make a payment, you have to do a <payment> tag to say what the bonus name is, what pool it’s coming from, and a tag and metadata if you want to use that. Payments always take a group and a source.

<Rule Description="Team Commission" Name="TC">
    <And>
        <MeetsRule Rule="A"/>
    </And>
    <Result>
        <Payments>
            <Payment Pool="MasterPool" Bonus="Team Commission" Tag="" MetaData="">
                <Group>
                    <CurrentAssociateGroup/>
                </Group>
                <Source>
                    <WeakLegVolumePay TreeVolume="BCV" PercentPay="15" WeakLegVolume="200" StrongLegVolume="400" TotalMaxVolume="133600" Comment="Lessor Leg"/>
                </Source>
            </Payment>
        </Payments>
    </Result>
</Rule>

Within a <Rule>, the <Payments> element defines:

  • What requirements are necessary to earn a payment
  • The group of Associates that contribute volume to the payment
  • The details of how much to pay
<Rule Name="EB" Description="Early Bird order bonus">
  <And>
    <MeetsRule Rule="Active" />
    <PVCondition Volume="Retail-Orders" Min="2" Max="-1" />
  </And>

  <Result>

    <Payments>
      <Payment Pool="MasterPool" Bonus="EB bonus" Tag="" MetaData="">

        <Group>
          <CurrentAssociateGroup />
        </Group>

        <Source>
          <FixedAmountPay Amount="5" Comment="Early Bird Bonus" GroupSize="0" OneTimeKey="" />
        </Source>
      </Payment>

    </Payments>

  </Result>
</Rule>

In the preceding example, the first qualification is to be “Active” (<MeetsRule Rule="Active" />).

Next, they must have Volume of 2 (Min="2") in "Retail-Orders" (<PVCondition Volume="Retail-Orders" Min="2" Max="-1" />). This references a Volume that you have to define earlier in the template:

<Retail Name="Retail-Orders" VolumeRange="First7DaysOfTheMonth">
  <VolumeType>
    <DefVolType VolumeGroup="OrderCount" />
  </VolumeType>
</Retail>

For this example, orders are placed by Retail Associates under a Distributor in the first week of the month. Finally, if those conditions are met, the result is a $5 payment:

<Source>
          <FixedAmountPay Amount="5" Comment="Early Bird Bonus" GroupSize="0" OneTimeKey="" />
</Source>

Read more: Payments

Rollover Rules (Binary Comp Plans)

Unilevel compensation plans usually pay the volume earned each period. An Associate either gets paid on the volume earned that period or can never get paid on it. This is not the case with Binary. With Binary compensation plans, an Associate can earn volume one period and get paid on it in the future; they can get paid on the volume they earned periods ago.

Binary is all about the balance volume in the Left and Right Legs; however, there are times when those Legs aren’t balanced. For example, you have 100 volume on your Right Leg (Weak) but 1,000,000 on your Left (Strong). An Associate will get paid a percentage of that Weak Leg/cycle out of that Weak Leg. But the Associate’s Weak Leg’s volume is not going to affect the 1,000,000; it’s just too strong.

What binary compensation plans do is it makes that 1,000,000 continue to roll over each period, slowly chipping away at that volume earned a long time ago. This mass of volume built up because that Leg was stronger, better performing. Balancing each Leg by placing strong performers on each is essential.

This volume that rolls from one period to the next is called “Rollover”. Rollover is the volume that the period didn’t use, which then rolls to the next period. The order/purchase the volume originates from may have been placed months ago.

Note: Another name for Rollover is Carry Forward. Rollover Rules usually go after all the Rules but before the KPIs.

Read more: Rollover Rules

KPI (Stats)

This resource explains KPI Accumulators or KPI Templates. There is a section for <KPIs> at the very bottom of a compensation plan. KPIs are something that clients frequently change, especially after their site has gone live. KPIs (Key Performance Indicators) are another name for stats. They keep track of your Associate’s performance and volume and are used in many places throughout the system:

Here’s an example of a KPI in XML:

<KPIs>
    <TemplateKPI Description="Group Volume" Key="GVKPI">
        <Accumulator>
            <VolumeSumAccumulator TreeVolume="GV" PersonalVolume="RRQV" Volume="RRQV"/>
        </Accumulator>
    </TemplateKPI>
</KPIs>

Each <TemplateKPI> assigns Description and Key attributes. There’s a ten-character limit for Keys. Keys should be as concise as possible. It’s a best practice to have no spaces or special characters in Keys.

Keys don’t appear anywhere in the UI, showing the Descriptions instead. Descriptions have no character limit and can be longer and more “phrase-like”. You can update Descriptions at any time. Keys, however, should never change.

Read more: KPI (Stats)



Comp Plan Tools

Learn about the tools at your disposal:

  1. XML Editor
  2. GUI Editor

Once your plan is programmed, there are couples you must undertake to integrate your compensation plan with the system fully:

  1. Adding Rank Values to the Database
  2. Setting Stats and Projected Commissions Templates

For examples of common compensation plan types:

Was this article helpful?
0 out of 0 found this helpful
Previous Next

Comments

0 comments

Please sign in to leave a comment.