New TSM4 Beta Version and Invites!

The TSM4 beta is always evolving and today we have some updates to share with you. We’ve been working hard to get TSM4 closer to release. While there is still a lot of work to be done, we’re excited to share our latest progress. There are a few big new features that we’ve been focussing on and will go through in this blog post.

New TSM4 Beta Features


Moving functionality from TSM3 to TSM4 is a big part of the massive project that is TSM4. Importing and exporting of groups and operations are features used by many of our users on a daily basis. There are many enhancements planned for the export feature in TSM4, and we’ve made great progress towards implementing our vision for an awesome export feature. With this latest update, we’ve implemented the brand new TSM4 export UI which makes it as easy as possible to export groups and operations. This is a feature which we will continue to build on and improve as we get closer to the release of TSM4.

Main UI Settings

Many pieces of TSM4 are still in TSM3 placeholder mode. In this update, we’ve removed the TSM3 placeholder settings and replaced them with the new, fully-implemented TSM4 equivalent. With the various settings there are to configure TSM, we’ve had a real good look at our settings window and completely reorganized the settings tab. Navigating to find the setting you’re looking for might take some getting used to, but should feel far more intuitive.

Shopping Advanced Item Search

The shopping advanced item search UI was in an interesting situation where it was inheriting the TSM4 looks, but it hadn’t actually been fully finished from a UI perspective. With this new update it’s been rewritten and you’ll see that everything looks much better and aligns with the overall look and feel of TSM4.

New Beta Invites

TSM4 is a massive project, and it’s great to see how many people are already enjoying using it as part of their gold-making routine. At the same time our beta testers have been sending many bug reports our way, which help out greatly in ensuring that TSM4 will be as stable as possible once it launches. With the big new changes we’ve announced above, we’ll be pushing a staggered wave of invites over the course of the next seven days to get a bunch of new people into the beta to try them out. If you haven’t signed up for the beta yet, you can do so here to reserve your spot in line for future beta invite waves.

In short, TSM4 is constantly evolving, and we’re spreading the love by sharing some great new updates with you as well as sending out our biggest wave of beta invites yet! If you like what we do and would like some extra functionality, please consider becoming a TSM premium user. It includes priority access to all of our betas, including TSM4.


This will be a very technical blog post which provides a look into the new class library which has been added to the TSM codebase with TSM4. This is an internal code library which makes it easier for us to implement new features in TSM4. This new class library is the base for many other internal code libraries in TSM4 such as our UI Builder, Database, and FSM libraries. We will go into more detail on the other libraries in future blog posts.

What is a class?

A common feature of a programming language is being “Object-Oriented”. This means that the structure of the code is based around complex data structures called objects. The type of these objects is generally referred to as their class. The class describes the structure and features of the objects.

Let’s take a TSM group as an example of how utilizing classes can be beneficial (note: in practice, TSM doesn’t use classes for this purpose). A TSM group, at its core, consists of four things: the name of the group, some sort of reference to the parent group, a list of items which are in the group, and a list of operations which are applied to the group. A user may have hundreds of different groups, but they all have these exact same attributes.

A class allows us to easily represent this structure in code and anything which is defined as part of this class will automatically be shared among all instances of the class (all groups). Having this structure also allows us to easily enforce restrictions such as not allowing specific characters in the name of a group, or only allowing a single Crafting operation to be applied to a group. This is generally done by prohibiting outside code from modifying the attributes of objects directly, but instead providing class methods which can perform this validation. For example, if I have a group object `x`, rather than changing the name via ` = “foo”`, I would instead call a class method such as `x:SetName(“Foo”)`. This means that there is a polished set of APIs for interacting with the objects of each class defined by the class methods. Below is an example of how this might look in pseudo-code:

` ` `

define class TSMGroup {

   string name;

   class parentGroup;

   list items;

   list operations;


   function SetName(string newName) {

       if (newName.contains(SOME_INVALID_CHARACTER)) {

           return false;

       } = newName;

       return true;




// create a new group

group = new TSMGroup();

group:Setname(“My Group”);

` ` `

As you can see, we can use classes to define exactly what a TSMGroup is and what methods it supports, and then create objects of that class (aka. instances of the class) which behave according to the class definition.

TSM’s Class Library

Lua, the programming language used for WoW addons, is not generally considered an object-oriented language in that it doesn’t natively support classes. However, through something called metatables and metamethods (which I won’t go into great detail on here), we can extend the language to support them. The class system implemented by the class library in TSM4 does not support every feature that traditional object-oriented languages support, but it does allow for enough of them to allow us to use classes effectively in TSM.

Specifically, the TSM class library supports inheritance and polymorphism. The former means that classes can be subclassed to extend the functionality. For example, a TSMImportedGroup class could be a subclass of the TSMGroup class and could be used as part of the import process to represent a group which came from an import string that has additional methods ontop of those defined by the base TSMGroup class. With support for polymorphism, code can be written in a way which it can operate on an object which may belong to either a class or subclass without needing to explicitly know which is the case. For example, the `SetName()` method may be called on a TSMGroup object or a TSMImportGroup object without the calling code needing to know the type of the object is calling the method on. The TSMImportGroup object can even override the implementation of SetName() if it wants to impose additional restrictions on the name of the group for example.

In the future, I’d like to add support for access restriction to the class library so that the use of proper APIs when interacting with objects can be enforced.

Digging Deeper

There is a lot more to the TSM class library. If you want to see the code, you can check out the implementation and some unit tests here.

See TSM4 by watching our affiliates

If you haven’t yet received an email inviting you to the TSM4 beta, then that doesn’t mean you can’t see it in action. There are many people who stream their goldmaking activities, and some of them have beta access. If you don’t have a favorite streamer or community person, we’ve included a list of our affiliates here. Hopefully between them you’ll find someone to your liking!

Phat Lewts
Arganthe (Portuguese)
Totemwerfer (German)

For those of you who’d prefer to listen to one of TSM’s own team members, Gumdrops regularly streams his goldmaking and answers any questions people have about TSM, including taking a look at new versions of TSM4 as they are released. Be sure to go check out his streams if you’re interested!

If you want to ensure you get into the beta as soon as possible, you can go ahead and sign up for an invite here. If you like what we do and want to support the continued development of TradeSkillMaster and also get priority access to all of our betas, please consider becoming a TSM Premium user.

Deployment System

In this blog post, I will be giving a behind-the-scenes overview of the new deployment system we have created and been using throughout the development of TSM4.

Why did we create this new deployment system?

The primary goal of all this was to make it quicker and easier for us to get new changes into the hands of our users, and give us the ability to control which sets of users get which changes. Let’s talk about the latter goal first. We currently split our users into 4 separate release channels: Internal, TSM4 Alpha, TSM4 Beta, and TSM3 Release. The ‘Internal’ channel is used primarily for TSM team members for testing the very latest changes. The ‘TSM4 Alpha’ channel was used during the invite-only alpha phase of TSM4. The ‘TSM4 Beta’ channel is currently being used for everybody who has access to the TSM4 beta. The ‘TSM3 Release’ channel is one which all of our users have access to, and gives all of our users access to the latest version (of TSM3) we push to Curse. These release channels can easily be changed and adapted as our needs change (i.e. as TSM4 goes from internal-only to alpha to beta to release). So, the goal of our deployment system is to make it as easy as possible to release new versions to the proper channel.

How do we do this?

We currently use Bitbucket to host our source code repositories. In the past year, they added a new Bitbucket Pipelines feature, which is a build and deployment system. Because we already use Bitbucket tools so extensively, and Bitbucket Pipelines integrates nicely with the features we already use, we decided to utilize it for our deployment system.

Whenever there is a new change made to our TSM4 code branch and we want to release a new version to our beta testers, we simply hit a few buttons within our Bitbucket repository to start a deployment. The details of what happens as part of this deployment is entirely custom. In the case of the TSM addon, this involves taking a snapshot of the current code, removing our internal files which we don’t want to be included in the release, writing the version to the correct addon files, and packing it up into a .zip. This .zip file is then stored on our server for the app to download and marked as the latest version for the appropriate channels.

Future Plans

Once TSM4 is released, this deployment system potentially allows us to do more regular, staged releases. For example, we can release new version to a smaller set of beta testers to ensure there are no critical errors before releasing it to our entire user-base. In the end, this means that we can get more high-quality releases out to our users on a regular basis with less administrative effort on our end.

The Design of TSM4

The TSM Team has been hard at work for a very long time to bring you the TSM4 beta. We wanted to give you some technical insights on what goes on behind the scenes. Today we’ll be taking a closer look at the Design of TSM4. H3ggers will be joining me to answer some questions!
I asked him three questions, and he’s been so kind as to offer detailed answers to them.

On a high level, what goes into setting up a UI from the ground up like this? How much of the old UI gets taken into account, and how do you decide what is best from a user experience standpoint?

Great question. So for any UI/UX work, it’s always good to start with research. Whether you’re working on a brand new product or something that has been around a long time (like TSM), you always want to start by investigating. You focus on what has been done, is being done, what’s working and what isn’t.

With TSM, I had a great leg up in that so much thought has already been put into it, especially in terms of what its features are and what users have wanted added over the years. So yes, the old UI was extremely important from the perspective of starting fresh. The old UI really tells a story about how TSM has developed over time, and why, what its strengths are but also what its weaknesses have been. So it was super helpful when setting out what we would and wouldn’t do from a “refresh” point of view.

As far as going from there and making decisions, I wanted TSM4 to not stray too far from its core competencies, but overall feel more approachable and intuitive. TSM is tricky in that it has always been perceived as a “challenging” addon, with a very steep learning curve. And a lot of that I think has to do with the fact that it has very advanced features comparative to other addons on the market (what other addons can you name that essentially have the equivalent of a file management system within them?). So just the scope of what you can do with TSM is a bit staggering for a new user and I think in some sense, always will be.

But that doesn’t mean there weren’t gains to be made that would help us hit our goals of being more approachable and intuitive. I think in TSM4 we were able to really think about how certain features would be organized and maybe move away from some things in TSM that didn’t really make sense (I’m looking at you ‘Features’ tab).

From a purely stylistic standpoint, what was your thought process on what TSM4 has come to look like? Why did you choose the colors, shapes and style that you did?

Stylistically, TSM operates in an interesting space. Historically, the look of TSM has developed through what I would call a “path of least resistance” mindset. We’ve added and improved upon features but haven’t really thought through the design outside of, “what sort of component do we need in order to achieve X/Y/Z, and where can we place it?” And while this has been done thoughtfully, with great concern for usability, I felt it had led to a somewhat scattered design aesthetic. So my first thoughts about style had to do with just keeping things clean and providing a less cluttered experience.

After that, it was really a matter of what sort of tone and personality TSM needs. I find that addons are a really unique design challenge, because you have to decide if they should align closely with the game’s default UI, or carve out a style all their own. With that said, I opted to keep a clean, modern aesthetic that wouldn’t diverge too much from what existed and wouldn’t be too jarring for our users. Down the road I think it would be cool to think about ways in which we could open TSM, stylistically. One of the early things that always impressed me about TSM was that it had a pretty robust appearance editor. Unfortunately, we rolled that functionality back for the time being due to the nature of the overhaul; I’m personally hoping we can bring it back (in a more structured way) at some point, and possibly even augment that feature with things like “UI skins”. TBD obviously 🙂

Are there any constriction points where looks and function conflict with each other? In such a situation do you make concessions, or look for a different solution?

Hah, oh yes! Design is always about balancing your stylistic goals against usability and feature requirements. The team and I had many conversations about certain design choices that might conflict with learned behavior and expectations from our users. I know that I’ve certainly conceded some ideas in favor of keeping a certain workflow or feature in tact.

This is one area where I really like to look at what our users are saying. There are so many unique aspects to TSM, and our users have all developed different ways of approaching certain tasks. Being able to engage with our community and test certain ideas out with them is really great and I hope that we’ll only continue to grow that process as it makes designing a lot easier.

That wraps up this first Technical insight into TSM4! We have more planned for you so if you enjoyed this content be sure to keep an eye on our blog!

TSM4 Deep Dive: Logic Functions & Value Sources

Logic Functions

Many users have become somewhat aware of the check() function in TSM3 thanks to the popularity of BilisOnyxia’s sniper string. In my own personal experience, check() is definitely something that at times can be hard to wrap your brain around. I’m pretty sure I used TSM for over a year before I fully understood it!

To quickly explain check(), you can feed it 2 to 3 values in the format of check(a, b, c) where “c” can be optional. These 3 values can be any value TSM recognizes, from custom prices to flat gold values, to simple price source references like DBMarket. The check() function then takes a look at “a”, and looks to see if it is valid and greater than 0. If “a” is not valid, the custom price returns invalid. If “a” is greater than 0, the custom price will give you the value of “b” back, otherwise it gives the value for “c”. If you did not supply a value for “c” and “a” is not is not greater than 0, then the whole thing is treated as invalid.

In TSM4, one of our main goals was to expand on the logic-based functionality of the check() function and make it easier and more intuitive for our users to incorporate logic in their custom prices. With that in mind, TSM4 adds the following new functions:

ifgt() – “If Greater Than”
ifgte() – “If Greater Than or Equal To”
iflt() – “If Less Than”
iflte() – “If Less Than or Equal To”
ifeq()- “If Equal”
round() – “Standard Rounding”
roundup() – “Always Round Up – aka Ceiling”
rounddown() – “Always Round Down – aka Floor”

The “IF” functions are all used in the same way. You can send in 3 to 4 values in the format of ifgt(a, b, c, d) where d can be optional. TSM4 checks if “a” and “b” are valid in the same method used for check() above. TSM4 then looks at which “IF” function you are using, in our example I am using “if greater than”, so it checks if “a is greater than b”. If it is, the value of “c” is given back to us. If it is not, the value of “d” is given back if one was supplied, otherwise the whole thing is treated as invalid.

The “Round” functions also follow a similar usage to each other. You can send in 1 to 2 values in the format round(a, b). The first value “a” is the number you want to round and the second value “b” is the factor you would like to round to.  For example, “round(crafting, 10s)” would return the crafting cost rounded to the nearest 10 silver. If no value of “b” is sent in, then the functions round to the nearest copper, as appropriate.

Value Sources

We currently offer many different prices from various sources including AuctionDB, Accounting, and more, but we recognize that these are not the only values that are important to TSM users when configuring their operations. We currently provide other pieces of data such as sale rate and number of expires in item tooltips, but there is currently no way to use this data in custom prices directly.

In TSM4, our goal is to expose as many values as possible for use directly in custom prices. Not all of these values are prices, hence the new name of “value sources.” These are the value sources that will be available with the launch of TSM4 for use in custom prices:



Below are a few examples which demonstrate the power of the new custom prices changes coming with TSM4.

iflt(DBRegionSoldPerDay, 100, DBMarket, DBRegionMarketAvg)

The above function will return the DBMarket if DBRegionSoldPerDay is less than 100, otherwise it’ll return DBRegionMarketAvg.

round(DBRegionMarketAvg, ifeq(ItemQuality, 4, 1000g, 1g))

This second example will round DBRegionMarketAvg to the nearest 1000g for epic quality items (ItemQuality 4) or to the nearest 1g otherwise.


I cannot wait to get all of these new tools into the hands of our amazing community! If you want to ensure you get into the beta as soon as possible, you can go ahead and sign up for an invite here. If you like what we do and want to support the continued development of TradeSkillMaster and also get priority access to all of our betas, please consider becoming a TSM Premium user.

The TSM Team is Going to Blizzcon

The TSM Team will attend Blizzcon this year! We’re thrilled to be going, and can’t wait to meet everyone. While some TSM Team members have met each other in person, this will be the first time most of the team will be in one place. We are also extremely excited to meet all of you and talk shop about all things TSM and WoW gold making! Read on to learn more about what we’ll be doing during Blizzcon and where you can meet up with us in person or online.

Q&A Stream

On November 2nd, at 11AM PDT, the TSM team will be doing a live Q&A stream from Anaheim, California, and you’re invited to tune in to learn more about TSM4, hear about TSM from the team who makes it happen, and get your questions answered. Gumdrops, our Support Manager & User Evangelist, has been so kind to allow us to use his Twitch channel for this Q&A stream, so be sure to tune in!

Talk to us in Person

For those of you lucky enough to have secured a Blizzcon ticket of your own, we invite you to seek us out during the convention days. Please don’t be shy to say hi if you see us walking around the convention hall. We’re very anxious to hear what you think about TSM and the state of gold-making in WoW. You’ll be able to recognize us by the special TSM Team shirts we’ll be wearing. You can expect a picture of all of us in our shirts to be posted on our Twitter soon!

Something for You

At Blizzcon, we’ll have some awesome goodies to hand out. One of them is a very cool TSM sticker, which you’ll be able to stick on your phone, laptop or anywhere else you want to show off your gold-making prowess! Secondly, we’ll have our own spin on Cards of Omen. These are custom printed cards with a very cool TSM-based design. The backside will hold a code for at least one month of premium, but it could be much more!

We’re incredibly hyped to be attending Blizzcon as a team this year and get to meet as many of you in person as possible. We hope you’ll say hi during Blizzcon, either in person or at home during our Q&A stream.

TSM4 Deep Dive: Sniper

Sniper has long been a very popular feature of TradeSkillMaster, with many goblins even setting up a second, dedicated sniper account. The Sniper feature allows for snatching up deals as quickly as possible once they are posted on the auction house by constantly scanning the most recently-posted auctions and comparing the buyout price with user-configured maximum prices at either a global or operation level.

In TSM4, we’re making Sniper a first class feature by adding new Sniper operations and a top-level Sniper tab to the Auction House frame. We’re also adding an entirely new type of sniping in the form of a new Bid Sniper.

Sniper Operations

In TSM3, Sniper configuration is done at either a global level or within Shopping operations. Our reason for putting the configuration in Shopping operations in TSM3 was that we felt users would likely have the same max price for Shopping as they would for Sniper. However, this has traditionally led to some confusion, and is a bit limiting. Now that Sniper is a first class feature, we’ve created an entirely new type of operation for Sniper.


As shown by the screenshot above, there is just a single “Below custom price” option for specifying your max price while sniping within Sniper operations. This max price will apply to any items within groups with this operation applied, or, if you have a Sniper operation applied to the new Base Group, it’ll apply to any items which aren’t in any group at all. TSM4 will ship with a default Sniper operation which will come pre-loaded and applied to the Base Group to allow new users to take advantage of the Sniper feature immediately upon installing TSM4.

Sniper Auction House Tab

Upon switching to the new Sniper tab in the TSM4 Auction House UI, you’ll be prompted with the option of starting either a Bid Sniper or Buyout Sniper. The Bid Sniper is a new type of sniper which, instead of looking for recently posted auctions, looks for auctions which are about to expire which have a bid price below the max price you have set in your Sniper operation. If you click on the “Run Buyout Sniper” button, the Buyout Sniper scan will start.


There are a ton of new features in the TSM4 Sniper. For example, the progress indicator at the bottom will animate to indicate that the scan is in progress. One common issue people run into with Sniper is phasing. This is a bug on Blizzard’s end where the AH freezes when you phase between servers without giving any indication of what has happened. TSM4 is able to detect this and will warn you when it happens so you can re-open the AH to resume your scan. Also, the results are now sorted by how recently they were posted so the newest results will always be on the top, ready for you to buy as quickly as possible. One common piece of feedback we’ve gotten from users is that some items show up in the results which they don’t want to buy, so in TSM4, we’ve added an easy way to clear an entry from the results table as well as a way to quickly restart the scan to clear all the results.

Join the Beta

As you can see, Sniper is better than ever in TSM4 and we’re super excited for you to try it out for yourself. If you want to ensure you get into the beta as soon as possible, you can go ahead and sign up for an invite here. If you like what we do and want to support the continued development of TradeSkillMaster and also get priority access to all of our betas, please consider becoming a TSM Premium user.

TradeSkillMaster 4 is Here and it is Better Than Ever!

Over the past few weeks we’ve kept you all in suspense. If you’ve been paying attention, then you know by now that TSM4 is coming. Here, we’ll go into a bit more detail on what TSM4 will bring.

Making TSM Better for Everyone

The main focus with TSM4 is to make TSM less intimidating and easier to use for newcomers and experienced goblins alike. To this end, we’ve completely rebuilt the UI from the ground up to be simpler and more intuitive to navigate. Even though ease of use was one of our main goals, we’ve not forgotten about our power users, and have plenty of goodies in store for them as well!


The first thing that you will notice when opening up the core TSM4 window is a beautiful new dashboard where you can see a summary of your gold making and catch up on TSM news. The dashboard will show you how you’re doing with your gold-making and help you decide at a glance what to do next. The graph within the dashboard is highly interactive and allows you to quickly and easily track your gold on hand over time as you pursue your gold-making goals.


One of the major hurdles new TSM users face is setting up meaningful groups and operations. In TSM3, we introduced the “Quick Post from Bags” feature, which gives easy-access to the powerful functionality of TSM_Auctioning to post items on the auction house without having to create groups and operations. With TSM4, we’ve taken that a step further with the new “Base Group” which lives at the top of the group tree. This group automatically contains any item which is not in another group, and comes pre-loaded with powerful default operations for more than just Auctioning. We’ve also completely reimagined how group management works in TSM4 to make it easier to move groups around, rename them, and manage the items and operations which they are tied to.


One of the most popular features of TSM is its sniper feature. This feature allows you to snatch up deals the second they are posted on the auction house. With TSM4, we’ve integrated all the great feedback we’ve received on the sniper feature to make it easier to use and even more powerful. The sniper settings have been simplified into new dedicated sniper operations, including a default operation which comes pre-loaded in the addon. Once you start the sniper scan in TSM4, you’ll notice that the results are now ordered conveniently with the most recent results shown at the top, along with a special icon to clearly call-out the newest results. We’ve also made it much simpler to buy items as quickly as possible by getting rid of the confirmation window and replacing it with a single buyout button. Because we know people like to run sniper in the background for long periods of times, we’ve also added a new way to quickly remove things which you’re not interested in from the results, or restart the search completely to clear all the results and start fresh.

TradeSkillMaster has always had extremely powerful features to help advanced goblins make gold as efficiently as possible, and TSM4 is no different. Complex custom prices have become a staple of any mature TSM setup, so we are very excited to announce that TSM4 brings many new functions and data sources to custom prices. This includes everything from new, advanced logic functions, to being able to use things like sale rate and inventory quantities in your custom prices. We can’t wait to see how people take advantage of these new custom price features!

In summary, TradeSkillMaster 4 brings powerful gold-making features to experienced goblins and causal gold-makers alike. The entire addon has been rewritten from the ground up to be a joy to use, and to drastically lower the barrier to entry into the world of gold-making. This is evidenced in everything from the new Base Group and Dashboard features to the cleaner, yet more powerful sniper UI which we showed here. We also didn’t forget about our most advanced users and TSM4 brings powerful new features to them as well with the new custom price functions and sources.

Join the Beta

We’re sure you’re super excited about TSM4, and are dying to know when you can try it for yourself. We share your excitement, and in that light, we’d like to announce that the TSM4 beta is to be expected in late November. We know it’s still a while away, but we promise it’ll be well worth the wait! Upgrading to TSM4 will be a smooth and completely painless process, with all your important TSM settings being preserved. If you want to ensure you get into the beta as soon as possible, you can go ahead and sign up for an invite here. If you like what we do and want to support the continued development of TradeSkillMaster and also be first in line for the TSM4 beta, please consider becoming a TSM Premium user.

Stay Tuned!

Between today and the TSM4 beta, we’ll be diving deeper into the countless changes TSM4 will bring, so stay tuned for future blog posts. If you don’t want to miss any, you can sign up for our mailing list here. These deep-dives will cover various topics, from the new custom price functions and data sources to the new TSM4 design, and much more that we couldn’t fit into this post!

If you’re dying to learn more about TSM4, Sapu, TSM’s lead developer and project manager, will be doing an AMA over on the /r/woweconomy subreddit at 11AM PDT. The AMA has ended! The thread, named “TradeSkillMaster 4 Announced plus Lead Developer Sapu Q&A!”, is still available for you to read through!