Either because the items in our inventory are costly, perishable, central to our business, or for any other reason, a proper stock planning always pays off.
Could I cut down my inventory cost by a million pounds with Anaplan? The answer, of course, is “yes”. Ok, you are right: it is rather easy to cut down inventory cost!
So, let me rephrase it to answer the question you are really asking: “can I release working capital from my inventory while maintaining my desired customer service level?”
And the answer is still “yes” (unless you are planning your inventory perfectly already).
It is not a secret that to cope with today’s intense competition and demanding customers, supply chains in medium and large companies have a lot of moving parts that introduce a good deal of volatility and uncertainty into the inventory planning process.
Simplified representation of some of the “moving parts” across a Supply Chain Network which can impact on the calculation of the total Safety Stock
Before reviewing in more detail how Anaplan can help you to deploy a Multi-Echelon Inventory Planning Model to deal with that uncertainty and reap nice returns on the investment – which we will do it in as little as four minutes - here is a real-life story to illustrate “why” such a solution could be very beneficial.
One Too Many Engines
I recently met in London a supply chain manager from an airline company. During our chat, he asked: “Can an inventory model save me an engine?”
Airlines have a vast inventory of spares. Some of them are just bolts or armrests for the seats, but other items in the inventory, such as new engines for their airliners, are more mission-critical and entail greater financial commitment.
Due to this need for categorization of the stock based on size, cost, replacement rate, or importance, and because of the variability in the volume of flights and type of airliners flying to different destinations across the seasons, the airline company were in need of a responsive and transparent way to plan quantities and locations for their inventory of spare parts.
At this point, it is easy to imagine that the lack of responsiveness and visibility led them to overstock in order to ensure the desired service level, especially for all the most critical spares, such as the engines.
Since the cost of one of these engines is in excess of £1m pounds, think of the great return that a reliable and transparent multi-echelon inventory planning model could boast if they could only optimize the stock as the landscape changes and, as a result, reduce the amount of engines by one single unit!
Either because the items in our inventory are costly, perishable, central to our business, or for any other reason, proper stock planning always pays-off.
One Too Few Engines
I know what you are thinking. And you are right. In my story, the cost of falling short in engines is higher than overstocking.
We use the story above as an example—although it is real—of how a company can incur significant overstock in order to avoid disruptions in their operations, and also because it illustrates the importance and potential returns of optimizing your stock.
But, indeed one too few engines could lead to canceled flights and harming the brand’s reputation. This is why the first (out of two) operative word here is: “optimization”. This is how Olivehorse’s multi-echelon inventory planning model brings value by not just cutting down your inventory but optimizing the quantity throughout the network to ensure a given service level.
There are not too many and not too few. There is just the right amount in the right place.
So, what is the other operative word? “Transparency”. It's the ability to track how you ended up with the amount of optimal stock that the screen of your computer shows and put trust in your data and plan your business accordingly.
In this community, we quickly got accustomed (we all like the good stuff!) to Anaplan’s transparency and flexibility to introduce and track all sorts of changes in the values of the calculations.
But let me remind you that other inventory planning solutions can be rather cumbersome and opaque and can produce results that are accepted as being gospel due to the rather high degree of secrecy surrounding the algorithm used.
More From Anaplan:
The Three Duties of an Anaplan Project Team
Is Anaplan's New User Experience Right for My Organization
Transforming IT Project Planning for CIOs
Multi-Echelon Safety Stock Optimization Model
Let’s wrap this up: how can Anaplan help you?
Olivehorse inventory and Anaplan practices have released, in conjunction with the multi-echelon inventory planning model, to broaden Anaplan’s offer of solutions for supply chain, achieving the potential benefits, and overcoming the shortfalls from the legacy solutions.
In order to deliver value to any company holding stock, the model complies with both Anaplan’s best practices (to release the platform’s unique computing and collaboration capabilities) and the industry’s best practices when it comes to the processes and algorithm used to determine the optimal safety stock.
Here are the main benefits of Olivehorse’s multi-echelon inventory planning model in Anaplan:
Accurate: Best-in-class algorithm to calculate safety stock amounts.
Detailed: Safety stock calculation per product and location.
Transparent: You will know exactly which variables impact on your safety stock.
Dynamic: Run as many scenarios and what-if analysis as needed.
Immediate: Run new calculations, scenarios, and re-plan in real-time.
Ready : Off-the-shelf model ready for a fast parametrization and deployment.
Scalable: Add new functionalities and customize your solution to meet your needs along every step of the way.
And most importantly, the proof is in the pudding! Achieve high ROI either by improving customer service, reducing safety stock levels, or even both! Here is the latest study on Anaplan’s ROI. https://www.anaplan.com/papers/forrester-total-economic-impact-2019/
The beauty of this community is the active engagement of its members and their Anaplan / business acumen, so feel free to share your thoughts, comments, and requests in the comments section below.
Interested in having a chat on how Anaplan can help you to optimize your inventory or boost your supply chain planning? Or why not book a Taster Session with Olivehorse? We’d be more than are happy to spend half a day with you to show you the value that Anaplan can bring to your company. Book your Taster Session now: https://inbound.olivehorse.com/anaplan-free-taster-session
Alejandro Gomez is Senior Anaplan Consultant at Olivehorse. He's worked with Anaplan for six years and has experience in Anaplan Implementations in different industries, countries and successful implementations in multiple lines of businesses. As a fully certified Master Anaplanner, Alejandro has witnessed first-hand the power of Connected Planning.
At Olivehorse, we are experts in Anaplan and supply chain management. Our depth of application knowledge and practical know-how, combined with an unrelenting focus on finding you the best, results-driven SCM solution, makes us unique in what we do.
... View more
Hi @subhashree I noticed that your source module was using a composite hierarchy, and Indeed my example uses a flat list. I believe it does not change neither the nature of the issue nor the solution and I assumed it will serve the purpose of illustrating a solution. Sorry for not making it clear enough. I believe we are totally on the same page, just bear in mind that in your source module, you can aggregate all the invoice numbers (level 2 of your hierarchy) to PO NUM (level 1 of the hier.) just by leveraging Anaplan's automatic aggregations across hierarchy's items. This will give you totals of Invoice amounts at PO level, right? Then, at target module, by using the new list with only unique PO NUM items (As explained in my previous post, together with FINDITEM and SUM) you can sum up all the amounts of the same PO NUM item in just one unique item (eg: make the item "532838_1" display the aggregation of all the items "532838_1" from the numbered lists = 89,000 + 83,655). I am sure that just by following the steps you will get to obtain the results you are seeking. Give it a go and let me know, please. Cheers. Alex. Olivehorse
... View more
Hi @HendrikDeCuyper (edited) I have double read it and realised that the issue is with the "Group by" item. Could you attach a picture? Would be nice to see the format and formula being used to retrieve the values of the "Group By" Line Item. Regards, Alex Olivehorse
... View more
hi @Akshaykumar 1. Create a list with the unique POs (so you will only have one item for "53852328_1") 2. Create a module with the list of unique POs and a Line Item called "latest date" 3. Enter the following formula: Source.Date[MAX: Source.Mapping to Unique POs]. The above description together with the previous answer will provide you a list with all the unique PO codes, the latest date for each PO and the total amount per PO. Check out an example: Source: all POs with their creation Date and a LI with their "Unique PO" from the list created at 1 Target (notice that 53852328_1 is showing the latest date) I hope that solves your question. Regards, Alex. Olivehorse PS: may i ask whether you @Akshaykumar are working together with @subhashree on this?
... View more
hi @subhashree My suggestion is the following: 1. create a new list (no numbered) 2. Make sure that all the unique parents of your source list are in the new list. For instance, you can create an import action that loads the field "PO_Num_Line" as List Item names in the new list. 3. The action above will reject all the duplicates and you will end up with a list with all the unique names of your "parent items" 4. Again, in your source list, create a new Property formatted as the new List you have created at step 1. 5. Enter the following formula: FINDITEM("New List","PO_NUM_LINE"). This should retrieve the items from the List you have created at step 1. 6. Finally, in your target module, in the "Value" line item, enter the function "[SUM: new property from the source list]". These steps should allow you get the numbers you want without major changes in the current structure of your model. Please, let me know how it went. Cheers, Alex Olivehorse
... View more
hi @Sravan_Kumar I have noticed a couple of issues in the attached pics: 1. in your "SS 4" pic, I have noticed that you are trying to use a different list in the FINDITEM formula: As you can see, you are working with LIST "ABC. Order Quantities Patent" whereas in your formula your are trying to use the codes from the list "Order Quantities Parent". Even if both lists have the same items, both lists are not related to each other for Anaplan, therefore you cannot use the code from a 3rd list for this purpose. In other words: you can only use name, code or properties of the list where you are trying to implement the FINDITEM function (or module where that list applies). 2. Then you are trying to use CODE to Find items from "ABC L2 Brand", whereas you do not have CODE in your list "ABC, Order Quantities Parent" (as per pic "SS 3"). So, my first suggestion for you would be to replace CODE by NAME in your formula at "ABC. Order Quantities Parent", since names on both lists seem to be the same. Otherwise, make sure that the items from both lists have the same codes. Id est, replace the underlined formula by this one: FINDITEM('ABC. L2 Brand',NAME(item('ABC. Order Quantities Parent'))) Else, apply the same formula as per your pictures in list "Order Quantities Parent" instead of "ABC. Order Quantities Parent". Please, let me know if it works. Alex. Olivehorse
... View more
Hi again @Jsdeloria21 , In order to meet your need and improve performance as per @rob_marshall suggestion, you can use the formula shown below: As you can see, the output is exactly the same as CUMULATE (which is what I understood you need), but it only uses PREVIOUS. Thanks Rob for your input. Let us know if it works Alex.
... View more
Hi @Jsdeloria21 To judge from the comments and the pic attached in your second post, I would say that you should use CUMULATE CUMULATE will accumulate the "1" along the time period. As you can see, TIMESUM will retrieve the total of the whole time-dimension (unless you specify the beginning and ending of the time range you want to use). I hope this helps. Alex. Olivehorse
... View more
Hi firstname.lastname@example.org That is not quite the way FIRSTNONBLANK works, I believe. Here is why: the item in the brackets must be formatted as a dimension that you have in your target module. Lets take this example form Anapedia: customers is list formatted in the Source and is a dimension in the target. So, in your case, Time is the dimension you want to get rid of, so that is why is not working. I suggest as a work around for this, to use use the Summary Methods from the source line items: In your source module, in the Line Items calculating the Dates, goto summary methods and set time summary to First non blank or Last non blank. Then in your target module, just refer to the Line Items with the dates that you want and use the function [SELECT: TIME.All Periods] . I hope it helps. Cheers, Alex. Olivehorse.
... View more
Hi @MarkTurkenburg Since you are already using both lists in the same modules, I would suggest to create a line item, text formatted (yes, I know what the plannual says about text) and concatenate either names or codes of the items from the lists you want to merge together: Then display the view of the module so the 2 lists to be combined are nested in rows and only the leaf level items are shown. In columns you can display the Line Item with the concatenation of names or codes along with other Line Items that you would need as attributes for your new list (YEs, I know what the plannual says about properties in Lists 😛 ), like for instance the name of each of the individual items that compose the combined item. Something like this: Then save the view. Now, Go to the settings tab of your module and to the new list you have created to host the combinations of List 1 and 2 and hit "import". Select the saved view from step above: Is up to you if you want to identify your newly created items just by name, code or both in the mapping step: Your final list will look like this. You can get the items of the original lists (to perform look-ups, sums and this sort of stuff across modules) either by loading them as properties from the source module (As per the example above) or using FINDITEM on the Concatenated Name/ Code. Just be aware that for your numbered list, the NAME function retrieves the internal code that ANaplan assigns to items in numbered lists, so i would suggest you to use a combination of Codes. I hope this helps to overcome you problem. Cheers, Alex. Olivehorse
... View more
I truly appreciate this chance, thanks Frank for your time and Community for arranging this. As a partner and model builder, there are 3 questions that I would love to ask Frank: 1. Workspace allowance. We were told in the last CPX that the data limit of 130Gb per workspace is going to be extended in the short term. Is is happening any time soon? Can you give us a clue of what the new limit will be? 2. Integrated Machine Learning or AI. Since Anaplan acquired Mintigo, I am wondering if we are going to see integrated ML / AI functionalities in the platform soon? And, if Yes, how are they going to look and feel for the workspace admins. This third one is just out of my curiosity: I have been using Anaplan since early 2015 and I have always wondered why there have been so many functions for Call Centres since the early stages of the tool???? Thanks a lot again and looking forward to watch you on-line. Alex.
... View more
hi @PujithaB I would say that you need to create a module with the time dimension and one line item for each item in your formula: OPEN BALANCE CF Inc/dec in Receivables CLOSING BALANCE CF Inc/dec in Receivables Customer Accounts Receivable Other Receivables Accounts Payable - Intercompany Then use the function PREVIOUS (most likely, else try POST or OFFSET). Finally, in order to avoid the loop, I suggest to break down the formula into 2 items: Open Balance for Receivables and Closing Balance. It will look something like this: OPEN BALANCE CF Inc/dec in Receivables = previous(Customer Accounts Receivable)+previous(Other Receivables)-previous(Accounts Payable - Intercompany)) CLOSING BALANCE Inc/dec in Receivables = OEPN BALANCE CF Inc/dec in Receivables - ((Customer Accounts Receivable)+(Other Receivables)-(Accounts Payable - Intercompany)) Please, let me know if it helps. Cheers, Alex Olivehorse
... View more
Hi @vprasad are you using Anaplan connect 220.127.116.11 or 1.4.1? If is 1.4.1, the certificate line is missing. If is 18.104.22.168, just get rid of the "Serviceurl" and "Authurl" lines and use quotations for enclosing your name and password and it should work. An example of a working script for 22.214.171.124 here (for downloading an export from Anaplan): @echo off rem This example loads a source text file and runs an Anaplan import into a module. rem For details of how to configure this script see doc\Anaplan Connect User Guide.doc set AnaplanUser="email@example.com:password" set WorkspaceId="12335578hh6" set ModelId="9ew8w490f89ee235245" set Operation=-export "name of the export at Anaplan's actions panel" -execute -get "C:\Anaplan_Connect_126.96.36.199\TEST.xlsx" rem *** End of settings - Do not edit below this line *** setlocal enableextensions enabledelayedexpansion || exit /b 1 cd %~dp0 if not %AnaplanUser% == "" set Credentials=-user %AnaplanUser% set Command=.\AnaplanClient.bat %Credentials% -workspace %WorkspaceId% -model %ModelId% %Operation% @echo %Command% cmd /c %Command% pause
... View more
Hi @PujithaB That is a simple and yet rather interesting question! I would like to just add to @LipChean_Soh answer that in case of uploading large files, these can be zipped in order to reduce the time that it takes to load them into Anaplan's server. More info here. I have tested it myself with a 2.26 Gb CSV and its zipped version (17.4 Mb) and the difference in terms of time to get the file loaded to Anaplan's server is huge (around 30 min vs a few seconds - with the same connection). Finally, speaking about the risk of running out of memory when loading a large file. Assuming that the module receiving the data is not connected with any other module/list in any way (so we only have to worry about the module receiving the data itself), the same 2.26Gb CSV translates into a 3.57Gb module in Anaplan, i,e around 55% more space in Anaplan than in the CSV. (The test module is just a table made of one list (3,989,350 items) + Line Items (140) across columns, all the LI formatted as text, same format and display applies for the CSV). I hope this helps you out to have a better sense of the space requirements in your Workspace based upon your source files and the load times (and how to reduce them!) Cheers! Alex Olivehorse
... View more
Hi @AnushaAttuluri Even though more nuance would be welcome for a better understanding, I think these are the most likely reasons for your outcome: 1. Settings: Make sure that you set the optimiser to look for an optimal solution (as opposed to a "feasible" and sub optimal solution) 2. Approach: There are quite a lot of candidates to be causing the issue here: Since you mentioned that the variables (supply and demand) are independent per Plant, I am wondering how do your constraints, other variables and objective function look like, since they could be disconnected too. For instance; if your objective function is to minimise the total aggregated inventory cost of both plants (I assume) but you do not specify a constraint that both plants must satisfy their respective demands, the Optimiser will just assign more stock to the most "cost-effective" plant, ignoring the demand of the most "expensive" one. I hope that this "brain storm" will help you to approach your problem in a different way and get closer to a solution. Else, I am afraid that more details from your side would be necessary. Cheers! Alex OLIVEHORSE
... View more
Hi Callum, good catch! Indeed, moving from DATE to TEXT is not straight forward either since there is not a function yet for it. I have up-voted the request that you have shared. thanks! Alex.
... View more
Hi all, I just want to share a simple table as a summary of the functions needed to convert data across formats in Anaplan. Is not a big deal, but I hope it comes in handy to some of you. * Transform Text into Date is not that straight forward since it is needed to chop the date in 3 chunks: the day (DD), the month (MM) and the year (YYYY), use VALUE to turn them into numbers and then use the function DATE to fetch the date. Kind regards, Alex.
... View more
Hi @rob_marshall thanks a lot for taking the time to provide further explanations. I have been having a look on how could I use ANY, FirstNonBlank and the other functions as a replacement of TEXTLIST or as an "Inverse Lookup". My conclusion is that, while x[ANY:y], x[ALL:y], x[MIN:y], FirstNonBlank and so forth, in some cases, can be used as a replacement for TEXTLIST - so is nice to know how they work and when can be used in order to improve the performance of our Anaplan Model - they cannot fully replace TEXTLIST. Even when TEXTLIST is harmful in terms of performance and calculation speed when be abuse of this solution, there must be a reason for having this function among Anaplan's formulas in first place. So,In my eyes, while x[ANY:y] and x[ALL:y] are good options when handling booleans, and x[MIN:y], x[MAX:y], x[Average:y] and SUM are useful when it comes to number-formatted LI's, when it comes down to Text, FirstNonBlank and LastNonBlank might offer better performance by handling a lower amount of text, but do not offer the same result. I will like to conclude with a simple example of this: If we have a list of Sales Reps with 2 attributes: Sales Region and Product Category And we would like to know the different product categories being sold per region, I would use Textlist: Since First and Last Non Blank will omit the in-between values. The reason why I have written this reply is because it has been nice to me to stop for a while and compare the outcomes of the different formulas that you have proposed as alternatives. Then, I just wanted to share my conclusion with you @rob_marshall in particular (since is always nice to read your eye-opening comments) and with anyone who might find this of any help. Cheers. Alex.
... View more
@rob_marshall thanks for pointing out that there is flip side of this and remind us that we must keep an eye the performance always! About the alternative that you propose, I would appreciate a lot if you could elaborate: " using two dimensional modules and Boolean flags with ANY". I cannot get my head around it and it sounds very interesting. Cheers! Alex.
... View more
Hi all, During the last CPX in London, which was fun and insightful, came to my attention the fact that still now-a-days the most searched topic in Anaplan Community is "how to use Lookup and Sum". That is why I decided to share with you all this visual and brief explanation of how Lookup, Sum and Textlist work, I hope you find it as handy as I do! This post is intended to be complementary to the existing explanations in Anapedia, a "cheat sheet" to be revisited quickly when you get doubts about how these formulas work or you are not sure which one to use to make the data flow into your module. To use this Cheat Sheet you only need to bear these 3 points in mind: 1. Think in terms of Source Module (where our data currently is) and Target Module (when do you want to retrieve it) 2. Be aware of the dimensionality of both modules (Source and Target) 3. Be aware of the format of the Line Items being used. Either because some functions only work with data in a specific format (SUM with Numbers and TEXTLIST with Text) or because you will need LI formatted as the Lists being used as Dimensions in Source/Target modules. CHEAT SHEET LOOKUP Target Module must have a LI formatted as a List ("LI: Employee" in the example below) being used as a Dimension in Source Module ("Dim Employee"). TEXTLIST Even though this formula is meant to retrieve text strings, it can be used as a Reverse Lookup. The only limitations is that, whereas Lookup can retrieve any kind of data formats, Textlist only retrieves Text-formatted values. So turn your source data into text, get them into your Target Module and convert them back to their original format. SUM It works quite similarly to TEXTLIST but only works with Number-formatted Line Items. For instance, in the example above, since Salary is by definition a Number-formatted magnitude, we should have used SUM. Remember that SUM is to be used when there is no hierarchical relation between the Dimensions in Source and Target Modules. If one of the Dimensions in Target is Parent of the Dimension in Source, aggregation happens automatically (as long as Summary Method is not set to "None" in the Source Line Item) If one of the Dimensions in Target is Descendant of the Dimension in Source, then LOOKUP should be used. I hope this helps you to connect your data across modules rapidly next time you hesitate about how to do it! Kind regards, Alex.
... View more
Hi there, I have a data-input module with the users dimension in it, so different users can enter new items in that module simultaneously and then create them in a list by using an import action. The problem is that, since some of the users working on that module are Workspace admins, when they push data from the data-input module to the list using the action, as they have access to all the users in the user list by default, they push at once all the data being entered by the different users working on the mentioned module. I managed to solve it with a dummy-user list and selective access applied to it, but the draw back is that is harder do maintain (now I have 2 users list instead of one). I would like to ask if is there a way to "filter" or limit the user list in the data-input module, so workspace admins will only load the data being entered by them when running the import action. Cheers, Alex.
... View more