{"id":3421,"date":"2026-07-29T15:32:09","date_gmt":"2026-07-29T15:32:09","guid":{"rendered":"https:\/\/vexil3dlabs.co.za\/?page_id=3421"},"modified":"2026-07-31T05:10:05","modified_gmt":"2026-07-31T05:10:05","slug":"3d-printing-cost-calculator","status":"publish","type":"page","link":"https:\/\/vexil3dlabs.co.za\/?page_id=3421","title":{"rendered":"3D Print Cost Calculator"},"content":{"rendered":"<p><!DOCTYPE html><br \/>\n<html lang=\"en\"><br \/>\n<head><br \/>\n<meta charset=\"UTF-8\"><br \/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><br \/>\n<title>3D Print Cost Calculator \u2014 Vexil 3D Labs<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Rajdhani:wght@400;500;600;700&#038;family=Share+Tech+Mono&#038;family=Barlow:wght@300;400;500&#038;display=swap\" rel=\"stylesheet\">\n<style>\n  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }<\/p>\n<p>  :root {\n    --orange: #ff7814;\n    --orange-dim: rgba(255,120,20,0.15);\n    --orange-border: rgba(255,120,20,0.3);\n    --bg: #0e0e0e;\n    --surface: rgba(255,255,255,0.04);\n    --border: rgba(255,255,255,0.1);\n    --text: #e8e0d4;\n    --muted: #8a7e6e;\n    --dim: #5a5040;\n    --font-display: 'Rajdhani', sans-serif;\n    --font-mono: 'Share Tech Mono', monospace;\n    --font-body: 'Barlow', sans-serif;\n  }<\/p>\n<p>  body {\n    background: var(--bg);\n    color: var(--text);\n    font-family: var(--font-body);\n    min-height: 100vh;\n    position: relative;\n  }<\/p>\n<p>  body::before {\n    content: '';\n    position: fixed;\n    inset: 0;\n    background:\n      repeating-linear-gradient(0deg, transparent, transparent 39px, rgba(255,120,20,0.025) 40px),\n      repeating-linear-gradient(90deg, transparent, transparent 39px, rgba(255,120,20,0.025) 40px);\n    pointer-events: none;\n    z-index: 0;\n  }<\/p>\n<p>  \/* \u2500\u2500\u2500 EMAIL GATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  #gate {\n    position: fixed;\n    inset: 0;\n    background: rgba(0,0,0,0.92);\n    backdrop-filter: blur(6px);\n    z-index: 1000;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 20px;\n    transition: opacity 0.5s ease;\n  }<\/p>\n<p>  #gate.hiding {\n    opacity: 0;\n    pointer-events: none;\n  }<\/p>\n<p>  .gate-card {\n    background: #141414;\n    border: 1px solid var(--orange-border);\n    max-width: 460px;\n    width: 100%;\n    position: relative;\n    overflow: hidden;\n  }<\/p>\n<p>  .gate-card::before {\n    content: '';\n    position: absolute;\n    top: 0; left: 0; right: 0;\n    height: 3px;\n    background: linear-gradient(90deg, var(--orange), #ffaa50, var(--orange));\n  }<\/p>\n<p>  .gate-header {\n    padding: 28px 28px 0;\n  }<\/p>\n<p>  .gate-badge {\n    display: inline-block;\n    background: var(--orange);\n    color: #000;\n    font-family: var(--font-display);\n    font-weight: 700;\n    font-size: 12px;\n    letter-spacing: 0.18em;\n    padding: 3px 10px;\n    clip-path: polygon(6px 0%, 100% 0%, calc(100% - 6px) 100%, 0% 100%);\n    margin-bottom: 14px;\n  }<\/p>\n<p>  .gate-title {\n    font-family: var(--font-display);\n    font-size: 26px;\n    font-weight: 700;\n    color: #fff;\n    line-height: 1.1;\n    margin-bottom: 10px;\n  }<\/p>\n<p>  .gate-title span { color: var(--orange); }<\/p>\n<p>  .gate-sub {\n    font-size: 15px;\n    color: var(--muted);\n    line-height: 1.6;\n    margin-bottom: 24px;\n  }<\/p>\n<p>  .gate-benefits {\n    list-style: none;\n    margin-bottom: 24px;\n    padding: 0 28px;\n    display: flex;\n    flex-direction: column;\n    gap: 8px;\n  }<\/p>\n<p>  .gate-benefits li {\n    font-size: 15px;\n    color: var(--text);\n    display: flex;\n    align-items: flex-start;\n    gap: 10px;\n  }<\/p>\n<p>  .gate-benefits li::before {\n    content: '\u25b8';\n    color: var(--orange);\n    flex-shrink: 0;\n    margin-top: 1px;\n  }<\/p>\n<p>  .gate-form {\n    padding: 0 28px 28px;\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n  }<\/p>\n<p>  .gate-form input[type=\"text\"],\n  .gate-form input[type=\"email\"] {\n    width: 100%;\n    background: var(--surface);\n    border: 1px solid var(--border);\n    border-radius: 2px;\n    padding: 12px 14px;\n    font-family: var(--font-body);\n    font-size: 16px;\n    color: #fff;\n    outline: none;\n    transition: border-color 0.2s, background 0.2s;\n  }<\/p>\n<p>  .gate-form input:focus {\n    border-color: var(--orange);\n    background: var(--orange-dim);\n  }<\/p>\n<p>  .gate-form input::placeholder { color: var(--dim); }<\/p>\n<p>  .gate-submit {\n    background: var(--orange);\n    color: #000;\n    border: none;\n    padding: 14px;\n    font-family: var(--font-display);\n    font-weight: 700;\n    font-size: 17px;\n    letter-spacing: 0.1em;\n    text-transform: uppercase;\n    cursor: pointer;\n    transition: background 0.2s, transform 0.1s;\n    clip-path: polygon(10px 0%, 100% 0%, calc(100% - 10px) 100%, 0% 100%);\n    border-radius: 0;\n  }<\/p>\n<p>  .gate-submit:hover { background: #ff9540; }\n  .gate-submit:active { transform: scale(0.99); }\n  .gate-submit:disabled { background: #5a3a10; color: #8a6030; cursor: not-allowed; }<\/p>\n<p>  .gate-privacy {\n    text-align: center;\n    font-size: 13px;\n    color: var(--dim);\n    font-family: var(--font-mono);\n    padding: 0 28px 20px;\n  }<\/p>\n<p>  .gate-error {\n    font-size: 14px;\n    color: #ff6060;\n    font-family: var(--font-mono);\n    display: none;\n    padding: 8px 12px;\n    background: rgba(255,60,60,0.08);\n    border: 1px solid rgba(255,60,60,0.2);\n    border-radius: 2px;\n  }<\/p>\n<p>  \/* \u2500\u2500\u2500 CALCULATOR \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  #calc-wrap {\n    position: relative;\n    z-index: 1;\n    display: none;\n  }<\/p>\n<p>  #calc-wrap.visible { display: block; }<\/p>\n<p>  .c-header {\n    padding: 28px 36px 22px;\n    border-bottom: 1px solid rgba(255,120,20,0.2);\n  }<\/p>\n<p>  .c-header-top {\n    display: flex;\n    align-items: flex-end;\n    gap: 16px;\n    margin-bottom: 4px;\n  }<\/p>\n<p>  .c-badge {\n    background: var(--orange);\n    color: #000;\n    font-family: var(--font-display);\n    font-weight: 700;\n    font-size: 12px;\n    letter-spacing: 0.15em;\n    padding: 3px 10px;\n    clip-path: polygon(7px 0%, 100% 0%, calc(100% - 7px) 100%, 0% 100%);\n  }<\/p>\n<p>  .c-title {\n    font-family: var(--font-display);\n    font-size: 26px;\n    font-weight: 700;\n    letter-spacing: 0.04em;\n    color: #fff;\n    line-height: 1;\n  }<\/p>\n<p>  .c-title span { color: var(--orange); }<\/p>\n<p>  .c-sub {\n    font-size: 13px;\n    color: var(--dim);\n    font-family: var(--font-mono);\n    letter-spacing: 0.07em;\n  }<\/p>\n<p>  .c-main {\n    display: grid;\n    grid-template-columns: 1fr 340px;\n    gap: 0;\n    max-width: 1060px;\n    margin: 0 auto;\n    padding: 28px 36px;\n    align-items: start;\n  }<\/p>\n<p>  @media (max-width: 780px) {\n    .c-main { grid-template-columns: 1fr; padding: 20px 18px; }\n    .c-header { padding: 22px 18px 18px; }\n    .c-title { font-size: 20px; }\n    .gate-title { font-size: 22px; }\n    .gate-header { padding: 22px 20px 0; }\n    .gate-form { padding: 0 20px 22px; }\n    .gate-benefits { padding: 0 20px; }\n    .gate-privacy { padding: 0 20px 16px; }\n  }<\/p>\n<p>  .c-inputs { padding-right: 32px; }\n  @media (max-width: 780px) { .c-inputs { padding-right: 0; } }<\/p>\n<p>  .sec-label {\n    font-family: var(--font-display);\n    font-size: 13px;\n    font-weight: 600;\n    letter-spacing: 0.22em;\n    color: var(--orange);\n    text-transform: uppercase;\n    margin-bottom: 14px;\n    display: flex;\n    align-items: center;\n    gap: 10px;\n  }<\/p>\n<p>  .sec-label::after {\n    content: '';\n    flex: 1;\n    height: 1px;\n    background: linear-gradient(90deg, rgba(255,120,20,0.35), transparent);\n  }<\/p>\n<p>  .inp-group { margin-bottom: 26px; }<\/p>\n<p>  .inp-row {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 12px;\n    margin-bottom: 12px;\n  }<\/p>\n<p>  .inp-row.three { grid-template-columns: 1fr 1fr 1fr; }\n  @media (max-width: 500px) {\n    .inp-row, .inp-row.three { grid-template-columns: 1fr; }\n  }<\/p>\n<p>  .field { display: flex; flex-direction: column; gap: 5px; }<\/p>\n<p>  .field label {\n    font-size: 12px;\n    letter-spacing: 0.1em;\n    color: var(--muted);\n    text-transform: uppercase;\n    font-weight: 500;\n  }<\/p>\n<p>  .inp-wrap { position: relative; display: flex; align-items: center; }<\/p>\n<p>  .inp-wrap input[type=\"number\"] {\n    width: 100%;\n    background: var(--surface);\n    border: 1px solid var(--border);\n    border-radius: 2px;\n    padding: 9px 40px 9px 11px;\n    font-family: var(--font-mono);\n    font-size: 16px;\n    color: #fff;\n    outline: none;\n    transition: border-color 0.2s, background 0.2s;\n    -webkit-appearance: none;\n    -moz-appearance: textfield;\n  }<\/p>\n<p>  .inp-wrap input[type=\"number\"]::-webkit-inner-spin-button,\n  .inp-wrap input[type=\"number\"]::-webkit-outer-spin-button { -webkit-appearance: none; }<\/p>\n<p>  .inp-wrap input[type=\"number\"]:focus {\n    border-color: var(--orange);\n    background: var(--orange-dim);\n  }<\/p>\n<p>  .unit {\n    position: absolute;\n    right: 9px;\n    font-family: var(--font-mono);\n    font-size: 12px;\n    color: var(--dim);\n    pointer-events: none;\n  }<\/p>\n<p>  .hint {\n    font-size: 12px;\n    color: var(--dim);\n    line-height: 1.4;\n  }<\/p>\n<p>  .slider-field { display: flex; flex-direction: column; gap: 7px; }<\/p>\n<p>  .slider-top {\n    display: flex;\n    justify-content: space-between;\n    align-items: baseline;\n  }<\/p>\n<p>  .slider-top label {\n    font-size: 12px;\n    letter-spacing: 0.1em;\n    color: var(--muted);\n    text-transform: uppercase;\n    font-weight: 500;\n  }<\/p>\n<p>  .slider-val {\n    font-family: var(--font-mono);\n    font-size: 16px;\n    color: var(--orange);\n  }<\/p>\n<p>  input[type=\"range\"] {\n    -webkit-appearance: none;\n    width: 100%;\n    height: 3px;\n    background: var(--border);\n    border-radius: 2px;\n    outline: none;\n    cursor: pointer;\n  }<\/p>\n<p>  input[type=\"range\"]::-webkit-slider-thumb {\n    -webkit-appearance: none;\n    width: 13px;\n    height: 13px;\n    background: var(--orange);\n    clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);\n    cursor: pointer;\n  }<\/p>\n<p>  .toggle-row {\n    display: flex;\n    gap: 8px;\n    margin-bottom: 16px;\n  }<\/p>\n<p>  .tog {\n    flex: 1;\n    padding: 7px 6px;\n    background: var(--surface);\n    border: 1px solid var(--border);\n    color: var(--muted);\n    font-family: var(--font-display);\n    font-size: 13px;\n    font-weight: 600;\n    letter-spacing: 0.08em;\n    text-transform: uppercase;\n    cursor: pointer;\n    transition: all 0.2s;\n    border-radius: 2px;\n  }<\/p>\n<p>  .tog.active {\n    background: var(--orange-dim);\n    border-color: var(--orange);\n    color: var(--orange);\n  }<\/p>\n<p>  \/* \u2500\u2500\u2500 RESULTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  .c-results {\n    position: sticky;\n    top: 24px;\n  }<\/p>\n<p>  .res-card {\n    background: rgba(255,120,20,0.04);\n    border: 1px solid var(--orange-border);\n    border-radius: 2px;\n    overflow: hidden;\n  }<\/p>\n<p>  .res-head {\n    background: var(--orange);\n    padding: 12px 18px;\n    font-family: var(--font-display);\n    font-weight: 700;\n    font-size: 14px;\n    letter-spacing: 0.15em;\n    color: #000;\n    text-transform: uppercase;\n  }<\/p>\n<p>  .res-body { padding: 18px; }<\/p>\n<p>  .cost-row {\n    display: flex;\n    justify-content: space-between;\n    align-items: baseline;\n    padding: 7px 0;\n    border-bottom: 1px solid rgba(255,255,255,0.05);\n    font-size: 14px;\n  }<\/p>\n<p>  .cost-row:last-of-type { border-bottom: none; }<\/p>\n<p>  .cost-lbl { color: var(--muted); }\n  .cost-lbl.sm { color: var(--dim); font-size: 12px; }<\/p>\n<p>  .cost-val {\n    font-family: var(--font-mono);\n    font-size: 14px;\n    color: #c8bfaf;\n  }<\/p>\n<p>  .cost-val.zero { color: var(--dim); }<\/p>\n<p>  .divider {\n    height: 1px;\n    background: rgba(255,120,20,0.2);\n    margin: 10px 0;\n  }<\/p>\n<p>  .total-row {\n    display: flex;\n    justify-content: space-between;\n    align-items: baseline;\n    margin-bottom: 5px;\n  }<\/p>\n<p>  .total-lbl {\n    font-family: var(--font-display);\n    font-size: 14px;\n    font-weight: 600;\n    letter-spacing: 0.08em;\n    text-transform: uppercase;\n    color: var(--muted);\n  }<\/p>\n<p>  .total-val {\n    font-family: var(--font-display);\n    font-size: 19px;\n    font-weight: 700;\n    color: var(--text);\n  }<\/p>\n<p>  .profit-val {\n    font-family: var(--font-mono);\n    font-size: 14px;\n    color: var(--orange);\n  }<\/p>\n<p>  .sell-block {\n    background: rgba(255,120,20,0.07);\n    border: 1px solid var(--orange-border);\n    border-radius: 2px;\n    padding: 14px;\n    margin-top: 14px;\n    text-align: center;\n  }<\/p>\n<p>  .sell-lbl {\n    font-family: var(--font-display);\n    font-size: 12px;\n    font-weight: 600;\n    letter-spacing: 0.2em;\n    text-transform: uppercase;\n    color: var(--orange);\n    margin-bottom: 4px;\n  }<\/p>\n<p>  .sell-val {\n    font-family: var(--font-display);\n    font-size: 40px;\n    font-weight: 700;\n    color: var(--orange);\n    line-height: 1;\n  }<\/p>\n<p>  .sell-sub {\n    font-size: 12px;\n    color: var(--muted);\n    margin-top: 3px;\n    font-family: var(--font-mono);\n  }<\/p>\n<p>  .bar-wrap { margin-top: 14px; }<\/p>\n<p>  .bar-labels {\n    display: flex;\n    justify-content: space-between;\n    font-size: 12px;\n    color: var(--muted);\n    margin-bottom: 5px;\n    font-family: var(--font-mono);\n  }<\/p>\n<p>  .bar-track {\n    height: 5px;\n    background: rgba(255,255,255,0.07);\n    border-radius: 1px;\n    overflow: hidden;\n  }<\/p>\n<p>  .bar-fill {\n    height: 100%;\n    background: linear-gradient(90deg, var(--orange), #ffaa50);\n    border-radius: 1px;\n    transition: width 0.3s ease;\n  }<\/p>\n<p>  .breakeven {\n    font-size: 12px;\n    color: var(--muted);\n    text-align: center;\n    margin-top: 10px;\n    font-family: var(--font-mono);\n    padding: 7px 10px;\n    background: rgba(255,255,255,0.03);\n    border-radius: 2px;\n  }<\/p>\n<p>  .breakeven span { color: var(--text); }<\/p>\n<p>  .warn {\n    background: rgba(255,60,60,0.07);\n    border: 1px solid rgba(255,60,60,0.22);\n    border-radius: 2px;\n    padding: 9px 12px;\n    font-size: 12px;\n    color: #ff6060;\n    margin-top: 10px;\n    font-family: var(--font-mono);\n    display: none;\n  }<\/p>\n<p>  .c-footer {\n    position: relative;\n    z-index: 1;\n    padding: 16px 36px;\n    border-top: 1px solid rgba(255,120,20,0.1);\n    font-size: 12px;\n    color: var(--dim);\n    font-family: var(--font-mono);\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    flex-wrap: wrap;\n    gap: 6px;\n  }<\/p>\n<p>  @media (max-width: 780px) { .c-footer { padding: 14px 18px; } }\n<\/style>\n<p><\/head><br \/>\n<body><\/p>\n<p><!-- \u2550\u2550\u2550\u2550 EMAIL GATE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 --><\/p>\n<div id=\"gate\">\n<div class=\"gate-card\">\n<div class=\"gate-header\">\n<div class=\"gate-badge\">FREE TOOL \u2014 VEXIL 3D LABS<\/div>\n<h2 class=\"gate-title\">3D Print <span>Cost<\/span> Calculator<\/h2>\n<p class=\"gate-sub\">Stop guessing what to charge. Enter your details below and get instant access to the tool used by SA&#8217;s 3D print community.<\/p>\n<\/p><\/div>\n<ul class=\"gate-benefits\">\n<li>Calculates filament, electricity, machine wear &amp; labour costs<\/li>\n<li>Shows your break-even price so you never print at a loss<\/li>\n<li>Suggests a sell price at your target markup<\/li>\n<li>Built for South African rand and load-shedding electricity rates<\/li>\n<\/ul>\n<div class=\"gate-form\">\n      <input type=\"text\" id=\"gate-name\" placeholder=\"Your first name\" autocomplete=\"given-name\"><br \/>\n      <input type=\"email\" id=\"gate-email\" placeholder=\"Your email address\" autocomplete=\"email\"><\/p>\n<div class=\"gate-error\" id=\"gate-error\"><\/div>\n<p>      <button class=\"gate-submit\" id=\"gate-btn\" onclick=\"handleGateSubmit()\"><br \/>\n        Get Free Access \u2192<br \/>\n      <\/button>\n    <\/div>\n<p class=\"gate-privacy\">No spam. Unsubscribe any time. We&#8217;ll occasionally send filament tips &amp; deals.<\/p>\n<\/p><\/div>\n<\/div>\n<p><!-- \u2550\u2550\u2550\u2550 CALCULATOR \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 --><\/p>\n<div id=\"calc-wrap\">\n<div class=\"c-header\">\n<div class=\"c-header-top\">\n<div class=\"c-badge\">VEXIL 3D LABS<\/div>\n<h1 class=\"c-title\">PRINT <span>COST<\/span> CALCULATOR<\/h1>\n<\/p><\/div>\n<div class=\"c-sub\">\/\/ know your numbers. price with confidence. print profitably.<\/div>\n<\/p><\/div>\n<div class=\"c-main\">\n<div class=\"c-inputs\">\n<p>      <!-- FILAMENT --><\/p>\n<div class=\"inp-group\">\n<div class=\"sec-label\">01 \u2014 Filament<\/div>\n<div class=\"inp-row\">\n<div class=\"field\">\n            <label>Filament price<\/label><\/p>\n<div class=\"inp-wrap\">\n              <input type=\"number\" id=\"f-price\" value=\"349\" min=\"50\" max=\"2000\" step=\"1\" oninput=\"recalc()\"><br \/>\n              <span class=\"unit\">R\/kg<\/span>\n            <\/div>\n<\/p><\/div>\n<div class=\"field\">\n            <label>Print weight<\/label><\/p>\n<div class=\"inp-wrap\">\n              <input type=\"number\" id=\"f-weight\" value=\"50\" min=\"1\" max=\"5000\" step=\"1\" oninput=\"recalc()\"><br \/>\n              <span class=\"unit\">g<\/span>\n            <\/div>\n<p>            <span class=\"hint\">Check your slicer for estimated weight<\/span>\n          <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>      <!-- TIME & ELECTRICITY --><\/p>\n<div class=\"inp-group\">\n<div class=\"sec-label\">02 \u2014 Time &amp; Electricity<\/div>\n<div class=\"inp-row three\">\n<div class=\"field\">\n            <label>Print time<\/label><\/p>\n<div class=\"inp-wrap\">\n              <input type=\"number\" id=\"p-time\" value=\"3\" min=\"0.1\" max=\"200\" step=\"0.5\" oninput=\"recalc()\"><br \/>\n              <span class=\"unit\">hrs<\/span>\n            <\/div>\n<\/p><\/div>\n<div class=\"field\">\n            <label>Printer power<\/label><\/p>\n<div class=\"inp-wrap\">\n              <input type=\"number\" id=\"p-watts\" value=\"200\" min=\"50\" max=\"1000\" step=\"10\" oninput=\"recalc()\"><br \/>\n              <span class=\"unit\">W<\/span>\n            <\/div>\n<\/p><\/div>\n<div class=\"field\">\n            <label>Electricity rate<\/label><\/p>\n<div class=\"inp-wrap\">\n              <input type=\"number\" id=\"p-elec\" value=\"3.50\" min=\"0.5\" max=\"20\" step=\"0.1\" oninput=\"recalc()\"><br \/>\n              <span class=\"unit\">R\/kWh<\/span>\n            <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>      <!-- MACHINE --><\/p>\n<div class=\"inp-group\">\n<div class=\"sec-label\">03 \u2014 Machine Cost<\/div>\n<div class=\"inp-row\">\n<div class=\"field\">\n            <label>Machine rate<\/label><\/p>\n<div class=\"inp-wrap\">\n              <input type=\"number\" id=\"m-rate\" value=\"15\" min=\"0\" max=\"500\" step=\"5\" oninput=\"recalc()\"><br \/>\n              <span class=\"unit\">R\/hr<\/span>\n            <\/div>\n<p>            <span class=\"hint\">Printer cost \u00f7 expected lifetime hours. R3,000 printer over 200hrs \u2248 R15\/hr<\/span>\n          <\/div>\n<div class=\"field\"><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>      <!-- FAILURE --><\/p>\n<div class=\"inp-group\">\n<div class=\"sec-label\">04 \u2014 Failure &amp; Waste Allowance<\/div>\n<div class=\"slider-field\">\n<div class=\"slider-top\">\n            <label>Failed print risk<\/label><br \/>\n            <span class=\"slider-val\" id=\"fail-val\">10%<\/span>\n          <\/div>\n<p>          <input type=\"range\" id=\"fail-rate\" min=\"0\" max=\"50\" step=\"1\" value=\"10\"\n            oninput=\"document.getElementById('fail-val').textContent=this.value+'%'; recalc()\"><br \/>\n          <span class=\"hint\">Adds a cost buffer for failures &amp; wasted filament. 10% is a reasonable default for dialled-in materials.<\/span>\n        <\/div>\n<\/p><\/div>\n<p>      <!-- LABOUR --><\/p>\n<div class=\"inp-group\">\n<div class=\"sec-label\">05 \u2014 Labour (Optional)<\/div>\n<div class=\"toggle-row\">\n          <button class=\"tog active\" id=\"tog-no\" onclick=\"setLabour(false)\">Exclude Labour<\/button><br \/>\n          <button class=\"tog\" id=\"tog-yes\" onclick=\"setLabour(true)\">Include Labour<\/button>\n        <\/div>\n<div id=\"labour-fields\" style=\"display:none;\">\n<div class=\"inp-row\">\n<div class=\"field\">\n              <label>Labour hours<\/label><\/p>\n<div class=\"inp-wrap\">\n                <input type=\"number\" id=\"l-hours\" value=\"0\" min=\"0\" max=\"100\" step=\"0.25\" oninput=\"recalc()\"><br \/>\n                <span class=\"unit\">hrs<\/span>\n              <\/div>\n<p>              <span class=\"hint\">Design, post-processing, packing<\/span>\n            <\/div>\n<div class=\"field\">\n              <label>Hourly rate<\/label><\/p>\n<div class=\"inp-wrap\">\n                <input type=\"number\" id=\"l-rate\" value=\"150\" min=\"50\" max=\"2000\" step=\"25\" oninput=\"recalc()\"><br \/>\n                <span class=\"unit\">R\/hr<\/span>\n              <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>      <!-- MARGIN --><\/p>\n<div class=\"inp-group\">\n<div class=\"sec-label\">06 \u2014 Profit Markup<\/div>\n<div class=\"slider-field\">\n<div class=\"slider-top\">\n            <label>Profit markup<\/label><br \/>\n            <span class=\"slider-val\" id=\"markup-val\">67%<\/span>\n          <\/div>\n<p>          <input type=\"range\" id=\"markup\" min=\"5\" max=\"200\" step=\"5\" value=\"67\"\n            oninput=\"document.getElementById('markup-val').textContent=this.value+'%'; recalc()\"><br \/>\n          <span class=\"hint\">Markup = profit \u00f7 cost. Hobby: 25\u201350% \u00b7 Side hustle: 50\u2013100% \u00b7 Service business: 100%+<br \/><span style=\"color:var(--dim)\">Gross margin = markup \u00f7 (100 + markup). e.g. 67% markup = 40.1% gross margin<\/span><\/span>\n        <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p><!-- \/c-inputs --><\/p>\n<p>    <!-- RESULTS --><\/p>\n<div class=\"c-results\">\n<div class=\"res-card\">\n<div class=\"res-head\">Cost Breakdown<\/div>\n<div class=\"res-body\">\n<div class=\"cost-row\">\n            <span class=\"cost-lbl\">Filament<\/span><br \/>\n            <span class=\"cost-val\" id=\"r-filament\">R0.00<\/span>\n          <\/div>\n<div class=\"cost-row\" id=\"r-fail-row\">\n            <span class=\"cost-lbl sm\">\u21b3 Failure buffer<\/span><br \/>\n            <span class=\"cost-val\" id=\"r-fail\">R0.00<\/span>\n          <\/div>\n<div class=\"cost-row\">\n            <span class=\"cost-lbl\">Electricity<\/span><br \/>\n            <span class=\"cost-val\" id=\"r-elec\">R0.00<\/span>\n          <\/div>\n<div class=\"cost-row\">\n            <span class=\"cost-lbl\">Machine wear<\/span><br \/>\n            <span class=\"cost-val\" id=\"r-machine\">R0.00<\/span>\n          <\/div>\n<div class=\"cost-row\">\n            <span class=\"cost-lbl\">Labour<\/span><br \/>\n            <span class=\"cost-val zero\" id=\"r-labour\">\u2014<\/span>\n          <\/div>\n<div class=\"divider\"><\/div>\n<div class=\"total-row\">\n            <span class=\"total-lbl\">Total Cost<\/span><br \/>\n            <span class=\"total-val\" id=\"r-total\">R0.00<\/span>\n          <\/div>\n<div class=\"total-row\">\n            <span class=\"total-lbl\">Profit<\/span><br \/>\n            <span class=\"profit-val\" id=\"r-profit\">R0.00<\/span>\n          <\/div>\n<div class=\"total-row\">\n            <span class=\"total-lbl\" style=\"color:var(--dim);font-size:11px\">Gross margin<\/span><br \/>\n            <span class=\"profit-val\" style=\"color:var(--dim);font-size:11px\" id=\"r-gm\">0.0%<\/span>\n          <\/div>\n<div class=\"sell-block\">\n<div class=\"sell-lbl\">Suggested Sell Price<\/div>\n<div class=\"sell-val\" id=\"r-sell\">R0<\/div>\n<div class=\"sell-sub\" id=\"r-sell-sub\">at 67% markup \u00b7 40.1% gross margin<\/div>\n<\/p><\/div>\n<div class=\"bar-wrap\">\n<div class=\"bar-labels\"><span>Cost<\/span><span>Profit<\/span><\/div>\n<div class=\"bar-track\">\n<div class=\"bar-fill\" id=\"r-bar\" style=\"width:60%\"><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"breakeven\" id=\"r-breakeven\">\n            Break-even price: <span>R0<\/span><br \/>Never price below this.\n          <\/div>\n<div class=\"warn\" id=\"r-warn\">\n            \u26a0 Markup below 25%. You&#8217;re barely covering costs. Raise your price or reduce costs.\n          <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p><!-- \/c-results --><\/p><\/div>\n<p><!-- \/c-main --><\/p>\n<div class=\"c-footer\">\n    <span>Built by Vexil 3D Labs \u00b7 vexil3dlabs.co.za<\/span><br \/>\n    <span>All prices in South African Rand (ZAR)<\/span>\n  <\/div>\n<\/div>\n<p><!-- \/calc-wrap --><\/p>\n<p><script>\n\/\/ \u2500\u2500 HELPER \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction v(id) { return parseFloat(document.getElementById(id).value) || 0; }\nfunction fmt(n) { return 'R' + n.toFixed(2); }\nfunction fmtW(n) { return 'R' + Math.ceil(n); }\nfunction set(id, val) { document.getElementById(id).textContent = val; }<\/p>\n<p>\/\/ \u2500\u2500 LABOUR TOGGLE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nvar labourOn = false;\nfunction setLabour(on) {\n  labourOn = on;\n  document.getElementById('labour-fields').style.display = on ? 'block' : 'none';\n  document.getElementById('tog-no').classList.toggle('active', !on);\n  document.getElementById('tog-yes').classList.toggle('active', on);\n  recalc();\n}<\/p>\n<p>\/\/ \u2500\u2500 RECALCULATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction recalc() {\n  var filamentPerG = v('f-price') \/ 1000;\n  var filament     = v('f-weight') * filamentPerG;\n  var failRate     = v('fail-rate') \/ 100;\n  var adjFilament  = filament * (1 + failRate);\n  var failBuf      = adjFilament - filament;\n  var electricity  = (v('p-watts') \/ 1000) * v('p-time') * v('p-elec');\n  var machine      = v('p-time') * v('m-rate');\n  var labour       = labourOn ? v('l-hours') * v('l-rate') : 0;\n  var markup       = v('markup');\n  var total        = adjFilament + electricity + machine + labour;\n  var sell         = Math.ceil(total * (1 + markup \/ 100));\n  var profit       = total * (markup \/ 100);\n  var grossMargin  = markup \/ (100 + markup) * 100;<\/p>\n<p>  set('r-filament', fmt(filament));\n  set('r-fail',     fmt(failBuf));\n  set('r-elec',     fmt(electricity));\n  set('r-machine',  fmt(machine));<\/p>\n<p>  if (labour > 0) {\n    document.getElementById('r-labour').textContent = fmt(labour);\n    document.getElementById('r-labour').classList.remove('zero');\n  } else {\n    document.getElementById('r-labour').textContent = '\u2014';\n    document.getElementById('r-labour').classList.add('zero');\n  }<\/p>\n<p>  document.getElementById('r-fail-row').style.display = failBuf > 0 ? 'flex' : 'none';<\/p>\n<p>  set('r-total',  fmt(total));\n  set('r-profit', fmt(profit));\n  set('r-gm',     grossMargin.toFixed(1) + '%');\n  set('r-sell',   fmtW(sell));\n  document.getElementById('r-sell-sub').textContent = 'at ' + markup + '% markup  \u00b7  ' + grossMargin.toFixed(1) + '% gross margin';\n  document.getElementById('r-bar').style.width = (grossMargin) + '%';\n  document.getElementById('r-breakeven').innerHTML =\n    'Break-even price: <span>' + fmtW(total) + '<\/span><br \/>Never price below this.';\n  document.getElementById('r-warn').style.display = markup < 25 ? 'block' : 'none';\n}\n\n\/\/ \u2500\u2500 EMAIL GATE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\/\/ Check if already unlocked (returning visitor)\nif (localStorage.getItem('vexil_calc_unlocked') === '1') {\n  unlockCalc(false);\n}\n\nfunction handleGateSubmit() {\n  var name  = document.getElementById('gate-name').value.trim();\n  var email = document.getElementById('gate-email').value.trim();\n  var err   = document.getElementById('gate-error');\n  var btn   = document.getElementById('gate-btn');\n\n  \/\/ Basic validation\n  if (!name) { showError('Please enter your first name.'); return; }\n  if (!email || !email.includes('@') || !email.includes('.')) {\n    showError('Please enter a valid email address.'); return;\n  }\n\n  err.style.display = 'none';\n  btn.disabled = true;\n  btn.textContent = 'Unlocking...';\n\n  \/\/ \u2500\u2500 MAILCHIMP \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  var MC_URL = 'https:\/\/vexil3dlabs.us14.list-manage.com\/subscribe\/post?u=b21fa8bcbad7777c7db55ec48&#038;id=e4e02472ef&#038;f_id=00724de5f0';\n\n  fetch(MC_URL, {\n    method: 'POST',\n    mode: 'no-cors',\n    headers: { 'Content-Type': 'application\/x-www-form-urlencoded' },\n    body: 'EMAIL=' + encodeURIComponent(email) + '&#038;FNAME=' + encodeURIComponent(name) + '&#038;tags=calculator-download'\n  })\n  .then(function() {\n    unlockCalc(true);\n  })\n  .catch(function() {\n    unlockCalc(true);\n  });\n}\n\nfunction showError(msg) {\n  var err = document.getElementById('gate-error');\n  err.textContent = msg;\n  err.style.display = 'block';\n}\n\nfunction unlockCalc(animate) {\n  localStorage.setItem('vexil_calc_unlocked', '1');\n  var calcWrap = document.getElementById('calc-wrap');\n  calcWrap.classList.add('visible');\n  if (animate) {\n    var gate = document.getElementById('gate');\n    gate.classList.add('hiding');\n    setTimeout(function() { gate.style.display = 'none'; }, 500);\n  } else {\n    document.getElementById('gate').style.display = 'none';\n  }\n  recalc();\n}\n\n\/\/ Run initial calc\nrecalc();\n<\/script><br \/>\n<\/body><br \/>\n<\/html><\/p>\n","protected":false},"excerpt":{"rendered":"<p>3D Print Cost Calculator \u2014 Vexil 3D Labs FREE TOOL \u2014 VEXIL 3D LABS 3D Print Cost Calculator Stop guessing what to charge. Enter your details below and get instant access to the tool used by SA&#8217;s 3D print community. Calculates filament, electricity, machine wear &amp; labour costs Shows your break-even price so you never [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3421","page","type-page","status-publish","hentry"],"blocksy_meta":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>3D Print Cost Calculator - Vexil 3D Labs<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vexil3dlabs.co.za\/?page_id=3421\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"3D Print Cost Calculator - Vexil 3D Labs\" \/>\n<meta property=\"og:description\" content=\"3D Print Cost Calculator \u2014 Vexil 3D Labs FREE TOOL \u2014 VEXIL 3D LABS 3D Print Cost Calculator Stop guessing what to charge. Enter your details below and get instant access to the tool used by SA&#8217;s 3D print community. Calculates filament, electricity, machine wear &amp; labour costs Shows your break-even price so you never [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vexil3dlabs.co.za\/?page_id=3421\" \/>\n<meta property=\"og:site_name\" content=\"Vexil 3D Labs\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-31T05:10:05+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/?page_id=3421\",\"url\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/?page_id=3421\",\"name\":\"3D Print Cost Calculator - Vexil 3D Labs\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/#website\"},\"datePublished\":\"2026-07-29T15:32:09+00:00\",\"dateModified\":\"2026-07-31T05:10:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/?page_id=3421#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vexil3dlabs.co.za\\\/?page_id=3421\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/?page_id=3421#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"3D Print Cost Calculator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/#website\",\"url\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/\",\"name\":\"Vexil 3D Labs\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/#organization\",\"name\":\"Vexil 3D Labs\",\"url\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/Vexil-Logo-2026-Dark.png\",\"contentUrl\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/Vexil-Logo-2026-Dark.png\",\"width\":1310,\"height\":466,\"caption\":\"Vexil 3D Labs\"},\"image\":{\"@id\":\"https:\\\/\\\/vexil3dlabs.co.za\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"3D Print Cost Calculator - Vexil 3D Labs","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vexil3dlabs.co.za\/?page_id=3421","og_locale":"en_US","og_type":"article","og_title":"3D Print Cost Calculator - Vexil 3D Labs","og_description":"3D Print Cost Calculator \u2014 Vexil 3D Labs FREE TOOL \u2014 VEXIL 3D LABS 3D Print Cost Calculator Stop guessing what to charge. Enter your details below and get instant access to the tool used by SA&#8217;s 3D print community. Calculates filament, electricity, machine wear &amp; labour costs Shows your break-even price so you never [&hellip;]","og_url":"https:\/\/vexil3dlabs.co.za\/?page_id=3421","og_site_name":"Vexil 3D Labs","article_modified_time":"2026-07-31T05:10:05+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vexil3dlabs.co.za\/?page_id=3421","url":"https:\/\/vexil3dlabs.co.za\/?page_id=3421","name":"3D Print Cost Calculator - Vexil 3D Labs","isPartOf":{"@id":"https:\/\/vexil3dlabs.co.za\/#website"},"datePublished":"2026-07-29T15:32:09+00:00","dateModified":"2026-07-31T05:10:05+00:00","breadcrumb":{"@id":"https:\/\/vexil3dlabs.co.za\/?page_id=3421#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vexil3dlabs.co.za\/?page_id=3421"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/vexil3dlabs.co.za\/?page_id=3421#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vexil3dlabs.co.za\/"},{"@type":"ListItem","position":2,"name":"3D Print Cost Calculator"}]},{"@type":"WebSite","@id":"https:\/\/vexil3dlabs.co.za\/#website","url":"https:\/\/vexil3dlabs.co.za\/","name":"Vexil 3D Labs","description":"","publisher":{"@id":"https:\/\/vexil3dlabs.co.za\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vexil3dlabs.co.za\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/vexil3dlabs.co.za\/#organization","name":"Vexil 3D Labs","url":"https:\/\/vexil3dlabs.co.za\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vexil3dlabs.co.za\/#\/schema\/logo\/image\/","url":"https:\/\/vexil3dlabs.co.za\/wp-content\/uploads\/2026\/07\/Vexil-Logo-2026-Dark.png","contentUrl":"https:\/\/vexil3dlabs.co.za\/wp-content\/uploads\/2026\/07\/Vexil-Logo-2026-Dark.png","width":1310,"height":466,"caption":"Vexil 3D Labs"},"image":{"@id":"https:\/\/vexil3dlabs.co.za\/#\/schema\/logo\/image\/"}}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/vexil3dlabs.co.za\/index.php?rest_route=\/wp\/v2\/pages\/3421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vexil3dlabs.co.za\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vexil3dlabs.co.za\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/vexil3dlabs.co.za\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vexil3dlabs.co.za\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3421"}],"version-history":[{"count":2,"href":"https:\/\/vexil3dlabs.co.za\/index.php?rest_route=\/wp\/v2\/pages\/3421\/revisions"}],"predecessor-version":[{"id":3551,"href":"https:\/\/vexil3dlabs.co.za\/index.php?rest_route=\/wp\/v2\/pages\/3421\/revisions\/3551"}],"wp:attachment":[{"href":"https:\/\/vexil3dlabs.co.za\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}