Connecting the Dots with Indirect KPIs

07 Aug Connecting the Dots with Indirect KPIs

Direct vs Indirect KPIs Simple Graphic


As business intelligence and analytics continue to add value to supply chain organizations, how do we gain even more value?  With an increase in data and the sources of information – from supply chain systems to customer systems to supplier management systems, a source of business value can be achieved by correlating a group of metrics from disparate systems to provide insight and cause/effect relationships.  Correlating metrics in this manner is called indirect KPIs vs. the conventional manner of developing KPIs referred to as direct KPIs.

First, lets review the difference between direct KPIs and indirect KPIs.

Direct KPIs are the metrics which result from drilling down or drilling up on metrics.  In a typical supply chain organization, an example can be Inventory:

    1. Inventory   (Primary KPI)
      1. RM Inventory     (sub-metric of Inventory)
      2. WIP Inventory   (sub-metric of Inventory)
      3. FG Inventory     (sub-metric of Inventory)

Assuming no other type of inventory exists the business, just adding up raw material inventory, work in process inventory and finished goods inventory calculates Inventory for an organization.  Another example of a direct KPI is Revenue and different kinds of revenue:

    1. Revenue    (Primary KPI)
      1. Revenue by Division     (sub-metric of Revenue)
        1. Revenue by Division by Location    (sub-metric of Revenue by Division)

Most supply chain analytics systems work in this manner, since the data is collected from similar systems and analytics are rolled up in a very straightforward manner.

Indirect KPIs are those which impact KPIs not found within a straightforward “drill-down” or “drill-up” manor; these are KPIs which correlate to or impact other KPIs.  Indirect KPIs are much harder to determine (vs. simply adding up numbers in our earlier inventory or sales examples), but can provide insights into supply chain issues and drive improvements.

Normally, direct KPIs can tell a business what happened, whereas indirect KPIs can help organizations learn what to do differently by connecting the dots to determine factors which truly impact performance.

How to connect the dots

First, start with tribal knowledge.  Ask some basic questions about the key metrics which need improving and any general knowledge of what impacts them:

What causes product to be late?
            Is it delays in manufacturing?
            Poor yields?
            Late suppliers?
            Supplier quality?

Each of the potential reasons open up a new set of KPIs.  Rather than continuing infinitely, drill down and across into the KPIs until a set of actionable KPIs can be focused upon.  Remember:

KPIs just for visibility are interesting, KPIs where action can directly impact a business metric are focus areas.

Once the dots are connected which can lead to a business-impacting metric, determine the data source for all the KPIs in the Indirect KPI trail of dots.  Think out of the box on this trail dots – these may not be static data sources (your ERP system, your accounting system, etc.).  These KPIs can be managed by apps (or mini-apps).  An important factor is how often these KPIs are refreshed.  If 1 KPI is refreshed in real-time and another is refreshed on a quarterly basis, the accuracy and actions-to-take may be harder to develop.

In the example below, the organization is struggling with Adherence to Plan – a metric which defines the date and quantity of finished product to a distribution center.  One of the direct KPIs of Adherence to Plan is Inventory.  A direct KPI of Inventory is WIP inventory.  Since WIP is high, we can access data and metrics from manufacturing and supplier management and determine that poor supplier quality of raw materials is causing rework, causing ATP to fall short.

Connecting the dots with Indirect KPIs

Direct vs Indirect KPIs Connecting the Dots Graphic


Summary: Using the above example, by managing Indirect KPIs, we find that supplier quality inconsistency is adversely affecting Adherence to Plan.


  • Collaboration with Context
    Posted at 06:31h, 14 August Reply

    […] the story” example, a KPI may be messaged to a team.  Each member of the team may need access an Indirect KPI to contribute to the conversation.  Such Indirect KPIs may be information from different systems, […]

  • Purpose Built Analytics - Sage Clarity
    Posted at 07:24h, 29 August Reply

    […] data cubes is required.  The ability to access data from very different sources, accessing direct and in-direct KPIs, accessing unstructured data and structured data are facets of purpose build analytics programs.  […]

  • Applying Goal Attainment Principles to Metrics
    Posted at 20:32h, 04 September Reply

    […] an example of taking stoplight metrics to another level – using KPIs which depend on others, or Indirect KPIs as elements into a metrics program to achieve specific […]

  • Siloed Analytics vs. Broad Business Analytics - Sage Clarity
    Posted at 09:34h, 08 January Reply

    […] or KPIs which are not found in a standard “drill-up”/”drill-down” manner are known as Indirect KPIs. The example above shows the use of Indirect KPIs at an individual level. Indirect KPIs can be […]

  • how executives can manage information overload
    Posted at 20:49h, 25 June Reply

    […] Using Indirect KPIs. This sounds very specific, but what we find is that there are numerous pieces of information that really mean minimal to an executive. However, when several small KPIs are correlated, the result can lead to a KPI that an executive can review and make a decision quickly and more importantly, accurately. Indirect KPIs are KPIs which impact other KPIs not found within a straightforward “drill-down” or “drill-up” manor; these are KPIs that correlate to or impact other KPIs. Indirect KPIs are much harder to determine (vs. simply adding up numbers in a typical manner), but can provide insights into supply chain issues and drive improvements.   Indirect KPIs are KPIs that connect the dots. Rather than showing the executing the dots (smaller, tactical KPIs), expose the executive to the already-connected-dots. […]

Post A Comment

[gravityform id="7" title="false" description="false" ajax="true"]
<div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_7' ><div id='gf_7' class='gform_anchor' tabindex='-1'></div><form method='post' enctype='multipart/form-data' target='gform_ajax_frame_7' id='gform_7' action='/connecting-dots-indirect-kpis/#gf_7' > <div class='gform_body gform-body'><ul id='gform_fields_7' class='gform_fields top_label form_sublabel_below description_below'><li id="field_7_1" class="gfield form-field-name gfield_contains_required field_sublabel_hidden_label field_description_below hidden_label gfield_visibility_visible" data-js-reload="field_7_1"><label class='gfield_label gfield_label_before_complex' >Name<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_complex ginput_container no_prefix has_first_name no_middle_name has_last_name no_suffix gf_name_has_2 ginput_container_name' id='input_7_1'> <span id='input_7_1_3_container' class='name_first' > <input type='text' name='input_1.3' id='input_7_1_3' value='' aria-required='true' placeholder='First Name' /> <label for='input_7_1_3' class='hidden_sub_label screen-reader-text'>First</label> </span> <span id='input_7_1_6_container' class='name_last' > <input type='text' name='input_1.6' id='input_7_1_6' value='' aria-required='true' placeholder='Last Name' /> <label for='input_7_1_6' class='hidden_sub_label screen-reader-text'>Last</label> </span> </div></li><li id="field_7_3" class="gfield gfield_contains_required field_sublabel_below field_description_below hidden_label gfield_visibility_visible" data-js-reload="field_7_3"><label class='gfield_label' for='input_7_3' >Enter your email<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_email'> <input name='input_3' id='input_7_3' type='text' value='' class='medium' placeholder='Enter your email' aria-required="true" aria-invalid="false" /> </div></li><li id="field_7_8" class="gfield field_sublabel_below field_description_below hidden_label gfield_visibility_visible" data-js-reload="field_7_8"><label class='gfield_label' for='input_7_8' >Phone</label><div class='ginput_container ginput_container_phone'><input name='input_8' id='input_7_8' type='text' value='' class='medium' placeholder='Phone' aria-invalid="false" /></div></li><li id="field_7_7" class="gfield gfield_contains_required field_sublabel_below field_description_below hidden_label gfield_visibility_visible" data-js-reload="field_7_7"><label class='gfield_label' for='input_7_7' >Company<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_text'><input name='input_7' id='input_7_7' type='text' value='' class='medium' placeholder='Enter your company' aria-required="true" aria-invalid="false" /> </div></li><li id="field_7_9" class="gfield gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_7_9"><div class='ginput_container ginput_container_text'><input name='input_9' id='input_7_9' type='hidden' class='gform_hidden' aria-invalid="false" value='' /></div></li><li id="field_7_10" class="gfield gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_7_10"><div class='ginput_container ginput_container_text'><input name='input_10' id='input_7_10' type='hidden' class='gform_hidden' aria-invalid="false" value='' /></div></li><li id="field_7_11" class="gfield gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_7_11"><div class='ginput_container ginput_container_text'><input name='input_11' id='input_7_11' type='hidden' class='gform_hidden' aria-invalid="false" value='' /></div></li><li id="field_7_12" class="gfield gform_validation_container field_sublabel_below field_description_below gfield_visibility_visible" data-js-reload="field_7_12"><label class='gfield_label' for='input_7_12' >Email</label><div class='ginput_container'><input name='input_12' id='input_7_12' type='text' value='' /></div><div class='gfield_description' id='gfield_description_7_12'>This field is for validation purposes and should be left unchanged.</div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_7' class='gform_button button' value='WATCH THE VIDEO' onclick='if(window["gf_submitting_7"]){return false;} window["gf_submitting_7"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_7"]){return false;} window["gf_submitting_7"]=true; jQuery("#gform_7").trigger("submit",[true]); }' /><!-- Begin Daddy Analytics fields --><input type="hidden" name="" value="" /><input type="hidden" name="" value="" /><!-- End Daddy Analytics fields --> <input type='hidden' name='gform_ajax' value='form_id=7&amp;title=&amp;description=&amp;tabindex=0' /> <input type='hidden' class='gform_hidden' name='is_submit_7' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='7' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_7' value='WyJbXSIsIjkxNDIyMmFlMTAxZmQ0Y2JiZGRlMTcwMzZjMjBlNDQxIl0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_7' id='gform_target_page_number_7' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_7' id='gform_source_page_number_7' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> <input type="hidden" id="ct_checkjs_ed3d2c21991e3bef5e069713af9fa6ca" name="ct_checkjs" value="0" /><input id="apbct__email_id__gravity_form_85791" class="apbct_special_field apbct__email_id__gravity_form" autocomplete="off" name="apbct__email_id__gravity_form_85791" type="text" value="" size="30" maxlength="200" /><input id="apbct_event_id" class="apbct_special_field" name="apbct_event_id" type="hidden" value="85791" /></form> </div> <iframe style='display:none;width:0px;height:0px;' src='about:blank' name='gform_ajax_frame_7' id='gform_ajax_frame_7' title='This iframe contains the logic required to handle Ajax powered Gravity Forms.'></iframe> <script type="text/javascript"> gform.initializeOnLoaded( function() {gformInitSpinner( 7, '' );jQuery('#gform_ajax_frame_7').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_7');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_7').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_7').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_7').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_7').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */ jQuery(document).scrollTop(jQuery('#gform_wrapper_7').offset().top - mt); }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_7').val();gformInitSpinner( 7, '' );jQuery(document).trigger('gform_page_loaded', [7, current_page]);window['gf_submitting_7'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}setTimeout(function(){jQuery('#gform_wrapper_7').replaceWith(confirmation_content);jQuery(document).scrollTop(jQuery('#gf_7').offset().top - mt);jQuery(document).trigger('gform_confirmation_loaded', [7]);window['gf_submitting_7'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_7').text());}, 50);}else{jQuery('#gform_7').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger('gform_post_render', [7, current_page]);} );} ); </script>