If you want your logo, artwork, or a custom graphic printed directly onto a brick, tile or part, this is the service for it. We use an industrial professional grade UV printer to print directly onto parts at a quality level that generic transfer methods simply can’t match. The result is a clean, durable, professional finish that looks like it came from a factory, because the process that produces it is exactly that.
There’s no minimum order quantity. Whether you need ten printed tiles or ten thousand, we handle the brief, the production, and the delivery.
What custom brick printing is used for
The range of applications is broader than most people initially assume. At one end of the scale, a convention organiser might need a thousand 2×6 tiles each printed with a custom poster design for an event giveaway. At the other end, a corporate client commissioning a bulk set of a hundred models might want a single tile in each box printed with their company logo. Both are exactly the kind of brief this service handles, and everything in between.
Standalone printed parts work well for event merchandise, brand activations, promotional giveaways, and convention exclusives. Printed parts as part of a wider commission work well for adding a branded element to a model set, personalising a specific piece within a build, or creating a signature detail that ties a corporate gift back to the company it came from.
Why we print on compatible bricks rather than genuine ones
This is a question we get asked and it’s worth being straight about it. Printing directly onto genuine brand-name bricks falls outside the fair use guidelines that the manufacturer publishes, so we don’t do it. Instead we use a high quality compatible brick supplier whose parts meet the same standard in terms of fit, finish, and durability. The print goes directly onto the part using the same industrial UV process regardless of the part type, and the quality of the finished piece is the same. For the vast majority of applications, the distinction between genuine and compatible parts makes no practical difference to the finished product or how it’s used.
What we can print on
We can print on a wide range of part types depending on what your brief requires. Flat tiles are the most common choice because they give the most surface area for a clean graphic, but we also print on plates, slopes, and other parts where the shape suits the design. If you’re not sure which part type works best for what you have in mind, tell us what you’re trying to achieve and we’ll advise on the right option before quoting.
Parts are available in any colour and at any quantity through our supplier, which means you’re not limited to whatever happens to be in stock. If you need a specific colour in a specific quantity, we can get it.
Standalone service or part of a commission
Custom brick printing is available in two ways. As a standalone service, you brief us on the part type, the quantity, the colour, and the artwork, and we handle the production and deliver the finished printed parts to you. As part of a wider commission, the printed parts are incorporated into the model design and included in the final packaged set alongside everything else. Both routes go through us and the process is the same either way. You never need to contact the supplier directly.
If your project involves a full model commission with printed parts included, our custom brick model kit service covers the complete end-to-end process with printing built in.
Pricing
Printed parts are priced per piece, with the price per piece reducing as quantity increases. Because part type, colour availability, and artwork complexity all affect the final cost, every order is quoted individually. There’s no minimum order so you can start small, but larger quantities will always work out more cost effective per unit.
Get in touch with your requirements and we’ll come back to you with a clear quote that covers parts, printing and delivery.
How to get started
Tell us what you need printed, on what part, in what quantity, and share your artwork or logo file if you have one. We’ll review what you’ve sent and come back with a quote and any questions we have before production begins. If you’re not sure about artwork specifications or which part type suits your brief, we can advise on that before you commit to anything.
Every project is handled by us from brief to delivery. You deal only with Belle-Ve Bricks throughout the process.
Frequently asked questions
Is there a minimum order quantity?
No. You can order as few or as many printed parts as your project requires. Larger quantities reduce the price per piece, but there’s no minimum that rules out smaller orders.
I don’t have any artwork, can you design it?
Yes. If know what you want but do not have the artwork or graphics just let us know, we can have it designed and then once you are happy have it printed on to the part!
What file format do you need for the artwork?
Vector files give the best results for logos and graphics. If you only have a high resolution image file, get in touch and we’ll advise on whether it will work for your brief before production begins.
Can you print on any colour of brick?
Parts are available in a very wide range of colours through our supplier. If you have a specific colour requirement, include it in your brief and we’ll confirm availability before quoting.
How durable is the print?
The UV printing process produces a durable finish that is resistant to normal handling. It’s a direct print onto the part rather than a sticker or transfer, which means it won’t peel or lift with regular use.
Can printed parts be included in a full model commission?
Yes. If you want printed parts as part of a wider model set, we incorporate them into the commission and include them in the final packaged set. You don’t need to manage them separately.
Do you ship internationally?
Yes, worldwide. Shipping is included in your quote upfront so there are no unexpected charges at delivery.
Get your custom brick parts printed
Whether you need ten tiles for a personal project or ten thousand for a brand activation, get in touch with your brief and we’ll take it from there. No minimum order, no dealing with suppliers, and a clear quote before anything goes into production.
/* 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);