How It Works: From Your Idea to a Finished Brick Model

Getting a custom brick model made with Belle-Ve Bricks is a straightforward process. You don’t need to know anything about brick design, part counts, or building techniques. You just need an idea and some reference material, and we’ll handle everything else from there. Here’s exactly what happens from the moment you get in touch to the moment your order arrives.

1. You get in touch with your idea

Everything starts with a brief. Tell us what you want built, what it’s for, and share any reference images you have. That might be photos of a building, a product, a person, a pet, or anything else you want turned into a brick model. There’s no obligation at this stage and you don’t need to have everything figured out before you contact us. Most enquiries start with a rough idea rather than a finished brief, and helping you shape that brief is part of what we do.

We review everything you’ve sent and come back to you with initial thoughts and any questions we have. If we need more detail before we can quote accurately, we’ll suggest a short call to make sure we’ve fully understood your requirements before putting anything together.

2. We put together your quote

Once we have what we need, we put together a detailed quote that covers the full scope of your project. That includes the model design, parts sourcing, building instructions, packaging, and delivery. If custom printed boxes or branded parts are part of your brief, those are included in the quote too. You’ll know exactly what you’re paying for before committing to anything. There are no hidden costs and nothing changes between the quote and the final invoice.

3. You approve the digital render

This is the stage that surprises most people, and it’s one of the most important parts of the process. Before a single part is sourced, you see a full digital render of the finished model. You’ll see it from multiple angles and can request adjustments until the design is exactly right. We don’t move forward until you’re completely satisfied with what you see. It’s your model and you should be confident in the design before we start building it.

4. We source the parts and prepare the packaging

Once the design is signed off, we source every part needed for your build. If you’ve chosen custom printed boxes, the box artwork is designed and produced at the same time as the parts are being sourced, so both are ready at the same point and there are no delays at the end of the project. For projects that include custom printed brick parts, those are produced in parallel too.

5. Everything is packed and shipped to you

Every order arrives with everything needed to complete the build. Parts are individually counted, checked, and packed into the box alongside your building instructions. Instructions are available in two formats. The digital option includes a card in each box with a photo of the finished model and a QR code linking to the full step-by-step instructions online. It’s the more eco-friendly choice and the one most clients go for. If you’d prefer a printed booklet, we can supply that instead. Either way, everything needed to build the model is in the box when it arrives. You can find out more about exactly what’s included in our custom brick model kit service.

We deliver worldwide. Shipping is included in your quote upfront so what you’re quoted is what you pay, with no surprises at the point of delivery.

What you can have made

Belle-Ve Bricks works across a wider range of project types than most people expect when they first get in touch. Buildings, architectural models, and replicas of real structures are the most common commissions, but we also build branded display pieces and product replicaspet portraitsbulk sets for corporate gifting programmes and eventslarge scale sculptures, and framed brick wall art. If you’re not sure whether what you have in mind is something we can do, get in touch and we’ll tell you honestly.

Single pieces and bulk orders

We work on everything from a single desk model to a production run of thousands of identical sets. The process is the same regardless of quantity. The model is designed once, approved once, and then produced at whatever scale your project requires. For bulk orders, every set is individually packed and can be shipped to multiple addresses worldwide. There’s no minimum order quantity on any of our services.

How long does it take?

Typical turnaround from design approval to delivery is 4 to 6 weeks. More complex builds, large scale sculptures, and bulk production runs take longer and timelines are agreed individually at the quoting stage. If you have a firm deadline, tell us when you get in touch and we’ll give you an honest answer about what’s achievable. The earlier you get in touch, the more flexibility we have at the design stage.

What does it cost?

Pricing depends on the type of model, the complexity of the design, and the quantity required. Personal commissions or corporate commission start from £120 / $150. Bulk orders and large scale commissions are priced individually based on the specifics of the project. Every quote is itemised and agreed before any work begins.

A few things worth knowing before you get in touch

We build primarily with genuine, brand-name bricks. Where a project calls for it, we also work with a trusted supplier of high-quality compatible bricks. Either way, the standard of the finished model remains the same. If you have a preference, let us know at the briefing stage.

All commissions include a digital render for your approval before production begins. You can request changes at this stage and we won’t start sourcing parts until you’ve signed off on the design. For bulk orders, the design is fully approved before the production run begins.

If your project is a surprise gift, we handle that discreetly throughout and can ship directly to the recipient rather than to you. Just let us know when you get in touch.

Ready to get started?

If you’ve got an idea, the simplest thing to do is get in touch. Tell us what you have in mind and we’ll come back to you with next steps. There’s no obligation at the enquiry stage and no pressure to commit before you’re ready.

Not sure which service is right for your project? Explore our individual service pages: Custom Brick Model KitsBulk Model SetsBrick PrintingBrick SculpturesDesign Only ServicePet Portraits, or Brick Wall Art.

<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