How to win at Markstrat (Markstrat Tips and Tricks) – Vodites

I will briefly share my learnings about the Vodites market.

My main view is to be the first to enter the market. The trick is to enter with the basic and least expensive product, as long as you are the only product in the market, the consumers will have no other choice but to purchase your product. The ad spend doesn’t have to be very high since there would be no competitors. Though you still need to maintain ad spent to increase the market size.

However, if a competitor happens to enter the market at the same time as you, then you won’t gain any market share, especially since the product would not meet ideal values.

The second advantage to entering the market with a basic product is when it is time to R&D the upgrade, you will notice significant (more than 50%) reduced costs. This makes it very easy to upgrade the product as soon as a competitor enters the market.

Target the largest markets first, Innovators and Early Adopters, they will also pay a premium for your products. A rough estimate for RRP for a Voditie product on launch is $1,000 or five times the base cost. If you are the only competitor, you may be able to charge even more.

Updated PHP code to automatically bid/buy an eBay auction item

Updated code to automatically bid on an eBay item, I’m currently using it myself if a loop of searched items.

Most of the changes are improved return status checking. For testing use one cent items with free shipping.

// MAIN BIDDING FUNCTION
// this function performs no checking on the input variables
// $username  -  the eBay user name
// $password  -  the eBay user password
// $item      -  the eBay item number to bid on
// $bid       -  the bid amount in local currency i.e. 5.67
// $link      -  referral link, can leave empty i.e. '' or use 'http://ebay.com'
function place_bid($username, $password, $item, $bid, $link) {

	$cookies = dirname(__FILE__).'/cookies.txt';
	
	//set success as default false
	$success = false;
	$bid_success = false;

	$curl = curl_init();
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1');
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($curl, CURLOPT_REFERER, $link);
	curl_setopt($curl, CURLOPT_COOKIEFILE, $cookies);
	curl_setopt($curl, CURLOPT_COOKIEJAR, $cookies);
	
	//query the referal link page and grab tracking part
	curl_setopt($curl, CURLOPT_URL, $link);
	$ret = curl_exec ($curl);
	
	//query the sign-out page
	//curl_setopt($curl, CURLOPT_URL, "http://signin.ebay.com/ws/eBayISAPI.dll?SignIn&lgout=1");
	//$ret = curl_exec ($curl);
	
	//IMPORTANT		
	//query the sign-in page to set the cookies
	curl_setopt($curl, CURLOPT_URL, 'http://signin.ebay.com/aw-cgi/eBayISAPI.dll?SignIn&campid=5337161990&customid=7');
	curl_exec ($curl);
	
	//sign-in
	curl_setopt($curl, CURLOPT_URL, "http://signin.ebay.com/aw-cgi/eBayISAPI.dll?MfcISAPICommand=SignInWelcome&siteid=0&co_partnerId=2&UsingSSL=0&ru=&pp=&pa1=&pa2=&pa3=&i1=-1&pageType=-1&userid={$username}&pass={$password}&campid=5337161990&customid=7");
	$ret = curl_exec ($curl);
	if(curl_errno($curl)){
		ebaylog('Curl error: ' . curl_error($curl));
	}
	if (!$ret) {
		$ret = curl_exec ($curl);
		if(curl_errno($curl)){
			ebaylog('Curl error: ' . curl_error($curl));
		}
		if (!$ret) {
			$ret = curl_exec ($curl);
			if(curl_errno($curl)){
				ebaylog('Curl error: ' . curl_error($curl));
			}
		}
	}
	
	if (strpos($ret, "Member id {$username}") === FALSE) {
		if (preg_match('%<b class="altTitle">(.*)</b>%', $ret, $regs)) {
			$err = $regs[1];
			ebaylog("\"{$err}\"");
			if (strpos($err, 'The alerts below') === 0) {
				ebaylog("{$item}: 'The alerts below' found, successful");
				//set it to succes
			}
		} else {
			ebaylog("{$item}: Failed signing in");
			if (preg_match('%<font face=".*?" size="3"><b>(.*?)</b></font>%', $ret, $regs)) {
				$err = $regs[1];
				ebaylog("\"{$err}\"");
			}
			
			test_write($ret);
			goto end;
		}
		
		
	} else {
		ebaylog("{$item}: Success signing in");
	}
	
	
	//place the inital bid
	curl_setopt($curl, CURLOPT_URL, "http://offer.ebay.com/ws/eBayISAPI.dll?MakeBid&item={$item}&maxbid={$bid}&campid=5337161990&customid=7");
	$ret = curl_exec ($curl);
	if(curl_errno($curl)){
		ebaylog('Curl error: ' . curl_error($curl));
	}
	if (!$ret) {
		$ret = curl_exec ($curl);
	}

	if (preg_match_all('/(?:value="([-0-9a-zA-Z]*)" *)?name="stok"(?: *value="([-0-9a-zA-Z]*)")?/', $ret, $regs)) {
		$stok = $regs[1][0];
	} else {
		//Failed to get 'stok' value
		//try and determine why
		if (preg_match('%<div class="statusDiv">(.*?)</div>%', $ret, $regs)) {
			$err = $regs[1];
			ebaylog("'{$err}'");
			//if string starts with "Enter US $0.41 or more"
			if (stripos($err, 'Enter') === 0) {
				ebaylog("{$item}: 'Enter' found, aborting");
				//set it to success
				$success = true;
			} else if (stripos($err, 'To enter a') === 0) {
				ebaylog("{$item}: 'To enter a' found, aborting");
				//set it to success
				$success = true;
			} else if (stripos($err, 'Transaction Blocked') === 0) {
				ebaylog("{$item}: 'Transaction Blocked' found, aborting");
				//set it to success
				$success = true;
			}
			
		} else if (preg_match('%"\d*" - Invalid Item</div>%', $subject)) {
			ebaylog("{$item}: 'Invalid Item' found, aborting");
			test_write($ret);
			//set it to success
			$success = true;
		} else if (preg_match('%<div class="subTlt"><ul class="errList"><li>(.*?)</li></ul></div>%', $subject)) {
			ebaylog("{$item}: 'no longer available' found, aborting");
			test_write($ret);
			//set it to success
			$success = true;
		} else if (preg_match('%id="w\d-\d-_msg".*?>(.*?)</span>%', $ret, $regs)) {
			ebaylog("'{$regs[1]}'");
		} else if (preg_match('%<div\s+class\s*=\s*"(?:errRed|errBlk|errTitle|statusDiv)"\s*>(.*?)</div>%i', $ret, $regs)) {
			ebaylog("'{$regs[1]}'");
		} else {
			//don't know why so log the page
			ebaylog("{$item}: Failed to get 'stok' value");
			test_write($ret);
		}
		goto end;
	}
	
	if (preg_match_all('/(?:value="([-0-9a-zA-Z]*)" *)?name="uiid"(?: *value="([-0-9a-zA-Z]*)")?/', $ret, $regs)) {
		$uiid = $regs[1][0];
	} else {
		ebaylog("{$item}: Failed to get 'uiid' value");
		goto end;
	}
	

	if ($stok && $uiid) {
		ebaylog("{$item}: Success placing initial bid");
	} else {
		ebaylog("{$item}: Failed placing initial bid");
		goto end;
		
	}
	
	//confirm the bid
	curl_setopt($curl, CURLOPT_URL, "http://offer.ebay.com/ws/eBayISAPI.dll?MfcISAPICommand=MakeBid&maxbid={$bid}&quant=1&mode=1&stok={$stok}&uiid={$uiid}&co_partnerid=2&user={$username}&fb=0&item={$item}&campid=5337161990&customid=7");
	$ret = curl_exec ($curl);
	if(curl_errno($curl)){
		ebaylog('Curl error: ' . curl_error($curl));
	}
	if (!$ret) {
		$ret = curl_exec ($curl);
	}
	
	//perform a number of tests to determine if the bid was a success
	$bid_success = true;
	if (stripos($ret, "you're the first bidder") === FALSE) {
		if (stripos($ret, "you're the high bidder and currently in the lead") === FALSE) {
			if (stripos($ret, "you're currently the highest bidder") === FALSE) {
				$bid_success  = false;
				ebaylog("{$item}: Failed placing final bid");
				//try and determine why
				if (preg_match('%<div\s+class\s*=\s*"(?:errRed|errBlk|errTitle|statusDiv)"\s*>(.*?)</div>%i', $ret, $regs)) {
					$err = $regs[1];
					ebaylog("'{$err}'");
					if (stripos($err, 'Enter') === 0) {
						ebaylog("{$item}: 'Enter' found, aborting");
						//set it to success
						$bid_success = true;
					} else if (stripos($err, "You've just been outbid") === 0) {
						ebaylog("{$item}: 'You've just been outbid' found, aborting");
						//set it to success
						$bid_success  = true;
					} else if (stripos($err, "You're currently the high bidder,") === 0) {
						ebaylog("{$item}: 'You're currently the high bidder, but the reserve hasn't been met.' found, aborting");
						//set it to success
						$bid_success  = true;
					}
				} else {
					//we don't know why it failed so write the data
					test_write($ret);
				}
			}
		}
	}
	
	if ($bid_success) {
		ebaylog("{$item}: Success placing final bid");
		$success = true;
	}
	
	end:
	
	//close the curl session
	curl_close ($curl);
	
	if ($success) {
		ebaylog("{$item}: Success: {$username}");
	} else {
		ebaylog("{$item}: Failure: {$username}");
	}
	
	return $success;
}

//for testing
function test_write($out) {
	$fh = fopen(dirname(__FILE__).'/'.date('Y-m-d H-i-s').'.html', 'w');
	fwrite($fh, $out);
	fclose($fh);
}

//simple logging function
function ebaylog($msg) {
	$msg = "{$msg}\r\n";
	echo $msg;
	$fh = fopen(dirname(__FILE__).'/ebay-log.txt', 'a');
	fwrite($fh, date('Y-m-d H-i-s')." {$msg}");
	fclose($fh);
}

How to win at Markstrat (Markstrat Tips and Tricks) – competitor analysis

The last part in the How to win at Markstrat series, I will discuss competitor analysis and the various methods to speed up the analysis process.

In most cases Excel’s Conditional Formatting Colour Scales is all that is required. For the below examples blue is segment targeted. It is important to apply the conditional formatting over each market segment individually, not the entire market.

In other cases, a little bit of work is required, the square root of the sum of squared differences can be used to determine the distance between two points, in many cases this can be used to calculate how close a competitor is to ideal values. Excel makes this calculation easy with the SQRT(SUMXMY2()) formula.

Advertising

Advertising competitor analysis is the easiest, the Estimated Advertising Expenditures (in thousand dollars) gives a good indication to which company is targeting which segment.

Markstrat advertising competitor analysis

Commercial Team

Using the Estimated Commercial Team Size (in full-time equivalent), the exact commercial team size per channel of the competitors’ products can be determined.

Converting the distribution between each channel to a percentage, it can then be compared against the Shopping Habits found in the Consumer Survey. Using Excel’s SQRT(SUMXMY2()) we can get the difference between the ideal distribution and the actual for a particular product and segment. A lower value means closer ideal and actual.

Markstrat commercial team competitor analysis

The results show which company is targeting their products to which segment. But more importantly, which product has a more ideal commercial team distribution to meet a particular segment.

Semantic Scales

Similar can be done to semantic scales, which provides an indication to which products are ideal for the market segment. The two tables to use in the calculation are Brand Perceptions and Ideal Values.

Markstrat semantic scales competitor analysis

Multidimensional Scaling

Similar to Semantic Scales, the same can be done for Multidimensional Scaling. Ignoring the values, what is interesting is how similar the Multidimensional Scaling is to Semantic Scales seen through the similar shades of colours. Change Multidimensional Scaling Perceptions and you change Semantic Scales perceptions and vice versa.

Markstrat multidimensional scaling competitor analysis

How to win at Markstrat (Markstrat Tips and Tricks) – marketing strategy

The third part of this series looks at actual marketing strategy and marketing mix decisions.

I won’t go into too much marketing strategy detail, plus a lot of these are my thoughts from playing only a single round.

Segmentation

Target one product for one market segment only, early on it may be tempting to target multiple segments, particularly due to initial market share in many segments and purchase intentions in multiple segments.

Make a decision to target the single segment, the segment that will return the largest contribution. Targeting a single segment makes it easier to target your product for that specific segment. Since each segment has a different ideal characteristic product.

Estimated Expenditures

The total estimated advertising expenditure is correct, but about 10% of the total is added to each individual segment, this shouldn’t matter too much since it can be assumed competitors will be targeting one product per segment. The estimated advertising expenditure is extremely useful for determine competitor advertising spend, as well as competitor target segments.

The estimated commercial team is spot on in number.

Advertising

I have found that advertising is more important than commercial team.  Depending on your strategy, aim to at least match or trump your segment competitors total advertising spend in order to gain greater market dominance. If there are two competitors, aim to match their total spend, if budget permits of course.

I haven’t found it necessary to ever use No Objectives, unless you are launching a new product. It is easier to use multidimensional scaling compared to semantic scales since with multidimensional scaling you can alter multiple dimensions at the same time. with semantic scales you are limited to a maximum of two of the five characteristics.

You can change the perceptions of price, normally, if you want to match your product to ideal price you would change the price directly, the advantage of changing the price perceptions is you can increase the price above the segments ideal price, and then change the consumers perception of the price back to their ideals. If that makes sense, or simply, use the perceptions of price when you want to increase price.

Note, when you change a perception of a characteristic, you are changing the perception of the entire products market.  This is why some ideal perceptions change dramatically, other competitors are changing those perceptions.

Commercial Team

Commercial Team possibly reaches a maximum, where any additional persons provide no additional benefit. I have observed a team with a third more commercial team not gain any additional market share; the market share was exactly proportional to advertising spent instead. A possibly reason is commercial team isn’t segment specific, but over the entire market, so whilst they may be a large difference between you and a competitor, over the larger market the difference is small.

With commercial team, it is critical to distribute the commercial team using the Shopping Habits of the target segment. Though, this contradicts the Experiments which I will discuss below.

Experiments

The marketing experiments are useful for determining how to proportionate your budget. Though, it assumes the competitor actions remain the same, which is never the case.

I have contacted StratX to try and determine how they calculate estimated change in contribution, but they didn’t provide a definite answer, “Change in Contribution is equal to  Expected additional revenues minus Additional costs of advertising or commercial team. I will attempt show how it is calculated below.

Advertising Experiment

The Advertising Experiment calculates the increase in market share if advertising for a product was increased by 20%. An estimated expected change in contribution is provided, which is roughly calculated as Average Selling Price minus Average Unit Cost multiplies by the additional units sold (the addition of each segment of the Expected Change of Unit Market Share multiplied by the current period’s Market Size) subtract 20% of the current periods total Advertising spend.

(S_{Average Selling Price}-C_{Average Unit Cost}) \times N_{additional units sold}

Commercial Team Experiment

Similarly, the Commercial Team Experiment calculates the increase in market share if the commercial team was increased by 10 persons in each distribution channel.

This is where I haven’t got a definitive answer. The Expected Change in Number of Distributors is indirectly proportional to the Expected Change in Unit Market Share. This suggests that the Expected Change in Units Market Share is relevant to that specific distribution channel only. It even makes more sense, in that, when 10 persons are added to a distribution channel with low number of distributors compared to that with a high number of distributors, the increase in persons is a higher ratio, which explains why the units market share is higher (the indirect relationship).

What this means is, even though the percentage increase in Expected Change in Unit Market Share is the largest for a particular distribution channel, it doesn’t necessarily mean that is the distribution channel which should have the additional 10 persons.

The cost of 10 persons can be calculated using the market research, it is roughly $25,000.

The contribution of each distribution channel can be calculated as follows, using Savers segment as an example;

MARKET : SONITES : SAVERS Specialty Stores Mass Merchandisers Online Stores Total
Expected Change in unit Market Share (%U) 0.4% 0.0% 0.2%
Shopping Habits of Savers 19% 63% 18%
Savers next period Expected Market Size 229,068 761,136 221,796 1,212,000
Expected Change in Savers units 916 0 444 1,360
CM (average selling price minus average unit cost) 116
Expected Change in Contribution 105,831 0 51,236 157,067
Cost of 10 persons -250,000 -250,000 -250,000 -750,000

Proportioning Budget

Performing the above analysis on all products in all markets will give you an indication of where budget should be spent to maximise returns. It is also a good indication on where to decrease budget spend and even where you have overspent.

Using the experiments is only one indication, and should be used with previous competitor actions to determine the optimal strategy.

How to win at Markstrat (Markstrat Tips and Tricks) – Perceptions and Ideals

Following on from Markstrat market Forecast and Market Segments, I will discuss the importance of Markstrat Brand Ideals and Brand Perceptions.

Markstrat Semantic Scales and Multidimensional Scaling

There is two main market research data, Semantic Scales and Multidimensional Scaling, both have their advantages, Semantic Scales are more closely tied to product characteristics, new products must use Semantic Scales Ideal Values when designing the characteristic of products. Multidimensional Scaling combines the multiple characters into three simplified groups, this makes it a lot easier to change Brand Perceptions with advertising as you can chose two of the three, rather than two of the five.

It is important to note, Ideal Values are constantly evolving, so forecasting is required. Additionally, Ideal Values change by spending on Advertising to change Perceptions.

Plotting the Ideal Values of a given segment (Savers) and it can be observed that each characteristic is evolving at a different pace. If the current period’s Idea Values are used, they would have changed by next period. Add similar linear trend lines and the Ideal Values of each characteristic can be extrapolated.

Changing savers ideal values over each period

Below shows variance between the trends of four points and actual periods ideals.

Trend of 4 period Ideal Values and the actual periods Pideal Values

There is significant deviation between Processing Power and Design Index, possibly from the ranking of Importance of Characteristics. Companies will generally change Brand Perceptions (through advertising) of the important characteristics, which intern would alter the Ideal Values.

No. of Features Design Index Battery Life Display Size Processing Power Price
1.2 2.7 1.5 3.0 5.7 10.0

Similarly, the same can be done with Multidimensional Scaling, the below trends using three points and actual periods ideals.

Multidemensional scaling trend of 3 period Ideal Values and the actual periods Pideal Values

The higher number of periods past, the closer the exploration would be to ideals.

Once we know the ideal values for a given period, this can be used to calculated the desired characteristics of a product to meet a segments ideals.

Markstrat Product Characteristics

Let’s assume we want to create an ideal product for the Shoppers segment, it is know that it will take one period for development, so the Ideal Values of the following period must be forecast. If you are developing a product over multiple periods (a Vodite product), more than one period into the future must be forecast.

Using a simple past two period example, the Excel TREND formula calculates the next periods values.

Using LINEST, the direction (positive for up, and negative for down) can be calculated for determining if to round down or up, this is critical, as it can’t be assumed all characteristics are increasing.

No. of Features Design Index Battery Life Display Size Processing Power Price
Period 0 1.75 5.20 2.95 3.95 3.13 3.30
Period 1 1.81 5.24 2.89 4.04 3.30 3.41
Est Period 2 (TREND) 1.87 5.28 2.83 4.13 3.47 3.52
Gradient/Direction (LINEST) 0.1 0.0 -0.1 0.1 0.2 0.1

To calculate the characteristics from the Ideal Values, there are two methods.

Range method

Knowing the ideal value is on a scale from 1 to 7, and knowing the range of the characteristic, one can calculate the characteristic with the following;

Range_{min}+(Range_{max}-Range_{min})\frac{Value_{ideal}-1}{6}

The characteristics are calculated as;

No. of Features Design Index Battery Life Display Size Processing Power
Ideal Char. 1.87 5.28 2.83 4.13 3.47
Calc Char. 7.18 7.99 45.96 22.78 44.11
Trend +ve +ve -ve +ve +ve
Rounded 8 8 45 23 45

Note, the above can’t be used for price, as the range is unknown.

Trend method

The second method is to trend ALL market product brand perceptions vs. product characteristics.

Product perceptions vs. actual product characteristics

Similarly, the Excel TREND function can be used, the following characteristics are calculated;

No. of Features Design Index Battery Life Display Size Processing Power Price
Ideal Char. 1.87 5.28 2.83 4.13 3.47 3.52
Calc Char. 6.90 7.75 45.72 22.52 44.25 306.25
Trend +ve +ve -ve +ve +ve +ve
Rounded 7 8 45 23 45 307

Using this method, the Recommended Retail Price (RRP) can also be calculated, it may be worth using an Exponential trend rather than Linear, since price increases are more dramatic at the higher-end of the scale.

The only difference between the two methods is the ‘No. of Features’, and it can be seen that both values were hovering around 7, but the first range method was slightly over, which rounded it up to an 8. In this example it may be worth using a 7 for the ‘No. of Features’ value.

In the next Markstrat post, marketing Advertising and Commercial Teams will be discussed.

How to win at Markstrat (Markstrat Tips and Tricks) – Market Forecast and Segment Selection

Having recently completed the Markstrat strategic marketing simulation, I thought I would share some tips and tricks learnt along the way.

When initially starting Markstrat, all the data can be quite daunting, as you progress through the periods you get a feel for what to concentrate on.

A multiple-part series, the first part will look at Market Forecast and Market Segment selection.

Market Forecast

Start by looking at the market forecast, determine which segments are the high-growth segments, get into these segments early. This has two benefits, establishing segment dominance and control which makes it difficult for competitors to enter the segment, secondly, the high-volumes help to decrease unit costs over time.

Plotted is the market forecast of each segment with an exponential trend line, forecasted additional three periods in the future. Shoppers and Savers clearly have the highest market growth in this example.

Market segment growth trend

Integrate the equations between period 0 and 8 to get total volume.

Segment Equation Total over 8 periods
Explorers y = 231764e-0.029x  1,654,717
Shoppers y = 176438e0.2592x  4,733,251
Professionals y = 160089e0.1414x  2,376,865
High Earners y = 146295e0.1815x  2,637,148
Savers y = 280506e0.1738x  4,868,505

One thing to consider is these two segments also have the smallest margins.

An estimated simple Contribution Margin can be calculated using Recommended Retail Price minus Base Cost for each existing product. The summation of market share of each product multiplied by the calculated CM of each product gives as estimated CM per market segment.

Product Est. CM
Explorers 262
Shoppers 221
Professionals 299
High Earners 286
Savers 199

Estimated segment contribution margin first period

Using the total volume of each segment multiplied by CM of each segment, we get the following segment total CM.

Estimated total segment cotribution over 8 periods

When semantic scales are available from period one, we can associate price perceptions to actual prices, adding in an exponential trend gives a rough price perception to actual price equation. Semantic scales will be discussed in more detail next part.

Product price perception vs. actual product price

Using ideal values for each segment, we can get a rough price for each segment.

Segment Ideal Values RRP = 147.77e0.1955x
Explorers 3.5 294
Shoppers 3.4 288
Professionals 5.7 449
High Earners 5.3 420
Savers 2.3 231

An estimated base cost for each segment can be determined by summing the products of individual product’s base cost and individual product’s segment market share. With the estimated segment product cost and estimated base cost, the estimated contribution margin per segment can be calculated.

Product Est. CM = 147.77e0.1955x Est. Base Cost Est. Total CM
Explorers 294 169.839 124
Shoppers 288 120.982 167
Professionals 449 211.426 237
High Earners 420 200.058 220
Savers 231 74.964 156

Again, the Professionals and High Earners segments, as expected, have the highest contribution margins.

Finally, plotting the total contribution of each market segment calculated by the segment CM multiplied by the total segment size. It can be seen that Shoppers and Savers are still the higher earning segments, even though Professionals and High Earners have higher contribution margins, though the contribution growth is slightly slower.

Total estimated segment contribution over each period

It should be noted that spending more budget in a Market Segment naturally increases the market segment size. Companies moving into the high-growth segments will naturally fuel the segment’s growth in a virtuous circle, while the abandoned low-growth segments continue to die in a vicious circle.