If you have any questions or comments post them below and I am sure Wouter would be happy to answer them! Sorry for dropping you in it there Wouter…
Let us know a little about you!
Hi! My name is Wouter, 35 years old, from Belgium and I work in the petrochemical sector. My hobby is mostly selling LEGO® and collecting comic con specials.
What’s your store name and how long have you been selling on
Bricklink?
The name of my store is “Double U Bricks”, I am selling now on Bricklink for 3 years. But also doing different toy fairs in Belgium. 3 months ago I also started selling on eBay, that is also going very well 🙂
What’s your favourite set LEGO® has released and why?
Hmmm…. Difficult one … I would think something within the LEGO® Ideas theme because I find these sets really unique. So I will go for the Old Fishing Store 21310. The way the set is built is really unique, there are a lot of tiles used for a smooth surface.
How did you get into selling Lego?
For my day job I buy all different kinds of materials and services for a petrochemical plant, so being busy with commercial stuff has always been a great passion of mine.
When a few years ago I visited a LEGO® fair in Antwerp, I saw all of the different sellers there and I was thinking: “Hey, I can do that”… “It would be cool to buy it…and sell it”… So I started slow, bought some polybags that you could only find in the USA… 3 to 4 years later I have a stock that I estimate its value at 30.000 EUR 😀
What would you say the best thing about selling LEGO® on
Bricklink is?
Bricklink has a nice system and website in place that gives you a good overview of the orders that are coming in, that you have packed, that are shipped… So when you get about 7 or 8 orders on 1 day, it helps if you have a good overview. Second is that you only pay a 3% fee when you actually sell anything. Compared to eBay… that is really cheap.
What would you say the worst thing about selling LEGO® on
Bricklink is?
The servers they run on… Sometimes the website is soooo slow. When you want to upload the parts you want to sell, it takes ages…
Do you like to source new sets to split out or bulk buy
mixed Lego? Any reasons?
I only buy new sets and part them out, this for the following reasons:
All-new LEGO® in an excellent state
I can buy 25 of the same sets, so I have at least 25 parts of the same kind what help in the selling and during the sorting
It is easier to calculate your profits when you buy a new set. I always calculate a 2,5x ratio, so when I buy a set that costs me 100 EUR, I look at the part out value of all pieces at Bricklink and if I can sell all pieces overtime for 250 EUR, I buy the set.
What amount of bricks do you keep your store at? Is there an
amount in your inventory where you start to see more sales?
200.000 parts at the moment in the BL store and about 100.000 for the toy fairs. There are 2 factors to pump up your sales in Bricklink: Quantity and Variety.
Quantity: When someone is looking for 100 green parts and you have 200 of that kind, Bricklink will transfer that person much faster to your store because he can buy them all at once at your store. So he only needs to pay to ship 1 time compared to sellers who only have 50 of these and he needs to place an order also another store.
Variety: The more different and rare parts you have in your store, the more people you get in your store that need that 1 rare part… and once they are in your store, they take some other parts as well because they are paying the postage costs already.
If you could give any advice to anyone thinking about
selling LEGO® on Bricklink what would it be?
Always buy AT LEAST 20 to 25 sets to part out and for the bigger exclusive sets 5 to 10. This so you don’t end up with only having 1 piece in your cabinets.
For storage, I recommend using professional drawers and cabinets. Check out Raaco, they are not cheap… but once your store starts to grow, these give you more possibilities in restocking them in other racks or turning towers.
/* Auto generated, hash = 5dceu9kevqjdyuy2uw1atqrsu */
//TODO: Break this file down so that we can actually unit test it.
(function(window) {
/**
* Renders all unrendred LinkedIn Badges on the page
*/
window.LIRenderAll = function () {
var CALLBACK_NAME = 'LIBadgeCallback', //Must match callback on helpers.js
BADGE_NAMES = '.LI-profile-badge, .LI-entity-badge',
// TODO -- tracking param for other badge types
TRACKING_PARAM = 'profile-badge',
responsesReceived = 0, //Keeps track of number of responses recieved for proper cleanup when finished
expectedResponses = 0, //Keeps track of number of responses to expect
scripts = [ ], //Keeps track of scripts added for proper cleanup when finished
childScripts = {}, //Keeps track of child scripts to render
badges = Array.prototype.slice.call(document.querySelectorAll(BADGE_NAMES));
var i, len, badge, rendered;
for (i = 0, len = badges.length; i < len; i++) {
badge = badges[i];
rendered = badge.getAttribute('data-rendered');
if (!rendered) {
expectedResponses++;
badge.setAttribute('data-rendered', true);
renderBadge(badge);
}
}
function isCNDomain() {
if (typeof window !== "undefined") {
var hostName = window.location && window.location.hostname || '';
return (/linkedin(-ei)?.cn$/).test(hostName);
}
return false;
}
function generateUrl(isEI) {
var domainPrefix = isEI ? 'https://badges.linkedin-ei' : 'https://badges.linkedin';
if (isCNDomain()) {
return domainPrefix + ".cn/";
}
return domainPrefix + ".com/";
}
function getBadgeKeyQueryParams(badge) {
return Array.prototype.slice.call(badge.attributes).filter(function (attr) {
return attr.name.lastIndexOf('data-key-', 0) !== -1;
}).map(function (attr) {
// Most browsers automatically lowercase the attribute name when its being read
// We are calling lowercase on it again to ensure consistency for any browsers that are lagging behind.
return encodeURIComponent(attr.name.replace('data-', '').toLowerCase()) + '=' + encodeURIComponent(attr.value);
});
}
/*
* Renders a single badge on the page
* @param badge: div element of badge to render
*/
function renderBadge(badge) {
var size = badge.getAttribute('data-size'),
locale = badge.getAttribute('data-locale'),
type = badge.getAttribute('data-type'),
theme = badge.getAttribute('data-theme'),
vanity = badge.getAttribute('data-vanity'),
version = badge.getAttribute('data-version'),
isEI = badge.hasAttribute('data-ei'),
entity = badge.getAttribute('data-entity'),
isCreatePage = badge.hasAttribute('data-iscreate'),
uid = Math.round(1000000 * Math.random()),
baseUrl = generateUrl(isEI),
queryParams = [
'locale=' + encodeURIComponent(locale),
'badgetype=' + encodeURIComponent(type),
'badgetheme=' + encodeURIComponent(theme),
'uid=' + encodeURIComponent(uid),
'version=' + encodeURIComponent(version)
],
url;
if (version === 'v2') {
baseUrl += 'view';
queryParams.push('badgesize=' + encodeURIComponent(size));
queryParams.push('entity=' + encodeURIComponent(entity));
queryParams = queryParams.concat(getBadgeKeyQueryParams(badge));
} else {
baseUrl += 'profile';
queryParams.push('maxsize=' + encodeURIComponent(size));
queryParams.push('trk=' + encodeURIComponent(TRACKING_PARAM));
queryParams.push('vanityname=' + encodeURIComponent(vanity));
}
if (isCreatePage) {
queryParams.push('fromCreate=true');
}
url = baseUrl + '?' + queryParams.join('&');
badge.setAttribute('data-uid' , uid);
jsonp(url); //Calls responseHandler when done
}
/**
* Handles a response from the server. Finds badge matching badgeUid and inserts badgeHtml there
* @param badgeHtml: String representing contents of the badge
* @param badgeUid: UID of the badge to target
**/
function responseHandler(badgeHtml, badgeUid) {
responsesReceived ++;
var i, badge, uid, isCreate;
var defaultWidth = 330 // max possible width
var defaultHeight = 300 // max possible height
for (i = 0, len = badges.length; i < len; i++) {
badge = badges[i];
// isCreate needed to prevent reloading artdeco script tag
isCreate = badge.getAttribute('data-iscreate');
uid = parseInt(badge.getAttribute('data-uid'), 10);
if (uid === badgeUid) {
var badgeMarkup = `<body>${badgeHtml}</body>`
var iframe = document.createElement('iframe');
iframe.onload = function() {
var iframeBody = iframe.contentWindow.document.body;
// 5 px buffer to avoid the badge border being cut off.
iframe.setAttribute('height', (iframeBody.scrollHeight || defaultHeight) + 5);
iframe.setAttribute('width', (iframeBody.scrollWidth || defaultWidth) + 5);
};
iframe.setAttribute('frameBorder', '0');
iframe.style.display = 'block';
badge.appendChild(iframe);
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(badgeMarkup);
iframe.contentWindow.document.close();
replaceScriptTags(badge, isCreate);
}
}
tryClean();
}
// These functions are needed because badge markup is added via innerHtml property which does not run script tags
function replaceScriptTags(node, isCreate) {
if (shouldReplaceNode(node, isCreate)) {
node.parentNode.replaceChild(cloneScriptNode(node), node);
childScripts[node.src] = true;
} else {
var i = 0,
children = node.childNodes;
while (i < children.length) {
replaceScriptTags(children[i++], isCreate);
}
}
return node;
}
function shouldReplaceNode(node, isCreate) {
return isScriptNode(node) && !childScripts[node.src] && (!isCreate || (isCreate && !node.getAttribute('data-isartdeco')));
}
function isScriptNode(node) {
return node.tagName === 'SCRIPT';
}
function cloneScriptNode(node){
var script = document.createElement("script");
for( var i = node.attributes.length-1; i >= 0; i-- ) {
script.setAttribute( node.attributes[i].name, node.attributes[i].value );
}
return script;
}
// Gets all incoming responses
window[CALLBACK_NAME] = responseHandler;
/**
* Tries to clean added tags
**/
function tryClean() {
//Clean up after all requests are done..
//Accounts for people including script more than once
var done = (responsesReceived >= expectedResponses && expectedResponses > 0) || responsesReceived >= badges.length;
if (done) {
delete window[CALLBACK_NAME];
// remove all script tags
scripts.map(function(script){
document.body.removeChild(script);
});
}
}
/*
* Makes Jsonp request, responses handles by CALLBACK_NAME
* @param url String: url of server to make request to
*/
function jsonp(url) {
var script = document.createElement('script');
script.src = url;
scripts.push(script);
document.body.appendChild(script);
}
};
if (document.readyState === 'complete') {
window.LIRenderAll();
} else {
window.addEventListener('load', window.LIRenderAll, false);
}
})(window);