PageSourceSearch

https://www.balancingservices.co.uk/what-is-dynamic-balancing/

html balancingservices.co.uk collected 2026-10-03 18:58:52 UTC 87,763 bytes, 696 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en-US">
3<head>
3<script data-acconsent="net-shim">
4(function(){
5  var MAP = {"googletagmanager.com":"analytics","google-analytics.com":"analytics","clarity.ms":"analytics","dashboard.searchatlas.com":"analytics","sa.searchatlas.com":"analytics","nr-data.net":"analytics","bam.nr-data.net":"analytics","munchkin.marketo.net":"marketing","snap.licdn.com":"marketing","px.ads.linkedin.com":"marketing","bat.bing.com":"marketing","doubleclick.net":"marketing","googleadservices.com":"marketing","snitcher.com":"marketing","rb2b.com":"marketing","adobedtm.com":"analytics","demdex.net":"marketing","omtrdc.net":"analytics"};
6  // H1: hosts whose data flow constitutes a CCPA/CPRA "sale/share" — blocked
7  // whenever the visitor has opted out via GPC or "Do Not Sell", regardless
8  // of whether their (possibly narrower, e.g. analytics-only) category was
9  // otherwise granted. See the Sephora enforcement action re: bucketed
10  // analytics tools that still disclose data to a third party.
11  var SALE = ["clarity.ms","snitcher.com","rb2b.com","demdex.net"];
12  // H2: hosts flagged as handling Sensitive Personal Information (CCPA
13  // §1798.121) — permanently blocked while limit_spi_enabled is on,
14  // independent of any category grant.
15  var SPI = [];
16  // Google Advanced Consent Mode allowlist: hosts that MAY load
17  // pre-consent (in cookieless "modeling ping" mode) even though their
18  // category isn't granted yet. Populated ONLY when the consent_mode
19  // setting is on AND at least one enabled managed script is flagged
20  // consent_mode — otherwise empty, so behaviour is byte-identical to
21  // the hard-withholding default. A CM-allowed host STILL yields to a
22  // sale/share or SPI opt-out below (compliance wins over modeling).
23  var CM = [];
24  var granted = { necessary: true };
25  var saleShareOptOut = false; // set by consent.js via __acconsentSetSaleShareOptOut.
26  var spiLimited = true; // H2: SPI limitation is ON by default — see readme FAQ.
27  function catFor(url){
28    try { url = String(url).toLowerCase(); } catch(e){ return null; }
29    for (var host in MAP){ if (url.indexOf(host) !== -1) return MAP[host]; }
30    return null;
31  }
32  function hostMatch(url, list){
33    try { url = String(url).toLowerCase(); } catch(e){ return false; }
34    for (var i=0;i<list.length;i++){ if (url.indexOf(list[i]) !== -1) return true; }
35    return false;
36  }
37  function saleBlocked(url){ return saleShareOptOut && hostMatch(url, SALE); }
38  function spiBlocked(url){ return spiLimited && hostMatch(url, SPI); }
39  function cmAllowed(url){ return hostMatch(url, CM); }
40  function blocked(url){
41    // A sale/share or SPI opt-out ALWAYS wins — even the cookieless
42    // Consent-Mode ping is withheld once the visitor has opted out.
43    if (saleBlocked(url) || spiBlocked(url)) return true;
44    var c = catFor(url);
45    if (c && !granted[c]) {
46      // Category not yet granted. Normally withheld — UNLESS this is a
47      // Consent-Mode-allowlisted Google host, which is permitted to load
48      // cookieless pre-consent so GA4 can send anonymized modeling pings
49      // (the gtag('consent','default',{…denied…}) block keeps identifiers
50      // off; consent.js upgrades to granted via gtag('consent','update')).
51      if (cmAllowed(url)) return false;
52      return true;
53    }
54    return false;
55  }
56  // Generalized deferral: stash the blocked resource attribute so the consent
57  // engine can restore it on grant. Works for any tag/attribute (src, href,
58  // srcset) so release is uniform. Script also gets type=text/plain (inert).
59  function neutralize(node, attr, value){
60    try {
61      var tag = node.tagName ? node.tagName.toLowerCase() : '';
62      if (tag === 'script') { try { node.type = 'text/plain'; } catch(e){} }
63      node.setAttribute('data-acconsent-blocked', catFor(value) || 'marketing');
64      node.setAttribute('data-acconsent-attr', attr);
65      node.setAttribute('data-acconsent-src', value);
66    } catch(e){}
67  }
68  function inertStub(){
69    // Minimal EventTarget-ish no-op so `x.addEventListener`, `x.close()`,
70    // `x.send()`, `x.postMessage()` and readyState reads don't throw.
71    return {
72      readyState: 3, // CLOSED
73      close: function(){}, send: function(){}, postMessage: function(){},
74      terminate: function(){}, start: function(){},
75      addEventListener: function(){}, removeEventListener: function(){},
76      dispatchEvent: function(){ return false; },
77      onopen: null, onmessage: null, onerror: null, onclose: null
78    };
79  }
80  // Apply the network-API guards to a given window/realm. Called for the top
81  // window AND for each same-origin child iframe (whose pristine realm would
82  // otherwise expose un-patched fetch/XHR/sendBeacon/WebSocket — a full escape).
83  // Idempotent via a per-realm flag so re-observing the same frame is a no-op.
84  function patchRealm(win){
85    try {
86      if (!win || win.__acconsentPatched) return;
87      win.__acconsentPatched = true;
88    } catch(e){ return; } // cross-origin frame: property access throws — skip.
89    // fetch
90    if (win.fetch){
91      var of = win.fetch;
92      win.fetch = function(input, init){
93        var url = (input && input.url) ? input.url : input;
94        if (blocked(url)) return Promise.resolve(new win.Response(null, {status:204, statusText:'blocked-by-consent'}));
95        return of.apply(this, arguments);
96      };
97    }
98    // XHR
99    if (win.XMLHttpRequest){
100      var op = win.XMLHttpRequest.prototype.open;
101      win.XMLHttpRequest.prototype.open = function(method, url){ this.__acUrl = url; return op.apply(this, arguments); };
102      var os = win.XMLHttpRequest.prototype.send;
103      win.XMLHttpRequest.prototype.send = function(){
104        if (blocked(this.__acUrl)) { try { this.abort(); } catch(e){} return; }
105        return os.apply(this, arguments);
106      };
107    }
108    // sendBeacon (prototype, so Navigator.prototype.sendBeacon.call(...) is caught)
109    if (win.Navigator && win.Navigator.prototype && win.Navigator.prototype.sendBeacon){
110      var ob = win.Navigator.prototype.sendBeacon;
111      win.Navigator.prototype.sendBeacon = function(url, data){
112        if (blocked(url)) return false;
113        return ob.apply(this, arguments);
114      };
115    }
116    // Transport constructors that bypass the fetch/XHR wrappers entirely. A
117    // tracker can open a WebSocket / EventSource / Worker straight to its host;
118    // gate the constructor on the URL argument. For a BLOCKED url we return an
119    // inert stub (no connection, no-op methods) rather than throwing — matching
120    // the silent fetch/XHR behaviour so host init code isn't crashed.
121    ['WebSocket','EventSource','Worker','SharedWorker'].forEach(function(name){
122      var O = win[name];
123      if (typeof O !== 'function') return;
124      function Guarded(url){
125        if (blocked(url)) { return inertStub(); }
126        var a = Array.prototype.slice.call(arguments);
127        return new (Function.prototype.bind.apply(O, [null].concat(a)))();
128      }
129      try {
130        Guarded.prototype = O.prototype; // keep instanceof + instance constants.
131        // Copy the interface's STATIC props (WebSocket.OPEN, EventSource.CLOSED,
132        // …) — libraries read `ws.readyState === WebSocket.OPEN`, which silently
133        // breaks if these are dropped even when the connection is allowed.
134        Object.getOwnPropertyNames(O).forEach(function(k){
135          if (k === 'prototype' || k === 'length' || k === 'name') return;
136          try { Object.defineProperty(Guarded, k, Object.getOwnPropertyDescriptor(O, k)); } catch(e){}
137        });
138        win[name] = Guarded;
139      } catch(e){}
140    });
141    // C2: a registered Service Worker persists across page loads/tabs in a
142    // scope this shim can never reach once it's running (its own internal
143    // fetch/XHR calls are invisible to a main-thread patch). This guard
144    // prevents a NEW registration from a blocklisted host pre-consent; it
145    // does NOT unregister an already-registered SW from before this plugin
146    // was active — documented as a known limitation in the readme FAQ.
147    try {
148      if (win.navigator && win.navigator.serviceWorker && win.navigator.serviceWorker.register) {
149        var osw = win.navigator.serviceWorker.register.bind(win.navigator.serviceWorker);
150        win.navigator.serviceWorker.register = function(scriptURL, opts){
151          if (blocked(scriptURL)) {
152            return Promise.reject(new (win.DOMException || Error)('Blocked pending consent', 'SecurityError'));
153          }
154          return osw(scriptURL, opts);
155        };
156      }
157    } catch(e){}
158    // M2: RTCPeerConnection is a WebRTC IP-leak vector — a tracker can use a
159    // STUN/TURN server purely to enumerate the visitor's local/public IPs
160    // outside the fetch/XHR path entirely. We FILTER (not block outright)
161    // blocklisted iceServers entries so legitimate WebRTC audio/video
162    // features on the page keep working while tracker-operated STUN/TURN
163    // hosts are stripped from the config before the connection is opened.
164    ['RTCPeerConnection','webkitRTCPeerConnection','mozRTCPeerConnection'].forEach(function(name){
165      var O = win[name];
166      if (typeof O !== 'function') return;
167      function GuardedRTC(config, constraints){
168        try {
169          if (config && Array.isArray(config.iceServers)) {
170            config = Object.assign({}, config, {
171              iceServers: config.iceServers.filter(function(srv){
172                var urls = [].concat(srv && srv.urls ? srv.urls : []);
173                return !urls.some(function(u){ return blocked(u); });
174              })
175            });
176          }
177        } catch(e){}
178        return new (Function.prototype.bind.apply(O, [null, config, constraints]))();
179      }
180      try {
181        GuardedRTC.prototype = O.prototype;
182        Object.getOwnPropertyNames(O).forEach(function(k){
183          if (k === 'prototype' || k === 'length' || k === 'name') return;
184          try { Object.defineProperty(GuardedRTC, k, Object.getOwnPropertyDescriptor(O, k)); } catch(e){}
185        });
186        win[name] = GuardedRTC;
187      } catch(e){}
188    });
189  }
190  patchRealm(window);
191  // NOTE: dynamic import('https://tracker/…') goes through the module pipeline
192  // and cannot be monkey-patched from script; a server CSP script-src/connect-src
193  // is the only reliable backstop for that vector. Documented in the readme.
194  //
195  // H7: everything below used to patch ONLY the top window/document directly
196  // (bare `window.HTMLScriptElement`, `document.write`, a single top-level
197  // MutationObserver, …). That meant a same-origin CHILD IFRAME's own realm
198  // — its own HTMLScriptElement, its own document.write, its own
199  // MutationObserver — was never guarded: a tracker running inside a
200  // same-origin iframe doing `document.createElement('script'); s.src=...`
201  // bypassed everything. installDomGuards(win, doc) makes the exact same
202  // logic reusable per-realm; patchFrame() (below) calls it for every
203  // same-origin child iframe, and because its own MutationObserver calls
204  // patchFrame() again when IT discovers a nested iframe, the guard applies
205  // recursively to any nesting depth (patchFrame's own __acFramePatched
206  // per-element flag prevents infinite loops).
207  var ATTRS = { 'src':1, 'href':1, 'srcset':1, 'imagesrcset':1, 'data':1, 'poster':1, 'ping':1, 'action':1 };
208  var TAGS = { 'script':1, 'img':1, 'iframe':1, 'link':1, 'video':1, 'audio':1, 'embed':1, 'object':1, 'track':1, 'source':1, 'a':1, 'form':1 };
209  // Attribute names actually swept for a blocked value by neutralizeIfBlocked/
210  // sanitizeMarkup (M1 adds 'ping'/'action' to the earlier src/href/srcset/
211  // data/poster set used by the tag-manager/pixel vectors).
212  var SCAN_ATTRS = ['src','href','srcset','data','poster','ping','action'];
213  var SCAN_SELECTOR = 'script[src],img[src],img[srcset],iframe[src],link[href],video[src],video[poster],audio[src],embed[src],object[data],track[src],source[src],source[srcset],a[ping],form[action],meta[http-equiv]';
214  // Dynamically-injected 
214<script src> / <img src>/<iframe src>/<link href> — the
215  // PRIMARY tag-manager and Meta-Pixel loader pattern:
216  //   document.createElement('script'); s.src='…fb…'.
217  // Patch the prototype attribute setter so any blocklisted resource is deferred
218  // (stashed via neutralize, released on grant) instead of fetched.
219  function guardProp(proto, prop){
220    try {
221      var d = Object.getOwnPropertyDescriptor(proto, prop);
222      if (!d || !d.set) return;
223      Object.defineProperty(proto, prop, {
224        configurable: true, enumerable: d.enumerable,
225        get: function(){ return d.get.call(this); },
226        set: function(v){
227          if (blocked(v)) { neutralize(this, prop, v); return; }
228          d.set.call(this, v);
229        }
230      });
231    } catch(e){}
232  }
233  // setAttribute / setAttributeNS('src'|'href'|'srcset'|'imagesrcset'|'data'|
234  // 'poster'|'ping'|'action', tracker) bypass the property setters — guard
235  // both. (setAttributeNS is a SEPARATE method, not covered by setAttribute.)
236  // Map a blocked tag+attr to the attribute the release path should restore.
237  function guardSetAttr(method){
238    return function(){
239      try {
240        // setAttribute(name,val) | setAttributeNS(ns,name,val)
241        var isNS = arguments.length >= 3;
242        var name = isNS ? arguments[1] : arguments[0];
243        var value = isNS ? arguments[2] : arguments[1];
244        var lname = String(name).toLowerCase();
245        if (ATTRS[lname] && blocked(value)){
246          var t = this.tagName ? this.tagName.toLowerCase() : '';
247          if (TAGS[t]) { neutralize(this, lname, value); return; }
248        }
249      } catch(e){}
250      return method.apply(this, arguments);
251    };
252  }
253  // document.write / writeln inject raw markup the parser sets attributes on
254  // directly (the classic document.write('
254<script src=fb>') GTM/pixel pattern),
255  // bypassing every setter above. Pre-scan the string, neutralize blocked
256  // resources in a detached fragment, and write the sanitized markup instead.
257  // Shared across realms (doesn't touch win/doc — operates on a detached
258  // <template> in whichever document happens to be current when called).
259  function sanitizeMarkup(str){
260    try {
261      if (str.indexOf('<') === -1) return str;
262      var tpl = document.createElement('template');
263      tpl.innerHTML = str;
264      var changed = false;
265      var nodes = tpl.content.querySelectorAll(SCAN_SELECTOR);
266      Array.prototype.forEach.call(nodes, function(n){
267        SCAN_ATTRS.forEach(function(a){
268          var v = n.getAttribute(a);
269          if (v && blocked(v)) { neutralize(n, a, v); n.removeAttribute(a); changed = true; }
270        });
271      });
272      return changed ? tpl.innerHTML : str;
273    } catch(e){ return str; }
274  }
275  // MutationObserver backstop for innerHTML/insertAdjacentHTML-injected pixels
276  // (<img>/<iframe>/<link>) — those are parser-constructed, so no setter fires.
277  // Best-effort: neutralizes on insertion so the resource is deferred/releasable
278  // and repeat loads are blocked. (Scripts injected via innerHTML do not execute
279  // per spec, so they need no handling here.) M3: also removes a blocklisted
280  // <meta http-equiv="refresh"> outright — its content attribute isn't
281  // meaningfully "releasable" the way a src is, so removing the tag means the
282  // redirect never happens (the correct outcome until consent is granted, at
283  // which point the page has already moved on — a meta-refresh is a one-shot).
284  function neutralizeIfBlocked(node){
285    if (!node || node.nodeType !== 1 || !node.getAttribute) return;
286    if (node.getAttribute('data-acconsent-blocked')) return; // already handled.
287    var t = node.tagName ? node.tagName.toLowerCase() : '';
288    if (t === 'meta' && String(node.getAttribute('http-equiv') || '').toLowerCase() === 'refresh'){
289      var content = node.getAttribute('content') || '';
290      var mm = content.match(/url\s*=\s*(.+)$/i);
291      var url = mm ? mm[1].trim() : content;
292      if (url && blocked(url)) { try { node.parentNode.removeChild(node); } catch(e){} }
293      return;
294    }
295    SCAN_ATTRS.forEach(function(a){
296      var v = node.getAttribute(a);
297      if (v && blocked(v)){
298        neutralize(node, a, v);
299        try { node.removeAttribute(a); } catch(e){}
300      }
301    });
302  }
303  // M1: <form> submitted via a JS call to .submit() bypasses the 'submit'
304  // event entirely (that event only fires for a user-initiated/requestSubmit
305  // path) — guard the method directly so a JS-triggered submission to a
306  // blocklisted action is silently dropped (matching the inert-stub
307  // philosophy used elsewhere in this shim) rather than thrown.
308  function guardFormSubmit(win){
309    try {
310      if (!win.HTMLFormElement || !win.HTMLFormElement.prototype.submit) return;
311      var os = win.HTMLFormElement.prototype.submit;
312      win.HTMLFormElement.prototype.submit = function(){
313        if (blocked(this.action)) { return; }
314        return os.apply(this, arguments);
315      };
316    } catch(e){}
317  }
318  // M1: a REAL (non-JS-triggered) form submission — e.g. the visitor clicking
319  // a submit button — never goes through .submit() above, so it needs its
320  // own capturing listener on the document.
321  function guardFormSubmitEvent(doc){
322    try {
323      doc.addEventListener('submit', function(e){
324        var f = e.target;
325        if (f && f.action && blocked(f.action)) { e.preventDefault(); }
326      }, true);
327    } catch(e){}
328  }
329  // Patch a same-origin child iframe's pristine realm — BOTH its network APIs
330  // (patchRealm) and its DOM-injection guards (installDomGuards, defined
331  // below) — so nothing in that realm can bypass the gate. Re-runs on load
332  // too, since contentWindow/contentDocument are replaced when the frame
333  // navigates.
334  function patchFrame(frame){
335    try {
336      if (frame.__acFramePatched) return; // element-level guard: no listener leak.
337      frame.__acFramePatched = true;
338      patchRealm(frame.contentWindow);
339      try { installDomGuards(frame.contentWindow, frame.contentDocument || (frame.contentWindow && frame.contentWindow.document)); } catch(e2){}
340      frame.addEventListener('load', function(){
341        try { patchRealm(frame.contentWindow); } catch(e){}
342        try { installDomGuards(frame.contentWindow, frame.contentDocument || (frame.contentWindow && frame.contentWindow.document)); } catch(e2){}
343      });
344    } catch(e){} // cross-origin: inaccessible (and can't host our trackers anyway).
345  }
346  function scrub(node){
347    if (!node || node.nodeType !== 1) return;
348    var t = node.tagName ? node.tagName.toLowerCase() : '';
349    if (TAGS[t] || t === 'meta') neutralizeIfBlocked(node);
350    if (t === 'iframe') patchFrame(node);
351    // querySelectorAll already returns ALL matching descendants (flat) — no need
352    // to recurse per-match (that would re-scan subtrees super-linearly).
353    if (node.querySelectorAll){
354      var kids = node.querySelectorAll(SCAN_SELECTOR);
355      Array.prototype.forEach.call(kids, neutralizeIfBlocked);
356      var frames = node.querySelectorAll('iframe');
357      Array.prototype.forEach.call(frames, patchFrame);
358    }
359  }
360  // H7: install every DOM-injection guard (property setters, setAttribute/NS,
361  // document.write/writeln, Range.createContextualFragment, form-submit,
362  // the MutationObserver backstop) into a given realm (win/doc pair). Called
363  // once for the TOP window/document, and again for every same-origin child
364  // iframe's realm via patchFrame() above — giving natural recursion to any
365  // iframe nesting depth.
366  function installDomGuards(win, doc){
367    try {
368      if (!win || !doc || win.__acconsentDomGuarded) return;
369      win.__acconsentDomGuarded = true;
370    } catch(e){ return; } // cross-origin: property access throws — skip.
371    if (win.HTMLScriptElement) guardProp(win.HTMLScriptElement.prototype, 'src');
372    if (win.HTMLImageElement) { guardProp(win.HTMLImageElement.prototype, 'src'); guardProp(win.HTMLImageElement.prototype, 'srcset'); }
373    if (win.HTMLIFrameElement) guardProp(win.HTMLIFrameElement.prototype, 'src');
374    if (win.HTMLLinkElement) guardProp(win.HTMLLinkElement.prototype, 'href');
375    if (win.HTMLMediaElement) guardProp(win.HTMLMediaElement.prototype, 'src'); // audio/video
376    if (win.HTMLVideoElement) guardProp(win.HTMLVideoElement.prototype, 'poster');
377    if (win.HTMLEmbedElement) guardProp(win.HTMLEmbedElement.prototype, 'src');
378    if (win.HTMLObjectElement) guardProp(win.HTMLObjectElement.prototype, 'data');
379    if (win.HTMLSourceElement) { guardProp(win.HTMLSourceElement.prototype, 'src'); guardProp(win.HTMLSourceElement.prototype, 'srcset'); }
380    if (win.HTMLTrackElement) guardProp(win.HTMLTrackElement.prototype, 'src');
381    if (win.HTMLAnchorElement) guardProp(win.HTMLAnchorElement.prototype, 'ping'); // M1
382    if (win.HTMLFormElement) guardProp(win.HTMLFormElement.prototype, 'action'); // M1
383    if (win.Element){
384      win.Element.prototype.setAttribute = guardSetAttr(win.Element.prototype.setAttribute);
385      if (win.Element.prototype.setAttributeNS) win.Element.prototype.setAttributeNS = guardSetAttr(win.Element.prototype.setAttributeNS);
386    }
387    if (doc.write){
388      var ow = doc.write;
389      doc.write = function(s){ return ow.call(doc, sanitizeMarkup(String(s == null ? '' : s))); };
390    }
391    if (doc.writeln){
392      var owl = doc.writeln;
393      doc.writeln = function(s){ return owl.call(doc, sanitizeMarkup(String(s == null ? '' : s))); };
394    }
395    // Range.createContextualFragment builds nodes whose scripts DO execute on
396    // insertion (unlike innerHTML), and the parser sets src so guardProp never
397    // fires — sanitize the markup string the same way as document.write.
398    if (win.Range && win.Range.prototype.createContextualFragment){
399      var ocf = win.Range.prototype.createContextualFragment;
400      win.Range.prototype.createContextualFragment = function(str){
401        return ocf.call(this, sanitizeMarkup(String(str == null ? '' : str)));
402      };
403    }
404    guardFormSubmit(win); // M1
405    guardFormSubmitEvent(doc); // M1
406    if (win.MutationObserver){
407      try {
408        var mo = new win.MutationObserver(function(muts){
409          for (var i=0;i<muts.length;i++){
410            var added = muts[i].addedNodes;
411            for (var j=0;j<added.length;j++){ scrub(added[j]); }
412          }
413        });
414        mo.observe(doc.documentElement || doc, { childList: true, subtree: true });
415        win.__acconsentObserver = mo;
416      } catch(e){}
417    }
418    // Sweep anything already present in this realm's document at install
419    // time (mirrors the top-level "existing iframes at shim execution time"
420    // sweep, generalized to any realm/depth).
421    try {
422      var pre = doc.querySelectorAll ? doc.querySelectorAll(SCAN_SELECTOR) : [];
423      Array.prototype.forEach.call(pre, neutralizeIfBlocked);
424      var preFrames = doc.getElementsByTagName ? doc.getElementsByTagName('iframe') : [];
425      for (var fi=0; fi<preFrames.length; fi++){ patchFrame(preFrames[fi]); }
426    } catch(e){}
427  }
428  installDomGuards(window, document);
429  // Released by the consent engine on grant.
430  window.__acconsentReleaseNetwork = function(grantedCats){
431    if (grantedCats && typeof grantedCats === 'object'){
432      for (var k in grantedCats){ granted[k] = !!grantedCats[k]; }
433    }
434  };
435  // H1: called by consent.js so the shim's block/allow decision for the
436  // sale/share-flagged hosts stays consistent with whatever was just
437  // recorded (GPC active, or an explicit "Do Not Sell" click).
438  window.__acconsentSetSaleShareOptOut = function(v){ saleShareOptOut = !!v; };
439  // H2: exposed for symmetry/future use; spiLimited currently has no visitor-
440  // facing "allow" path (SPI limitation is unconditional while enabled), but
441  // an admin-configurable off-switch is still applied via the localized
442  // limit_spi_enabled flag which controls whether spiLimited is ever true —
443  // see enqueue().
444  window.__acconsentSetSpiLimited = function(v){ spiLimited = !!v; };
445})();
446</script>
446
447<meta charset="UTF-8">
448<meta name="viewport" content="width=device-width, initial-scale=1">
449<script data-acconsent="consent-mode">
450window.dataLayer = window.dataLayer || [];
451function gtag(){dataLayer.push(arguments);}
452gtag('consent','default',{
453  'ad_storage':'denied','analytics_storage':'denied',
454  'ad_user_data':'denied','ad_personalization':'denied',
455  'functionality_storage':'denied','personalization_storage':'denied',
456  'security_storage':'granted','wait_for_update':500
457});
458</script>
458
459		<title>What is dynamic balancing | Contract Balancing UK | Universal Contract Balancing</title>
460<meta name='robots' content='noindex, nofollow' />
461<link rel="alternate" hreflang="x-default" href="https://www.balancingservices.co.uk/what-is-dynamic-balancing/" />
462<link rel="alternate" hreflang="en" href="https://www.balancingservices.co.uk/what-is-dynamic-balancing/" />
463<link rel="alternate" hreflang="de" href="https://www.balancingservices.co.uk/de/what-is-dynamic-balancing/" />
464<link rel="alternate" hreflang="pl" href="https://www.balancingservices.co.uk/pl/what-is-dynamic-balancing/" />
465<link rel="alternate" hreflang="ro" href="https://www.balancingservices.co.uk/ro/what-is-dynamic-balancing/" />
466<link rel="alternate" hreflang="tr" href="https://www.balancingservices.co.uk/tr/what-is-dynamic-balancing/" />
467<link rel="alternate" hreflang="zh" href="https://www.balancingservices.co.uk/zh/what-is-dynamic-balancing/" />
468<link rel="alternate" hreflang="it" href="https://www.balancingservices.co.uk/it/what-is-dynamic-balancing/" />
469<link rel="alternate" hreflang="fr" href="https://www.balancingservices.co.uk/fr/what-is-dynamic-balancing/" />
470<link rel="alternate" hreflang="es" href="https://www.balancingservices.co.uk/es/what-is-dynamic-balancing/" />
471<link rel="alternate" hreflang="pt" href="https://www.balancingservices.co.uk/pt/what-is-dynamic-balancing/" />
472<link rel="alternate" hreflang="cs" href="https://www.balancingservices.co.uk/cs/what-is-dynamic-balancing/" />
473
474<template class="acconsent-gated" data-acconsent-category="analytics" data-acconsent-id="scr_ga4mthq9jp2ch" data-acconsent-enc="base64">PCEtLSBHb29nbGUgdGFnIChndGFnLmpzKSAtLT4KPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZXRhZ21hbmFnZXIuY29tL2d0YWcvanM/aWQ9Ry1NVEhROUpQMkNIIj48L3NjcmlwdD4KPHNjcmlwdD4KICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsKICBmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTt9CiAgZ3RhZygnanMnLCBuZXcgRGF0ZSgpKTsKCiAgZ3RhZygnY29uZmlnJywgJ0ctTVRIUTlKUDJDSCcpOwo8L3NjcmlwdD4=</template>
475
476<template class="acconsent-gated" data-acconsent-category="analytics" data-acconsent-id="scr_clarityyrhygpaivg" data-acconsent-enc="base64">PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgKGZ1bmN0aW9uKGMsbCxhLHIsaSx0LHkpewogICAgICAgIGNbYV09Y1thXXx8ZnVuY3Rpb24oKXsoY1thXS5xPWNbYV0ucXx8W10pLnB1c2goYXJndW1lbnRzKX07CiAgICAgICAgdD1sLmNyZWF0ZUVsZW1lbnQocik7dC5hc3luYz0xO3Quc3JjPSJodHRwczovL3d3dy5jbGFyaXR5Lm1zL3RhZy8iK2k7CiAgICAgICAgeT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKHIpWzBdO3kucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCx5KTsKICAgIH0pKHdpbmRvdywgZG9jdW1lbnQsICJjbGFyaXR5IiwgInNjcmlwdCIsICJ5cmh5Z3BhaXZnIik7Cjwvc2NyaXB0Pg==</template>
477<script>document.documentElement.classList.add('js');window.UB_TS_SITEKEY="0x4AAAAAAEmQA4XopdRBuYWJ";window.UB_LEAD_ENDPOINT="https:\/\/www.balancingservices.co.uk\/wp-json\/ub\/v1\/lead";window.UB_TS_ENDPOINT="https:\/\/www.balancingservices.co.uk\/wp-json\/ub\/v1\/ts";</script>
477
478<link rel="preload" href="https://www.balancingservices.co.uk/wp-content/themes/ub-adas/assets/fonts/inter-latin.woff2" as="font" type="font/woff2" crossorigin>
479<link rel="icon" href="/wp-content/uploads/ub/favicon-32x32.jpg" sizes="32x32">
480<link rel="icon" href="/wp-content/uploads/ub/favicon-192x192.jpg" sizes="192x192">
481<link rel="apple-touch-icon" href="/wp-content/uploads/ub/favicon-180x180.jpg">
482<script>window.UCBMktoNotify={"url":"https:\/\/www.balancingservices.co.uk\/wp-json\/ucb-mkto\/v1\/notify","forms":[1029]};</script>
482
483<meta name="description" content="What is dynamic balancing? It is when the mass axis of a rotating part is different to its rotational axis. Usually a combination of static &amp; couple unbalance.">
484<script>var UBMSG = {"ok":{"text":"Thank you. Your message has been sent and our team will be in touch shortly."},"fail":{"text":"Sorry, something went wrong. Please try again later."},"required":{"text":"This field is required."},"email":{"text":"Please enter a valid email address."},"phone":{"text":"Please enter a valid phone number."},"number":{"text":"Please enter a valid number."},"spam":{"text":"Please complete the spam check above, then send again."},"spam2":{"text":"Please complete the spam check, then send again."},"big":{"text":"That file is too large (10 MB max)."},"filetype":{"text":"Please upload an image, audio, video or PDF file."}};</script>
484
485<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://www.balancingservices.co.uk/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.balancingservices.co.uk%2Fwhat-is-dynamic-balancing%2F" />
486<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://www.balancingservices.co.uk/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.balancingservices.co.uk%2Fwhat-is-dynamic-balancing%2F&#038;format=xml" />
487<style id="wp-img-auto-sizes-contain-inline-css">
488img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
489/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
490</style>
491
492<style id="global-styles-inline-css">
493:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);
493--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
493.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
494/*# sourceURL=global-styles-inline-css */
495</style>
496
497<link rel='stylesheet' id='acwpt-frontend-css' href='https://www.balancingservices.co.uk/wp-content/plugins/amplifi-plugins/features/translate/assets/css/frontend.css?ver=3.3.7.1790797790' media='all' />
498<link rel='stylesheet' id='acconsent-css' href='https://www.balancingservices.co.uk/wp-content/plugins/amplifi-plugins/features/consent/assets/css/consent-v4.css?ver=3.3.7' media='all' />
499<style id="acconsent-inline-css">
500:root{--acconsent-accent:#5522dd;}
501/*# sourceURL=acconsent-inline-css */
502</style>
503<style id="acwpt-switcher-inline-css">
504.acwpt-menu-switcher{position:relative}.acwpt-menu-switcher>a{display:inline-flex;align-items:center;gap:.45em;cursor:pointer}.acwpt-menu-switcher>a::after{content:"";width:.42em;height:.42em;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg) translateY(-.1em);opacity:.55;transition:transform .18s ease,opacity .18s ease}.acwpt-menu-switcher:hover>a::after,.acwpt-menu-switcher:focus-within>a::after{transform:rotate(225deg) translateY(-.1em);opacity:.9}.acwpt-lang-flag{font-size:1.05em;line-height:1;filter:saturate(1.08)}.acwpt-lang-code{font-variant:small-caps;letter-spacing:.04em;opacity:.75;font-size:.82em}.acwpt-menu-switcher .sub-menu,.acwpt-menu-switcher .children{min-width:11.5rem;padding:.35rem;border-radius:.6rem;box-shadow:0 10px 30px -8px rgba(16,20,24,.28),0 2px 6px -2px rgba(16,20,24,.14);background:#fff;border:1px solid rgba(16,20,24,.08)}.acwpt-menu-switcher .sub-menu a,.acwpt-menu-switcher .children a{display:flex;align-items:center;gap:.55em;padding:.44rem .6rem;border-radius:.4rem;white-space:nowrap;transition:background .14s ease}.acwpt-menu-switcher .sub-menu a:hover,.acwpt-menu-switcher .children a:hover{background:rgba(16,20,24,.06)}.acwpt-menu-switcher .acwpt-current>a{font-weight:600}.acwpt-menu-switcher .acwpt-current>a::before{content:"";width:.4em;height:.4em;border-radius:50%;background:currentColor;opacity:.5;flex:none}@media (prefers-color-scheme:dark){.acwpt-menu-switcher .sub-menu,.acwpt-menu-switcher .children{background:#1f2328;border-color:rgba(255,255,255,.1)}.acwpt-menu-switcher .sub-menu a:hover,.acwpt-menu-switcher .children a:hover{background:rgba(255,255,255,.08)}}
505/*# sourceURL=acwpt-switcher-inline-css */
506</style>
507<link rel='stylesheet' id='ub-inter-css' href='https://www.balancingservices.co.uk/wp-content/themes/ub-adas/assets/fonts/inter.css?ver=1790956134' media='all' />
508<link rel='stylesheet' id='ub-fa-css' href='https://www.balancingservices.co.uk/wp-content/themes/ub-adas/assets/fa/css/all.min.css?ver=6.5.1' media='all' />
509<link rel='stylesheet' id='ub-site-css' href='https://www.balancingservices.co.uk/wp-content/themes/ub-adas/assets/css/site.css?ver=1790956134' media='all' />
510<link rel="https://api.w.org/" href="https://www.balancingservices.co.uk/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://www.balancingservices.co.uk/wp-json/wp/v2/pages/18" /><link rel="canonical" href="https://www.balancingservices.co.uk/what-is-dynamic-balancing/" />
511<link rel='shortlink' href='https://www.balancingservices.co.uk/?p=18' />
512</head>
513<body class="wp-singular page-template-default page page-id-18 wp-theme-ub-adas bg-white text-zinc-900 font-sans antialiased selection:bg-brand selection:text-white">
514<a class="skip-link" href="#main">Skip to content</a>
515<div class="fixed top-0 inset-x-0 z-50">
516  <nav class="site-nav w-full bg-white/95 backdrop-blur-md border-b border-zinc-100" aria-label="Main">
517    <div class="max-w-7xl mx-auto px-4 sm:px-6 h-16 flex items-center justify-between gap-4">
518      <a href="/" class="hover:opacity-80 transition-opacity flex-shrink-0" aria-label="Universal Contract Balancing home">
519        <img src="/wp-content/uploads/ub/burke-porter-logo.png" alt="Burke Porter, an Ascential Technologies brand" class="h-8 sm:h-10 w-auto" width="1200" height="236">
520      </a>
521      <div class="hidden lg:flex items-center gap-6 xl:gap-8 text-sm font-medium text-zinc-600"><a href="/services/" class="nav-link hover:text-brand transition-colors py-1">Balancing Services</a><div class="relative has-drop">
522  <button type="button" class="nav-link hover:text-brand transition-colors py-1 inline-flex items-center gap-1.5" aria-haspopup="true" aria-expanded="false">Resources <i class="fas fa-chevron-down text-[10px]"></i></button>
523  <div class="drop absolute left-1/2 -translate-x-1/2 top-full pt-4 w-72"><div class="bg-white rounded-lg shadow-xl border border-zinc-200 p-2"><a href="/what-is-dynamic-balancing/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Balancing FAQ</a><a href="/balance-tolerance-calculator/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Balance Tolerance Calculator</a><a href="/iso-21940-balance-g-grades/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">ISO 21940 Balance G Grades</a><a href="/outsourcing-balancing-services/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Benefits of outsourcing balancing</a></div></div>
524</div><a href="/about-us/" class="nav-link hover:text-brand transition-colors py-1">About Us</a><div class="relative has-mega">
525  <a href="/balancing-machines/" class="nav-link hover:text-brand transition-colors py-1 inline-flex items-center gap-1.5" aria-haspopup="true">Balancing Machines <i class="fas fa-chevron-down text-[10px]"></i></a>
526  <div class="mega absolute right-0 top-full pt-4 w-[860px] max-w-[calc(100vw-2rem)]">
527    <div class="bg-white rounded-lg shadow-xl border border-zinc-200 p-4 grid grid-cols-3 gap-6">
528      <div class="bg-zinc-900 rounded-lg p-5 text-zinc-200"><img src="/wp-content/uploads/ub/burke-white.png" alt="Burke Porte logo" class="h-9 mb-4"><div class="mega-about space-y-2 text-xs leading-relaxed"><p>Burke Porter is the global leader in testing and automation solutions for the automotive and transportation industries.</p>
529<p>Burke Porter’s balancing division have 70+ years of balancing machine experience, supplying high accuracy balancing technology to both small workshops and high production environments such as automotive manufacturing.</p></div></div>
530      <div class="col-span-2 grid grid-cols-2 gap-6 p-2"><div><p class="text-sm font-bold text-brand mb-1">Burke Porter Balancing Solutions</p><p class="text-xs text-zinc-500 mb-3">Explore our balancing solutions for all industries.</p><ul class="space-y-1"><li><a href="/balancing-machines/vertical-balancing-machines/" class="block text-sm text-zinc-700 hover:text-brand py-1">Vertical balancing machines</a></li><li><a href="/balancing-machines/horizontal-balancing-machines/" class="block text-sm text-zinc-700 hover:text-brand py-1">Horizontal balancing machines</a></li><li><a href="/balancing-machines/electric-motor-balancing-machines/" class="block text-sm text-zinc-700 hover:text-brand py-1">eRotor balancing machines</a></li><li><a href="/balancing-machines/crankshaft-balancing-machines/" class="block text-sm text-zinc-700 hover:text-brand py-1">Crankshaft balancing machines</a></li><li><a href="/balancing-machines/driveshaft-balancing-machines/" class="block text-sm text-zinc-700 hover:text-brand py-1">Driveshaft balancing machines</a></li><li><a href="/balancing-machines/non-rotate-balancing-machines/" class="block text-sm text-zinc-700 hover:text-brand py-1">Non-Rotate balancing machines</a></li><li><a href="/balancing-machines/axle-balancing-machines/" class="block text-sm text-zinc-700 hover:text-brand py-1">Axle balancing machines</a></li><li><a href="/balancing-machines/spin-tester/" class="block text-sm text-zinc-700 hover:text-brand py-1">Spin testing machines</a></li></ul></div><div><p class="text-sm font-bold text-brand mb-1">Resources</p><p class="text-xs text-zinc-500 mb-3">Access sales materials and thought leadership.</p><ul class="space-y-1"><li><a href="/contact/" class="block text-sm text-zinc-700 hover:text-brand py-1">Contact</a></li><li><a href="https://www.ascentialtech.com/events/" class="block text-sm text-zinc-700 hover:text-brand py-1" target=_blank rel=noopener>Events</a></li><li><a href="/balance-tolerance-calculator/" class="block text-sm text-zinc-700 hover:text-brand py-1">Balance Tolerance Calculator</a></li><li><a href="/iso-21940-balance-g-grades/" class="block text-sm text-zinc-700 hover:text-brand py-1">ISO Balance Quality G Grades</a></li><li><a href="/what-is-dynamic-balancing/" class="block text-sm text-zinc-700 hover:text-brand py-1">Balancing FAQs</a></li></ul></div></div>
531    </div>
532  </div>
533</div></div>
534      <div class="flex items-center gap-2 sm:gap-3">
535        <a href="https://www.facebook.com/UniversalContractBalancing" target="_blank" rel="noopener" class="hidden lg:flex items-center justify-center w-9 h-9 rounded-lg bg-zinc-100 text-zinc-600 hover:text-brand transition-all duration-300 hover:shadow-md" aria-label="Facebook"><i class="fab fa-facebook-f text-sm"></i></a>
536        <button type="button" class="quote-open glassy-btn glassy-btn-secondary inline-block text-xs sm:text-sm px-3 lg:px-5 whitespace-nowrap">Free Quote</button>
537        <a href="/contact/" class="glassy-btn glassy-btn-primary hidden md:inline-block text-xs lg:text-sm px-3 lg:px-5">Contact</a>
538        <div class="relative has-drop lang-sw hidden lg:block"><button type="button" class="flex items-center gap-1.5 h-9 px-2.5 rounded-lg bg-zinc-100 text-zinc-700 hover:text-brand text-xs font-semibold uppercase" aria-haspopup="true" aria-expanded="false" aria-label="Language"><i class="fas fa-globe text-[12px]" aria-hidden="true"></i>en <i class="fas fa-chevron-down text-[9px]" aria-hidden="true"></i></button><div class="drop absolute right-0 top-full pt-3 w-52"><div class="bg-white rounded-lg shadow-xl border border-zinc-200 p-2 max-h-[70vh] overflow-y-auto"><a href="/what-is-dynamic-balancing/" hreflang="en" lang="en" data-acwpt-lang="en" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand font-semibold text-brand" aria-current="true"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">en</span>English</a><a href="/de/what-is-dynamic-balancing/" hreflang="de" lang="de" data-acwpt-lang="de" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">de</span>Deutsch</a><a href="/pl/what-is-dynamic-balancing/" hreflang="pl" lang="pl" data-acwpt-lang="pl" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">
538pl</span>Polski</a><a href="/ro/what-is-dynamic-balancing/" hreflang="ro" lang="ro" data-acwpt-lang="ro" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">ro</span>Română</a><a href="/tr/what-is-dynamic-balancing/" hreflang="tr" lang="tr" data-acwpt-lang="tr" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">tr</span>Türkçe</a><a href="/zh/what-is-dynamic-balancing/" hreflang="zh" lang="zh" data-acwpt-lang="zh" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">zh</span>简体中文</a><a href="/it/what-is-dynamic-balancing/" hreflang="it" lang="it" data-acwpt-lang="it" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">it</span>Italiano</a><a href="/fr/what-is-dynamic-balancing/" hreflang="fr" lang="fr" data-acwpt-lang="fr" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">fr</span>Français</a><a href="/es/what-is-dynamic-balancing/" hreflang="es" lang="es" data-acwpt-lang="es" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">es</span>Español</a><a href="/pt/what-is-dynamic-balancing/" hreflang="pt" lang="pt" data-acwpt-lang="pt" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">pt</span>Português</a><a href="/cs/what-is-dynamic-balancing/" hreflang="cs" lang="cs" data-acwpt-lang="cs" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">cs</span>Čeština</a></div></div></div>        <button id="mobile-menu-btn" type="button" class="lg:hidden flex flex-col gap-1.5 w-10 h-10 items-center justify-center hamburger flex-shrink-0" aria-label="Open menu" aria-expanded="false" aria-controls="mobile-menu">
539          <span class="w-5 h-0.5 bg-zinc-900 rounded-full hamburger-line"></span><span class="w-5 h-0.5 bg-zinc-900 rounded-full hamburger-line"></span><span class="w-5 h-0.5 bg-zinc-900 rounded-full hamburger-line"></span>
540        </button>
541      </div>
542    </div>
543  </nav>
544</div>
545<div id="mobile-menu" class="fixed inset-0 z-40 pointer-events-none lg:hidden">
546  <div id="mobile-menu-backdrop" class="absolute inset-0 bg-zinc-900/20 backdrop-blur-sm opacity-0 transition-opacity duration-300 pointer-events-none"></div>
547  <div class="mobile-menu absolute top-[72px] right-2 sm:right-4 w-[calc(100%-1rem)] sm:w-80 max-w-sm max-h-[calc(100vh-88px)] overflow-y-auto bg-white/95 backdrop-blur-xl rounded-lg shadow-lg border border-zinc-200/50 pointer-events-auto">
548    <div class="p-2 sm:p-3">
549      <a href="/services/" class="mobile-menu-item mobile-nav-link flex items-center px-4 py-3.5 rounded-lg hover:bg-zinc-50 min-h-[44px] text-sm font-medium text-zinc-700">Balancing Services</a><div class="mobile-menu-item m-group"><button type="button" class="m-toggle w-full flex items-center justify-between px-4 py-3.5 rounded-lg hover:bg-zinc-50 min-h-[44px] text-sm font-medium text-zinc-700" aria-expanded="false">Resources <i class="m-caret fas fa-chevron-down text-xs transition-transform"></i></button><div class="m-sub pl-2 pb-2"><a href="/what-is-dynamic-balancing/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Balancing FAQ</a><a href="/balance-tolerance-calculator/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Balance Tolerance Calculator</a><a href="/iso-21940-balance-g-grades/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">ISO 21940 Balance G Grades</a><a href="/outsourcing-balancing-services/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Benefits of outsourcing balancing</a></div></div><a href="/about-us/" class="mobile-menu-item mobile-nav-link flex items-center px-4 py-3.5 rounded-lg hover:bg-zinc-50 min-h-[44px] text-sm font-medium text-zinc-700">About Us</a><div class="mobile-menu-item m-group"><button type="button" class="m-toggle w-full flex items-center justify-between px-4 py-3.5 rounded-lg hover:bg-zinc-50 min-h-[44px] text-sm font-medium text-zinc-700" aria-expanded="false">Balancing Machines <i class="m-caret fas fa-chevron-down text-xs transition-transform"></i></button><div class="m-sub pl-2 pb-2"><a href="/balancing-machines/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Balancing Machines</a><p class="px-4 pt-3 pb-1 text-[11px] font-semibold text-zinc-500 uppercase tracking-wide">Burke Porter Balancing Solutions</p><a href="/balancing-machines/vertical-balancing-machines/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Vertical balancing machines</a><a href="/balancing-machines/horizontal-balancing-machines/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Horizontal balancing machines</a><a href="/balancing-machines/electric-motor-balancing-machines/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">eRotor balancing machines</a><a href="/balancing-machines/crankshaft-balancing-machines/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Crankshaft balancing machines</a><a href="/balancing-machines/driveshaft-balancing-machines/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Driveshaft balancing machines</a><a href="/balancing-machines/non-rotate-balancing-machines/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Non-Rotate balancing machines</a><a href="/balancing-machines/axle-balancing-machines/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Axle balancing machines</a><a href="/balancing-machines/spin-tester/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Spin testing machines</a><p class="px-4 pt-3 pb-1 text-[11px] font-semibold text-zinc-500 uppercase tracking-wide">Resources</p><a href="/contact/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Contact</a><a href="https://www.ascentialtech.com/events/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Events</a><a href="/balance-tolerance-calculator/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Balance Tolerance Calculator</a><a href="/iso-21940-balance-g-grades/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">ISO Balance Quality G Grades</a><a href="/what-is-dynamic-balancing/" class="block px-4 py-2.5 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand">Balancing FAQs</a></div></div>
550      <div class="mobile-menu-item my-2 h-px bg-zinc-200"></div>
551      <div class="mobile-menu-item space-y-2 px-2 pb-2">
552        <button type="button" class="quote-open glassy-btn glassy-btn-secondary w-full block text-center text-sm">Free Quote</button>
553        <a href="/contact/" class="glassy-btn glassy-btn-primary w-full block text-center text-sm">Contact</a>
554      </div><div class="mobile-menu-item my-2 h-px bg-zinc-200"></div><div class="mobile-menu-item grid grid-cols-2 gap-1 p-1"><a href="/what-is-dynamic-balancing/" hreflang="en" lang="en" data-acwpt-lang="en" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand font-semibold text-brand" aria-current="true"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">en</span>English</a><a href="/de/what-is-dynamic-balancing/" hreflang="de" lang="de" data-acwpt-lang="de" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">de</span>Deutsch</a><a href="/pl/what-is-dynamic-balancing/" hreflang="pl" lang="pl" data-acwpt-lang="pl" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">
554pl</span>Polski</a><a href="/ro/what-is-dynamic-balancing/" hreflang="ro" lang="ro" data-acwpt-lang="ro" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">ro</span>Română</a><a href="/tr/what-is-dynamic-balancing/" hreflang="tr" lang="tr" data-acwpt-lang="tr" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">tr</span>Türkçe</a><a href="/zh/what-is-dynamic-balancing/" hreflang="zh" lang="zh" data-acwpt-lang="zh" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">zh</span>简体中文</a><a href="/it/what-is-dynamic-balancing/" hreflang="it" lang="it" data-acwpt-lang="it" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">it</span>Italiano</a><a href="/fr/what-is-dynamic-balancing/" hreflang="fr" lang="fr" data-acwpt-lang="fr" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">fr</span>Français</a><a href="/es/what-is-dynamic-balancing/" hreflang="es" lang="es" data-acwpt-lang="es" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">es</span>Español</a><a href="/pt/what-is-dynamic-balancing/" hreflang="pt" lang="pt" data-acwpt-lang="pt" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">pt</span>Português</a><a href="/cs/what-is-dynamic-balancing/" hreflang="cs" lang="cs" data-acwpt-lang="cs" class="flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm text-zinc-700 hover:bg-zinc-50 hover:text-brand"><span class="inline-flex w-7 justify-center text-[11px] font-bold uppercase text-zinc-500">cs</span>Čeština</a></div>    </div>
555  </div>
556</div>
557<main id="main">
558
559<header class="relative pt-32 pb-14 sm:pt-36 lg:pt-44 lg:pb-24 min-h-[560px] lg:min-h-[640px] flex items-center overflow-hidden bg-white">
560  <div class="absolute inset-y-0 right-0 w-full lg:w-[45%] z-0"><img src="/wp-content/uploads/ub/hero-2.jpg" alt="Propshaft balancing machine cell" class="w-full h-full object-cover" fetchpriority="high"></div>
561  <div class="absolute inset-0 z-[5] hero-veil pointer-events-none"></div>
562  <div class="max-w-7xl mx-auto px-6 relative z-10 w-full">
563    <div class="grid lg:grid-cols-5 gap-0">
564      <div class="lg:col-span-5 lg:w-1/2 lg:pr-6">
565        
566        <div class="min-w-0"><h1 class="text-3xl sm:text-4xl lg:text-5xl font-bold tracking-tight leading-[1.1] mb-4 sm:mb-6 text-brand">What is dynamic balancing?</h1><div class="flex flex-col sm:flex-row flex-wrap items-start gap-2.5 sm:gap-4 mt-6 sm:mt-8"><a href="#contact_block" class="glassy-btn glassy-btn-primary text-sm sm:text-base">Chat with our balancing services experts</a><a href="/balancing-machines/" class="glassy-btn glassy-btn-secondary text-sm sm:text-base">Go to balancing machines</a></div></div>
567      </div>
568    </div>
569  </div>
570</header>
571<section class="py-12 lg:py-20 bg-white"><div class="max-w-7xl mx-auto px-6 space-y-16 lg:space-y-24"><div class="grid lg:grid-cols-2 gap-10 lg:gap-16 items-center"><div data-reveal style="transition-delay:80ms"><div class="rounded-lg bg-[#f8f9fa] border border-zinc-200 p-8 sm:p-10 flex items-center justify-center"><img src="/wp-content/uploads/ub/w1.png" alt="Dynamic balancing example" class="max-h-56 w-auto" loading="lazy"></div></div><div data-reveal style="transition-delay:0ms"><div class="flex items-start gap-4 mb-6"><img src="/wp-content/uploads/ub/brand.png" alt="" class="h-12 lg:h-14 w-auto flex-shrink-0 object-contain" width="520" height="496"><h2 class="text-2xl lg:text-3xl font-bold tracking-tight leading-[1.15] text-brand">What is dynamic balancing?</h2></div><div class="prose-adas"><p>Dynamic balancing is a method used to correct unbalanced rotors to reduce noise and vibration and improve quality and life expectancy of machinery. Unbalance is a result of uneven distribution of mass around the axis of rotation. Balancing is achieved by rotating the component at speed and using measuring equipment to find heavy points that are causing unbalance. When the unbalance positions are known, weight can either be removed at this location or added to the opposing side to balance it.</p>
572<p>Dynamic unbalance is typically a combination of axial and radial forces also known as couple and static unbalance, causing the mass axis to be different to the rotational axis. Dynamic unbalance is corrected in 2 or more planes and is common for c
572omponents like multi stage pumps, crankshafts, and turbines.</p></div></div></div><div class="grid lg:grid-cols-2 gap-10 lg:gap-16 items-center"><div data-reveal style="transition-delay:80ms"><div class="rounded-lg bg-[#f8f9fa] border border-zinc-200 p-8 sm:p-10 flex items-center justify-center"><img src="/wp-content/uploads/ub/w2.png" alt="Couple balancing example" class="max-h-56 w-auto" loading="lazy"></div></div><div data-reveal style="transition-delay:0ms"><div class="flex items-start gap-4 mb-6"><img src="/wp-content/uploads/ub/brand.png" alt="" class="h-12 lg:h-14 w-auto flex-shrink-0 object-contain" width="520" height="496"><h2 class="text-2xl lg:text-3xl font-bold tracking-tight leading-[1.15] text-brand">What is couple balancing?</h2></div><div class="prose-adas"><p>Couple unbalance is an axial force that occurs when a rotating mass has two equal unbalance forces that are situated 180° opposite each other. A system can be statically balanced and still have a couple unbalance. Couple unbalance occurs frequently in elongated cylindrical rotors and is usually corrected in 2 planes.</p></div></div></div><div class="grid lg:grid-cols-2 gap-10 lg:gap-16 items-center"><div data-reveal style="transition-delay:80ms"><div class="rounded-lg bg-[#f8f9fa] border border-zinc-200 p-8 sm:p-10 flex items-center justify-center"><img src="/wp-content/uploads/ub/w3.png" alt="Static balancing example" class="max-h-56 w-auto" loading="lazy"></div></div><div data-reveal style="transition-delay:0ms"><div class="flex items-start gap-4 mb-6"><img src="/wp-content/uploads/ub/brand.png" alt="" class="h-12 lg:h-14 w-auto flex-shrink-0 object-contain" width="520" height="496"><h2 class="text-2xl lg:text-3xl font-bold tracking-tight leading-[1.15] text-brand">What is static balancing?</h2></div><div class="prose-adas"><p>Static unbalance is parallel to the rotational axis and produces a radial force on the rotor. Unbalance is corrected in 1 axial plane and can be measured using both rotating and stationary balancing machines.</p>
573<p>Static balancing is used for disc shaped components like small fly wheels, pump rotors, brake discs and clutches.</p></div></div></div></div></section>
574<section class="py-8 lg:py-12 bg-white"><div class="max-w-7xl mx-auto px-4 sm:px-6 space-y-8"><div class="rounded-lg overflow-hidden shadow-lg bg-zinc-900" data-reveal style="transition-delay:0ms"><div class="px-6 sm:px-10 lg:px-14 py-10 lg:py-14 max-w-5xl"><div class="flex items-start gap-4 mb-6"><img src="/wp-content/uploads/ub/brand.png" alt="" class="h-12 lg:h-14 w-auto flex-shrink-0 object-contain" width="520" height="496"><h2 class="text-2xl lg:text-3xl font-bold tracking-tight leading-[1.15] text-white">Benefits of static and dynamic balancing</h2></div><div class="prose-on-dark"><ul>
575<li>Less noise</li>
576<li>Less vibration</li>
577<li>Comfort</li>
578<li>Efficiency</li>
579<li>Improved safety</li>
580<li>Reduced downtime</li>
581</ul>
582<p>Unbalanced rotors want to rotate around their mass centre axis instead of their rotational axis. The bearings prevent this movement, but cause vibration of the rotor, bearings and other parts attached. This results in unnecessary wear on all components in the machine and can shorten its operational lifespan and cause more frequent breakdowns.</p>
583<p>Noise and vibration produced by an unbalanced rotor can be directly connected to comfort and quality, especially in the automotive industry. Unbalanced car components will result in an uncomfortable and noisy ride which could also reduce the value of the vehicle and its reliability.</p></div></div></div></div></section>
584<section class="pt-10 pb-12 lg:pt-14 lg:pb-20 bg-white"><div class="max-w-5xl mx-auto px-6">
585  <div class="adas-accordion" data-reveal style="transition-delay:0ms"><details class="acc-item" open>
586  <summary><h2 class="inline text-base font-[inherit]">What are balancing limits?</h2></summary>
587  <div class="acc-body"><div class="grid md:grid-cols-5 gap-6 items-stretch"><div class="md:col-span-2"><img src="/wp-content/uploads/ub/temp1.jpg" alt="Brake balancing" class="w-full h-56 md:h-full min-h-[220px] object-cover rounded-lg" loading="lazy"></div><div class="md:col-span-3 prose-adas"><p>Balancing limits indicate acceptable amounts of unbalance in rotors. Manufacturers typically specify acceptable tolerances for their components based on their testing. However, international standards (ISO 21940) exist and state balance quality G grades for different rotor types that can be used to calculate balance tolerances. G Grade 40 is a typical balancing limit for car wheels while rotors such as small electrical armatures require higher accuracy so are typically balanced to Grade 2.5.</p></div></div></div>
588</details>
588<details class="acc-item">
589  <summary><h2 class="inline text-base font-[inherit]">Units of unbalance</h2></summary>
590  <div class="acc-body"><div class="grid md:grid-cols-5 gap-6 items-stretch"><div class="md:col-span-2"><img src="/wp-content/uploads/ub/temp2.jpg" alt="Balancing screen display" class="w-full h-56 md:h-full min-h-[220px] object-cover rounded-lg" loading="lazy"></div><div class="md:col-span-3 prose-adas"><p>The units of unbalance are mass times radius, for example: a weight added to a certain position on the part being balanced would shift the mass axis into the running axis and therefore be in balance. The weight of correction multiplied by the applied radius will give an unbalance unit. For metric measurement the units will be gram-millimetres (gmm) or for large rotors, gram-centimetres. The Imperial equivalent will be gram-inches or ounce-inches. This weight (mass) would be applied at a radius from the running centre at the light position.</p></div></div></div>
591</details><details class="acc-item">
592  <summary><h2 class="inline text-base font-[inherit]">How to measure static and dynamic unbalance</h2></summary>
593  <div class="acc-body"><div class="grid md:grid-cols-5 gap-6 items-stretch"><div class="md:col-span-2"><img src="/wp-content/uploads/ub/temp3.jpg" alt="Horizontal balancing machine" class="w-full h-56 md:h-full min-h-[220px] object-cover rounded-lg" loading="lazy"></div><div class="md:col-span-3 prose-adas"><p>We use balancing machines to precisely measure an unbalanced rotor and determine the exact angle and amount of unbalance. Sophisticated balancing software displays the data clearly, indicating correction positions on the rotor and the amount of weight to be added or removed. Different balancing machines are used depending on the rotor type, for example a disc shaped rotor that requires single plane / static balancing will typically be balanced on a vertical machine where the rotor axis is in a vertical position during measurement. A horizontal balancing machine can be used to measure couple and dynamic unbalance in rotors where the length is proportionally greater than the diameter. The rotor axis will be in a horizontal position on this machine.</p></div></div></div>
594</details><details class="acc-item">
595  <summary><h2 class="inline text-base font-[inherit]">How to correct an unbalanced rotor</h2></summary>
596  <div class="acc-body"><div class="grid md:grid-cols-5 gap-6 items-stretch"><div class="md:col-span-2"><img src="/wp-content/uploads/ub/temp4.jpg" alt="Crankshaft balancer" class="w-full h-56 md:h-full min-h-[220px] object-cover rounded-lg" loading="lazy"></div><div class="md:col-span-3 prose-adas"><p>After we have identified the unbalance positions on a rotor using a balancing machine, we apply correction by either removing material from the heavy position or adding material to the light position. Typical removal methods include milling, drilling and grinding while methods of adding weight can include welding or bolting weights to the part or using weighted clips.</p></div></div></div>
597</details><details class="acc-item">
598  <summary><h2 class="inline text-base font-[inherit]">Types of rotors</h2></summary>
599  <div class="acc-body"><div class="grid md:grid-cols-5 gap-6 items-stretch"><div class="md:col-span-2"><img src="/wp-content/uploads/ub/temp5.jpg" alt="Propshaft balancer auto" class="w-full h-56 md:h-full min-h-[220px] object-cover rounded-lg" loading="lazy"></div><div class="md:col-span-3 prose-adas"><p>Rotors fall into two groups. One is where the rotor is rigid and does not deflect up to and including the operating speed. The other group comprises flexible rotors that “bow” up to the operating speed. The first deflection seen is a “skipping rope effect” which means the centre of the rotor at speed moves out from its rotational axis, causing high static unbalance.</p></div></div></div>
600</details><details class="acc-item">
601  <summary><h2 class="inline text-base font-[inherit]">Balancing rigid rotors</h2></summary>
602  <div class="acc-body"><div class="grid md:grid-cols-5 gap-6 items-stretch"><div class="md:col-span-2"><img src="/wp-content/uploads/ub/temp6.jpg" alt="Propshaft balancer" class="w-full h-56 md:h-full min-h-[220px] object-cover rounded-lg" loading="lazy"></div><div class="md:col-span-3 prose-adas"><p>Because unbalance exists in a component even when stationary, rigid rotors can be balanced at a low speed, just enough to produce a centrifugal force to register the unbalance.</p></div></div></div>
603</details>
603<details class="acc-item">
604  <summary><h2 class="inline text-base font-[inherit]">Balancing flexible rotors</h2></summary>
605  <div class="acc-body"><div class="grid md:grid-cols-5 gap-6 items-stretch"><div class="md:col-span-2"><img src="/wp-content/uploads/ub/temp7.jpg" alt="" class="w-full h-56 md:h-full min-h-[220px] object-cover rounded-lg" loading="lazy"></div><div class="md:col-span-3 prose-adas"><p>This type of rotor is balanced at a low speed where the rotor does not flex. Correction for unbalance is made, then the speed is gradually increased, and the unbalance is corrected in stages until the rotor’s operating speed is reached.</p></div></div></div>
606</details></div>
607</div></section>
608<section class="pt-10 pb-12 lg:pt-14 lg:pb-20 bg-zinc-50 border-y border-zinc-100"><div class="max-w-4xl mx-auto px-6 text-center" data-reveal style="transition-delay:0ms">
609  <div class="flex items-center justify-center mb-4"><img src="/wp-content/uploads/ub/brand.png" alt="" class="h-12 lg:h-16 w-auto flex-shrink-0 object-contain" width="520" height="496"></div><h2 class="text-2xl lg:text-3xl font-bold tracking-tight leading-[1.15] text-brand mb-6">Static and dynamic balancing of your parts</h2><div class="prose-adas prose-center"><p>We provide static and dynamic balancing services to repairers and large companies across UK and Europe who require crankshaft balancing, fan balancing, shaft balancing, and much more. We have the equipment and experience to balance almost any rotating component quickly and to a high standard.</p>
610<p>We use several vertical and horizontal balancing machines from the balancing technology experts Burke Porter to provide you with guaranteed high quality precision balancing solutions for your parts.</p></div><div class="flex flex-col sm:flex-row flex-wrap justify-center gap-2.5 sm:gap-4 mt-6 sm:mt-8"><a href="/services/" class="glassy-btn glassy-btn-primary text-sm sm:text-base">Go to balancing services</a><a href="/balancing-machines/" class="glassy-btn glassy-btn-secondary text-sm sm:text-base">Go to balancing machines</a></div>
611</div></section>
612<section id="contact_block" class="pt-10 pb-12 lg:pt-14 lg:pb-20 bg-zinc-50 border-y border-zinc-100 scroll-mt-28">
613  <div class="max-w-5xl mx-auto px-6">
614    <div class="text-center mb-10" data-reveal style="transition-delay:0ms">
615      <div class="flex items-center justify-center mb-4"><img src="/wp-content/uploads/ub/brand.png" alt="" class="h-12 lg:h-16 w-auto flex-shrink-0 object-contain" width="520" height="496"></div>
616      <h2 class="text-2xl lg:text-3xl font-bold tracking-tight leading-[1.15] text-brand mb-4">How can we help you?</h2>
617      <div class="prose-adas prose-center max-w-2xl mx-auto text-base"><p>If you know what you want, use the Free Quote button to get started.<br/>
618If you need a chat, fill out the form below and our experts will be in touch.</p></div>
619    </div>
620    <div class="form-container bg-white border border-zinc-200 rounded-lg p-5 sm:p-6 lg:p-8 xl:p-10 shadow-sm" data-reveal style="transition-delay:80ms">
621      <div class="ub-mkto" data-mkto="1029" data-where="help"><form class="mkto-slot"></form><div class="ts-slot mt-2" data-action="ub-mkto"></div><div class="form-status mt-4 text-sm" role="status" aria-live="polite"></div></div>
622    </div>
623  </div>
624</section>
625</main>
626<footer class="bg-zinc-900 text-white pt-12 pb-28 lg:py-16 border-t border-brand">
627  <div class="max-w-7xl mx-auto px-6">
628    <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-12 gap-12 mb-16">
629      <div class="lg:col-span-4">
630        <img src="/wp-content/uploads/ub/ascential-tms-white.svg" alt="Ascential Technologies | Test &amp; Measurement Systems" class="h-9 lg:h-10 w-auto mb-6" width="325" height="52">
631        <div class="flex gap-3"><a href="https://www.facebook.com/UniversalContractBalancing" target="_blank" rel="noopener" class="w-9 h-9 rounded-lg bg-white/10 hover:bg-brand flex items-center justify-center transition-colors" aria-label="Facebook"><i class="fab fa-facebook-f text-sm"></i></a><a href="https://www.linkedin.com/company/ascential-technologies/" target="_blank" rel="noopener" class="w-9 h-9 rounded-lg bg-white/10 hover:bg-brand flex items-center justify-center transition-colors" aria-label="Ascential Technologies on LinkedIn"><i class="fab fa-linkedin-in text-sm"></i></a></div>
632      </div>
633      <div class="lg:col-span-2">
634        <h2 class="text-sm font-semibold text-white mb-4 pb-2 border-b-2" style="border-color:#dd7722;">About</h2>
635        <ul class="space-y-3 text-sm text-zinc-400"><li><a href="https://www.ascentialtech.com/privacy-policy/" class="hover:text-white transition-colors">Privacy Policy</a></li><li><a href="/cookie-notice/" class="hover:text-white transition-colors">Cookie notice</a></li><li><a href="/disclaimer/" class="hover:text-white transition-colors">Disclaimer</a></li><li><a href="/eu-privacy-notice/" class="hover:text-white transition-colors">EU Privacy Notice</a></li><li><a href="/outsourcing-balancing-services/" class="hover:text-white transition-colors">Benefits of outsourcing</a></li></ul>
636      </div>
637      <div class="md:col-span-2 lg:col-span-6">
638        <h2 class="text-sm font-semibold text-white mb-4 pb-2 border-b-2" style="border-color:#dd7722;">Contact</h2>
639        <div class="grid sm:grid-cols-2 gap-8 text-sm text-zinc-400 leading-relaxed"><div><div class="footer-rich space-y-3"><p>Unit 15, Warmley Business Park<br/>
640Crown Way, Warmley,<br/>
641Bristol, BS30 8FR<br/>
642United Kingdom</p></div></div><div><div class="footer-rich space-y-3"><p>USA <a href="tel:+1 616 577 2345">+1 616 577 2345</a><br/>
642
643China <a href="tel:+86 13488756526">+86 13488756526</a><br/>
644Germany <a href="tel:+49 5102 8314604">+49 5102 8314604</a><br/>
645Mexico <a href="tel:+52 55 1167 8223">+52 55 1167 8223</a><br/>
646Korea <a href="tel:+82 – 70-7422-7696">+82 – 70-7422-7696</a></p><p><a href="https://www.ascentialtech.com/transportation/propulsion/" rel="noopener" target="_blank">www.ascentialtech.com/transportation/propulsion/</a></p></div></div></div>
647      </div>
648    </div>
649    <div class="pt-8 border-t-2 flex flex-col md:flex-row justify-between items-center gap-4" style="border-color:#dd7722;">
650      <div class="text-xs text-zinc-500">Copyright &copy; 2026 Ascential Test &amp; Measurement Systems</div>
651      <div class="flex flex-wrap justify-center gap-x-6 gap-y-2 text-sm text-zinc-400"><a href="https://www.ascentialtech.com/terms/" class="hover:text-white transition-colors">Terms</a><a href="https://www.ascentialtech.com/imprint/" class="hover:text-white transition-colors">Imprint</a><a href="https://www.ascentialtech.com/privacy-policy/" class="hover:text-white transition-colors">Privacy Policy</a><a href="https://www.ascentialtech.com/unsubscribe/" class="hover:text-white transition-colors" target="_blank" rel="noopener">Unsubscribe</a><a href="https://tools.google.com/dlpage/gaoptout/" class="hover:text-white transition-colors" target="_blank" rel="noopener">Google Analytics Opt Out</a><a href="/cookie-notice/" class="hover:text-white transition-colors">Cookie notice</a><a href="/disclaimer/" class="hover:text-white transition-colors">Disclaimer</a></div>
652    </div>
653  </div>
654</footer><div id="quote-modal" class="fixed inset-0 z-[60] hidden items-center justify-center p-2 sm:p-4 modal-backdrop" role="dialog" aria-modal="true" aria-labelledby="quote-title">
655  <div class="modal-panel bg-white rounded-lg shadow-2xl w-full max-w-2xl max-h-[95vh] flex flex-col overflow-hidden">
656    <div class="flex items-center justify-between p-5 sm:p-6 border-b border-zinc-200">
657      <div class="flex items-center gap-3"><img src="/wp-content/uploads/ub/brand.png" alt="" class="h-9 w-auto flex-shrink-0 object-contain" width="520" height="496"><div>
658        <h2 id="quote-title" class="text-xl sm:text-2xl font-bold text-brand q-title">Get a free quote!</h2>
659        <h2 class="text-xl sm:text-2xl font-bold text-brand q-ok-title hidden">Thank you!</h2>
660      </div></div>
661      <button type="button" class="quote-close w-10 h-10 rounded-lg bg-zinc-100 hover:bg-zinc-200 flex items-center justify-center transition-colors flex-shrink-0" aria-label="Close"><i class="fas fa-times text-zinc-600"></i></button>
662    </div>
663    <div class="p-5 sm:p-6 overflow-y-auto">
664      <p class="text-sm sm:text-base text-zinc-600 mb-5 q-intro">Fill out the form below and you will hear from us shortly!</p>
665      <div class="ub-mkto" data-mkto="1029" data-where="quote"><form class="mkto-slot"></form><div class="ts-slot mt-2" data-action="ub-mkto"></div><div class="form-status mt-4 text-sm" role="status" aria-live="polite"></div></div>
666      <div class="q-success hidden text-center py-4">
667        <p class="text-base text-zinc-700 mb-2">We’ve received your message and will be in touch shortly.</p>
668        <p class="text-sm text-zinc-600 mb-6">In the meantime, make sure to follow us on social!</p>
669        <a href="https://www.facebook.com/UniversalContractBalancing" target="_blank" rel="noopener" class="glassy-btn glassy-btn-primary">Follow us on Facebook</a>
670      </div>
671    </div>
672  </div>
673</div>
674<script type="speculationrules">
675{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/ub-adas/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
676</script>
vendor: 1 bytes, line 676
676
677<script id="acconsent-js-extra">
678var ACCONSENT = {"settings":{"banner_title":"We value your privacy","banner_message":"We use cookies and similar technologies to improve your experience and understand how our site is used. Tracking scripts will not run until you accept. You can accept, reject, or manage your choices.","accept_label":"Accept all","reject_label":"Reject all","manage_label":"Manage","save_label":"Save choices","prefs_label":"Cookie preferences","toast_accepted":"Preferences saved \u2014 thanks!","toast_rejected":"Tracking declined. Only essential cookies are active.","consent_days":180,"accent_color":"#5522dd","position":"bottom","privacy_url":"https://balancingservices.co.uk/privacy-policy/","floating":true,"gpc_enabled":true,"consent_mode":true,"do_not_sell":true,"dns_label":"Do Not Sell or Share My Personal Information","limit_spi_enabled":true,"limit_spi_label":"Limit the Use of My Sensitive Personal Information","optout_placement":"footer","webhook_active":false,"webhook_disclosure":"Consent records may also be sent to a data processor configured by this site, which may be located in a different country.","privacy_text":"Privacy Policy","aria_consent":"Cookie consent","col_name":"Name","col_domain":"Domain","col_duration":"Duration","cookie_one":"cookie","cookie_many":"cookies","close_label":"Close"},"categories":{"necessary":{"label":"Strictly Necessary","description":"Required for the site to function. Always active.","locked":true},"functional":{"label":"Functional","description":"Remembers preferences and choices to personalize your experience.","locked":false},"analytics":{"label":"Analytics","description":"Helps us understand how visitors use the site so we can improve it.","locked":false},"marketing":{"label":"Marketing","description":"Used to track visitors and show relevant advertising.","locked":false}},"cookies":[],"legal":[],"policy_version":"1","catalog_hash":"f0686dbc0e985a97","rest_url":"https://www.balancingservices.co.uk/wp-json/amplifi-consent/v1/consent","config_url":"https://www.balancingservices.co.uk/wp-json/amplifi-consent/v1/config","sale_share_hosts":["clarity.ms","snitcher.com","rb2b.com","demdex.net"],"sale_share_scripts":[],"spi_hosts":[],"spi_scripts":[],"token":"eyJ0IjoxNzkxMDUzOTMyLCJqIjoiODBVWklpVlBGd3FVRVpUTFlUSUYiLCJwdiI6IjEiLCJjaCI6ImYwNjg2ZGJjMGU5ODVhOTciLCJscyI6W119Ljk0OTlhY2NjNjg2NmY1MTQ2OWI4ZDQ2ZTM5ZDFmNTI5ZWM2ZDA0NjgwNTQ5MjQwOGY5OGYyMmRkYjcxNDU5YmE","has_vid":"","storage_key":"acconsent_v1"};
679//# sourceURL=acconsent-js-extra
680</script>
vendor: 1 bytes, line 680
680
681<script id="acconsent-js" src="https://www.balancingservices.co.uk/wp-content/plugins/amplifi-plugins/features/consent/assets/js/consent-v2.js?ver=3.3.7"></script>
vendor: 1 bytes, line 681
681
682<script data-wp-strategy="defer" defer id="ub-site-js" src="https://www.balancingservices.co.uk/wp-content/themes/ub-adas/assets/js/site.js?ver=1790956134"></script>
682
683<div id="acconsent-root" hidden></div><button type="button" class="acconsent-fab acconsent-fab-right" data-acconsent-open aria-label="Cookie preferences" title="Cookie preferences"><svg class="acconsent-cookie-icon" width="22" height="22" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.5 12a9.5 9.5 0 1 1-6.7-9.08 3.2 3.2 0 0 0 3.02 4.14 3.2 3.2 0 0 0 3.4 3.05c.18.6.28 1.24.28 1.89Z" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"/><circle cx="8.5" cy="10" r="1.15" fill="currentColor"/><circle cx="12.5" cy="14.5" r="1.15" fill="currentColor"/><circle cx="15.5" cy="9.5" r="1.05" fill="currentColor"/><circle cx="9" cy="15.5" r="0.9" fill="currentColor"/></svg></button><div class="acconsent-footer-optout acconsent-footer-optout-auto" role="group" aria-label="Privacy opt-out controls"><button type="button" class="acconsent-optout-btn acconsent-optout-btn-footer" data-acconsent-donotsell>Do Not Sell or Share My Personal Information</button><button type="button" class="acconsent-optout-btn acconsent-optout-btn-footer" data-acconsent-limitspi>Limit the Use of My Sensitive Personal Information</button></div><style>@media (max-width:1024px){html.acconsent-banner-open .uwy{display:none!important}}</style>
684<script>
685    (function(d){
686      var s = d.createElement("script");
687      s.setAttribute("data-position", 5);
688      s.setAttribute("data-color", "#5522dd");
689      s.setAttribute("data-account", "qB5atLALqd");
690      s.setAttribute("src", "https://cdn.userway.org/widget.js");
691      (d.body || d.head).appendChild(s);
692    })(document)
693</script>
693
694<noscript>Please ensure Javascript is enabled for purposes of <a href="https://userway.org">website accessibility</a></noscript>
695</body>
696</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.