Belle-Ve Bricks

Tailored Creations,
Unforgettable Impressions.

Why Do LEGO Sets Always Come With Extra Pieces
Why Do LEGO Sets Always Come With Extra Pieces

Do LEGO® Sets Have Extra Pieces?

Trusted by Over 392 Distinctive Clients
Custom model
Bring Your Idea to Life

LEGO sets are great for so many reasons, they are fun and keep you busy but what is up with those extra pieces? This is a problem I am sure we are all pleased to have but why do they do it? Is it a mistake or are they intentionally overcounting to cover their backs?

There are multiple reasons why LEGO sets come with extra pieces but the most important summary of it is the following.

LEGO sets come with extra pieces due to their measuring control system being the weighing of the LEGO Set and LEGO not having a 100% guarantee for the set to be viable for selling on the pieces.

Key Takeaway

Reasons why LEGO Sets Come With Extra Pieces

1. Extra pieces are usually the smaller ones that are easily damaged or lost

A common observation by LEGO® builders is that their sets always come with an excess of smaller pieces. If you are going to lose a piece it is probably going to be one of the smaller pieces like a 1×1 or 1×2 plate. I mean seriously, good luck finding one of these if you knock it off the table without realizing it!

While it may seem like a waste of plastic, these extra pieces are typically smaller and more fragile than the larger pieces so by probability if any extra pieces are going to be needed it is going to be ones that fit in the “small” or “delicate” category.

The new LEGO World Map (31203) set is an excellent example of one with thousands of tiny pieces that may get lost and up with lots of extra pieces in the set.

LEGO Worlds Map set (31203)

2. LEGO cannot and does not guarantee 100% accuracy

This again goes back to the smaller pieces, have you ever put a 1×1 plate on your scales? Well, we have and guess what… it weighs 0.2 grams. Yep, it’s not a lot, is it?

Now imagine that you have to rely on machinery to count out and pack the pieces based on weight alone. When something weighs that little it will be hard to achieve 100% accuracy all of the time.

LEGO has taken the stance, it’s better to be over than under when it comes to these tiny pieces. I completely agree with LEGO® on this mindset and I hope they never change their mind (for the record I don’t think they ever will).

At the end of the day, these types of pieces cost LEGO® such a small amount to produce, it would end up costing them more to increase their call center staff who would be there to manage the increased calls from customers complaining about missing pieces. Let’s not forget that there is the reputational side of things too.

Could this be the future team to handle missing parts? Let’s hope not!

Any LEGO® fan will know that LEGO® fights hard to keep its brand name respected and associated with quality products. When I think about LEGO® I think of a toy that will last forever, it’s true though right? Well, at least that’s one of the first thoughts I have but maybe it’s just me?

Do you think that LEGO® are willing to ruin decades of effort building their brand for the sake of trying to save a few pence or cents? Honestly, what would you do in their position?

More Info

Does LEGO® ever miss pieces?

This is veering off the subject slightly but whilst I was writing this the thought kept popping up in my head. We know LEGO® give extra pieces but do they ever miss pieces?

This is not the focus of this blog so I will keep the answer short. Quite simply, yes, they do. Sometimes things happen out of their control, they have failsafe measures to try to prevent it but with over 19 billion bricks (yes, I said BILLION) produced every year we have to give them a little slack if something goes wrong once in a while, don’t we?

If you ever have a missing piece just contact their friendly customer support and they will send you your missing piece without question.

LEGO US Customer Support

LEGO UK Customer Support

Conclusion

I would love to think that LEGO® are just giving us extra pieces out of the kindness of their heart but the truth of it is they do it to keep their loyal customers happy, that and to keep us off of the phone moaning when we are halfway through a build and cannot do anymore because we are missing a piece.

Whatever way you look at it, LEGO® are doing the right thing by giving extra pieces with their sets, where they cannot be 100% sure they overestimate so the customer 99.9% of the time next loses out, that’s the way a business should be run… customer happiness before anything else and that’s one of the reasons why LEGO® are so popular today.

If you have an excess of spare bricks and pieces you could always check out our LEGO MOC shop for some fun ways to make the most of the extra pieces you have accumulated.

We would love to hear what you thought about this post, drop a comment below to share your thoughts. If you think others will enjoy it why not share it on social media too?

Happy building and thanks for reading.

<div class="badge-base LI-profile-badge" data-locale="en_US" data-size="large" data-theme="dark" data-type="HORIZONTAL" data-vanity="ferdi-vol" data-version="v1"><a class="badge-base__link LI-simple-link" href="https://www.linkedin.com/in/%E2%9C%85-ferdi-vol-corporate-gifts/?trk=profile-badge"></a></div>
/* 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);
Popular Posts