of a page * * Attributes (all on the contents element except where noted): * wa-toc-element="contents" | "link" | "table" | "ix-trigger" * -- structural markers. Multiple * "table" elements are allowed * and each receives a TOC copy. * wa-toc-offsettop="" -- click-scroll offset only * (e.g. clear a fixed navbar) * wa-toc-offsetbottom="" -- shifts active line down * wa-toc-activeline="" -- where headings activate * during scroll. Default 33vh. * wa-toc-headings="" -- restrict which heading levels * are collected. Default h2..h6. * wa-toc-hideurlhash="true" -- suppress #hash on click * wa-toc-ancestoractive="true" -- mark ancestors active too * wa-toc-instance="" -- (on a shared parent) scopes * multiple TOCs on one page * * In-text directives (inside heading plain text, stripped at render): * [wa-toc-omit] -- exclude this heading * [wa-toc-h2] .. [wa-toc-h6] -- override heading level in * the TOC only * * Active state uses Webflow's native `.w--current` class so styling can be * configured directly in the Webflow Designer. */ (function () { 'use strict'; var ACTIVE_CLASS = 'w--current'; var ATTR = 'wa-toc-element'; var DIRECTIVE_RE = /\[wa-toc-(omit|h([2-6]))\]/i; var DEFAULT_HEADING_SELECTOR = 'h2, h3, h4, h5, h6'; // ---------- utilities -------------------------------------------------- /** * Slugify heading text into an id. Mirrors Webflow's native id generation * closely enough for hash navigation: lowercase, spaces β†’ hyphens, drop * non-alphanumeric except hyphens, collapse runs of hyphens. */ function slugify(text) { return String(text) .toLowerCase() .trim() .replace(/[\s_]+/g, '-') .replace(/[^a-z0-9\-]/g, '') .replace(/-+/g, '-') .replace(/^-|-$/g, ''); } /** Ensure a slug is unique within a Set, suffixing -2, -3, ... if needed. */ function uniqueSlug(base, used) { if (!base) base = 'section'; var slug = base; var i = 2; while (used.has(slug)) { slug = base + '-' + i++; } used.add(slug); return slug; } /** * Convert a CSS length string (e.g. "8rem", "120px", "10vh") to pixels, * resolved against the document root. Returns 0 on failure. */ function cssLengthToPx(value) { if (!value) return 0; var probe = document.createElement('div'); probe.style.position = 'absolute'; probe.style.visibility = 'hidden'; probe.style.height = value; probe.style.width = '0'; document.body.appendChild(probe); var px = probe.getBoundingClientRect().height; document.body.removeChild(probe); return isFinite(px) ? px : 0; } /** * Parse the wa-toc-headings attribute into a CSS selector. Accepts: * "h2,h3" β†’ "h2, h3" * "h2 h3 h4" β†’ "h2, h3, h4" * "2,3" β†’ "h2, h3" * "H2, h3" β†’ "h2, h3" (case-insensitive) * Tokens outside h2..h6 are dropped. Returns the default selector when * the input is empty or yields no valid levels β€” keeps behavior safe. */ function parseHeadingLevels(raw) { if (!raw) return DEFAULT_HEADING_SELECTOR; var tokens = String(raw) .toLowerCase() .split(/[\s,]+/); var levels = []; var seen = {}; for (var i = 0; i < tokens.length; i++) { var tok = tokens[i].trim(); if (!tok) continue; // Accept "h2" or "2". var m = /^h?([2-6])$/.exec(tok); if (!m) continue; var tag = 'h' + m[1]; if (seen[tag]) continue; seen[tag] = true; levels.push(tag); } if (!levels.length) return DEFAULT_HEADING_SELECTOR; return levels.join(', '); } /** Find the closest ancestor (or self) carrying wa-toc-instance. */ function instanceOf(el) { var node = el; while (node && node.nodeType === 1) { if (node.hasAttribute('wa-toc-instance')) { return node.getAttribute('wa-toc-instance'); } node = node.parentElement; } return ''; // default unnamed instance } /** Find the link template within a given root, matching wa-toc-element="link". */ function findLinkTemplate(root) { return root.querySelector('[' + ATTR + '="link"]'); } /** * The link template may be applied directly to an , or to a text * element nested inside an . Resolve to the actual we should clone. */ function resolveAnchorTemplate(linkEl) { if (linkEl.tagName === 'A') return linkEl; var anchor = linkEl.closest('a'); return anchor || linkEl; // fall back to the marked element itself } /** * Within a cloned link, find the text-bearing element that originally had * wa-toc-element="link". If the marker was on the anchor itself, the * anchor is the text holder. */ function findTextHolder(clonedAnchor, originalMarker) { if (originalMarker.tagName === 'A') return clonedAnchor; // The marker was a descendant; find the same descendant in the clone by // walking the same path. var path = []; var node = originalMarker; var rootAnchor = originalMarker.closest('a'); while (node && node !== rootAnchor) { var parent = node.parentElement; if (!parent) break; path.unshift(Array.prototype.indexOf.call(parent.children, node)); node = parent; } var current = clonedAnchor; for (var i = 0; i < path.length; i++) { current = current.children[path[i]]; if (!current) return clonedAnchor; } return current; } // ---------- per-instance pipeline ------------------------------------- function buildInstance(contentsEl) { var instanceId = instanceOf(contentsEl); // Locate the link template in the same instance. var linkMarker = null; var allLinks = document.querySelectorAll('[' + ATTR + '="link"]'); for (var i = 0; i < allLinks.length; i++) { if (instanceOf(allLinks[i]) === instanceId) { linkMarker = allLinks[i]; break; } } if (!linkMarker) return null; // nothing to do var anchorTemplate = resolveAnchorTemplate(linkMarker); // Locate every wa-toc-element="table" in the same instance. The TOC will // be rendered into each one β€” same headings, same active-state tracking, // independent styling contexts. If none are present, fall back to a // single mount at the link template's parent (Finsweet-compatible). var mountEls = []; var allTables = document.querySelectorAll('[' + ATTR + '="table"]'); for (var j = 0; j < allTables.length; j++) { if (instanceOf(allTables[j]) === instanceId) { mountEls.push(allTables[j]); } } if (!mountEls.length) { var fallback = anchorTemplate.parentElement; if (!fallback) return null; mountEls.push(fallback); } // Read config off the contents element. var offsetTopVal = cssLengthToPx(contentsEl.getAttribute('wa-toc-offsettop')); var offsetBotVal = cssLengthToPx(contentsEl.getAttribute('wa-toc-offsetbottom')); var hideHash = contentsEl.getAttribute('wa-toc-hideurlhash') === 'true'; var ancestorMode = contentsEl.getAttribute('wa-toc-ancestoractive') === 'true'; var activeLineAttr = contentsEl.getAttribute('wa-toc-activeline'); var activeLineRaw = activeLineAttr; // keep raw for vh re-resolution on resize var headingSelector = parseHeadingLevels(contentsEl.getAttribute('wa-toc-headings')); // Collect heading elements in document order, applying directives. var rawHeadings = contentsEl.querySelectorAll(headingSelector); var headings = []; var usedIds = new Set(); for (var k = 0; k < rawHeadings.length; k++) { var h = rawHeadings[k]; var text = h.textContent || ''; var levelOverride = null; var omit = false; // Strip *all* directive occurrences from the rendered heading text and // capture the first relevant one. We also clear them from the live DOM // so readers don't see "[wa-toc-h4]My heading". var cleaned = text; var match; while ((match = DIRECTIVE_RE.exec(cleaned))) { if (match[1].toLowerCase() === 'omit') { omit = true; } else if (match[2]) { levelOverride = parseInt(match[2], 10); } cleaned = cleaned.slice(0, match.index) + cleaned.slice(match.index + match[0].length); } cleaned = cleaned.trim(); if (cleaned !== text) { // Replace directive markers in text nodes only, preserving inline // markup like / children. stripDirectivesInPlace(h); } if (omit || !cleaned) continue; // Assign / preserve id for hash linking. var id = h.id; if (!id) { id = uniqueSlug(slugify(cleaned), usedIds); h.id = id; } else { usedIds.add(id); } var actualLevel = parseInt(h.tagName.charAt(1), 10); var displayLevel = levelOverride || actualLevel; headings.push({ el: h, id: id, text: cleaned, level: displayLevel, }); } if (!headings.length) return null; // The TOC must start at H2. If somebody overrode levels, normalize so the // shallowest level encountered renders at the outermost nesting depth. var minLevel = headings.reduce(function (m, h) { return Math.min(m, h.level); }, 6); // Build the nested DOM. We need *wrappers* so children of an H# can be // appended next to (not inside) the link itself. Per Finsweet's docs: // "Each Heading link template must be enclosed in a div wrapper, and // this div wrapper should be a child of the div associated with the // preceding Heading level." // // We model this with a per-level "wrapper" element. The first child of // the wrapper is the link; subsequent children are nested wrappers. var rootContainer = document.createElement('div'); rootContainer.setAttribute('wa-toc-element', 'list'); var entries = []; // parallel array: { link, wrapper, heading } var stack = [{ level: minLevel - 1, wrapper: rootContainer }]; for (var n = 0; n < headings.length; n++) { var heading = headings[n]; // Pop until the top of stack is the parent level (one shallower). while (stack.length > 1 && stack[stack.length - 1].level >= heading.level) { stack.pop(); } var parentWrapper = stack[stack.length - 1].wrapper; // Build wrapper for this heading. var wrapper = document.createElement('div'); wrapper.setAttribute('wa-toc-element', 'h' + heading.level + '-wrapper'); // Clone the link template. var link = anchorTemplate.cloneNode(true); // Remove the marker attribute on the clone to avoid re-detection. var markersInClone = link.querySelectorAll('[' + ATTR + '="link"]'); for (var mi = 0; mi < markersInClone.length; mi++) { markersInClone[mi].removeAttribute(ATTR); } if (link.getAttribute(ATTR) === 'link') link.removeAttribute(ATTR); // Set the text on the resolved text holder. var holder = findTextHolder(link, linkMarker); holder.textContent = heading.text; // Set href and tag with entry index so we can find this same link // inside each cloned mount and wire it up. link.setAttribute('href', '#' + heading.id); link.setAttribute('data-wa-toc-idx', String(entries.length)); wrapper.appendChild(link); parentWrapper.appendChild(wrapper); entries.push({ heading: heading, // Filled in below: one cloned link per mount target. links: [], ixTriggers: [], }); stack.push({ level: heading.level, wrapper: wrapper }); } // Mount the built tree into every target. We clone for *every* mount // (including the first) so `rootContainer` stays intact across the loop // and serves as a clean source for each subsequent mount. Querying // inside each mount by data-wa-toc-idx lets us collect the per-mount // link nodes back into the corresponding entry. function mountInto(target, treeChildren) { while (target.firstChild) target.removeChild(target.firstChild); for (var c = 0; c < treeChildren.length; c++) target.appendChild(treeChildren[c]); // Pull this mount's links into entries. var mountedLinks = target.querySelectorAll('[data-wa-toc-idx]'); for (var ml = 0; ml < mountedLinks.length; ml++) { var idx = parseInt(mountedLinks[ml].getAttribute('data-wa-toc-idx'), 10); if (entries[idx]) entries[idx].links.push(mountedLinks[ml]); // Per Finsweet ix-trigger semantics: triggers live inside the link // template, fire on this entry's active transitions. var triggers = mountedLinks[ml].querySelectorAll('[' + ATTR + '="ix-trigger"]'); for (var tg = 0; tg < triggers.length; tg++) { entries[idx].ixTriggers.push(triggers[tg]); } } } for (var t = 0; t < mountEls.length; t++) { var cloned = rootContainer.cloneNode(true); var children = Array.prototype.slice.call(cloned.children); mountInto(mountEls[t], children); } // Strip the temporary index marker now that all mounts have been wired. for (var en = 0; en < entries.length; en++) { for (var lk = 0; lk < entries[en].links.length; lk++) { entries[en].links[lk].removeAttribute('data-wa-toc-idx'); } } // Click handling: smooth scroll, hash control. Listener runs in capture // phase and stops propagation so any external listener (e.g. Webflow's // own anchor handling, or a parent click handler on the link wrapper) // can't run a competing scroll. We also reread offsetTopVal on each // click in case the page has resized β€” vh-based offsets need this. function onLinkClick(entry, ev) { ev.preventDefault(); ev.stopPropagation(); var liveOffsetTop = cssLengthToPx(contentsEl.getAttribute('wa-toc-offsettop')); var targetTop = entry.heading.el.getBoundingClientRect().top + window.pageYOffset - liveOffsetTop; window.scrollTo({ top: targetTop, behavior: 'smooth' }); if (!hideHash) { if (history.replaceState) { history.replaceState(null, '', '#' + entry.heading.id); } else { location.hash = '#' + entry.heading.id; } } } entries.forEach(function (entry) { entry.links.forEach(function (link) { link.addEventListener( 'click', function (ev) { onLinkClick(entry, ev); }, true, ); }); }); return { contentsEl: contentsEl, entries: entries, offsetTop: offsetTopVal, offsetBottom: offsetBotVal, activeLineRaw: activeLineRaw, ancestorMode: ancestorMode, activeIndex: -1, previousIxState: new WeakMap(), }; } /** * Walk text nodes inside `el` and remove [wa-toc-omit] / [wa-toc-h#] markers * so they don't appear in the rendered page. */ function stripDirectivesInPlace(el) { var walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null); var node; var toFix = []; while ((node = walker.nextNode())) { if (DIRECTIVE_RE.test(node.nodeValue)) toFix.push(node); } toFix.forEach(function (n) { n.nodeValue = n.nodeValue.replace(/\[wa-toc-(omit|h[2-6])\]/gi, '').trim(); }); } // ---------- active-link tracking -------------------------------------- /** * Default active-line position when wa-toc-activeline isn't set. * 1/3 of viewport height β€” a heading activates as soon as it scrolls up * into the upper third of the viewport, while still comfortably visible. */ var DEFAULT_ACTIVE_LINE_FRACTION = 1 / 3; /** * Resolve the active-line position (in px from viewport top) for an * instance. wa-toc-activeline accepts any CSS length; if absent, falls * back to a fraction of viewport height. Recomputed on every call so * vh-based values track resizes naturally. */ function resolveActiveLine(instance) { if (instance.activeLineRaw) { var px = cssLengthToPx(instance.activeLineRaw); if (px > 0) return px; } var viewportH = window.innerHeight || document.documentElement.clientHeight; return viewportH * DEFAULT_ACTIVE_LINE_FRACTION; } /** * Determine which heading owns the viewport. * * Rule: the active heading is the *last* one whose top has crossed the * "active line" β€” a horizontal line in the viewport configured by * wa-toc-activeline (default: 1/3 of viewport height). * * `wa-toc-offsetbottom` extends the line further down β€” i.e. the previous * heading stays active until the next heading reaches `offsetBottom` past * the active line. * * Note: this is independent of `wa-toc-offsettop`, which only affects * smooth-scroll-on-click (so a fixed navbar can be cleared without * shifting where headings activate). * * Entries are scanned in document order and we take the maximum match * rather than break early, so the result is correct even if CSS reorders * elements relative to DOM order. * * Returns -1 when no heading has yet reached the active line. */ function computeActiveIndex(instance) { var entries = instance.entries; if (!entries.length) return -1; var threshold = resolveActiveLine(instance) + instance.offsetBottom; var active = -1; for (var i = 0; i < entries.length; i++) { // viewport-relative top of this heading var top = entries[i].heading.el.getBoundingClientRect().top; if (top <= threshold) { active = i; // keep the latest match β€” do NOT break } } return active; } /** * Apply active state. Always clears every link first so external sources * of `.w--current` (e.g. Webflow's URL-hash matching) can't leave stale * classes around. We don't early-out on `newIndex === activeIndex` for * that same reason β€” it's cheap to re-set and guarantees correctness. * * Each entry may have multiple link clones (one per mount target). The * active class is applied uniformly to all clones so every rendered TOC * stays in sync. */ function applyActive(instance, newIndex) { var entries = instance.entries; function setClass(entry, on) { for (var li = 0; li < entry.links.length; li++) { if (on) entry.links[li].classList.add(ACTIVE_CLASS); else entry.links[li].classList.remove(ACTIVE_CLASS); } } // Clear all. for (var i = 0; i < entries.length; i++) setClass(entries[i], false); if (newIndex >= 0 && newIndex < entries.length) { // Mark the directly-active entry. var activeEntry = entries[newIndex]; setClass(activeEntry, true); // Optionally mark ancestors. An ancestor of entry N is the most recent // earlier entry whose level is strictly shallower, walking up until we // run out of shallower levels. if (instance.ancestorMode) { var currentLevel = activeEntry.heading.level; for (var k = newIndex - 1; k >= 0 && currentLevel > 1; k--) { if (entries[k].heading.level < currentLevel) { setClass(entries[k], true); currentLevel = entries[k].heading.level; } } } } // Fire ix-trigger transitions only when the index actually changed. We // dispatch on every cloned trigger across all mounts so Webflow IX2 // animations run uniformly in each rendered TOC. if (newIndex !== instance.activeIndex) { for (var j = 0; j < entries.length; j++) { var entry = entries[j]; if (!entry.ixTriggers || !entry.ixTriggers.length) continue; // Read state from the first clone β€” they're kept in sync. var isActive = entry.links.length > 0 && entry.links[0].classList.contains(ACTIVE_CLASS); var was = instance.previousIxState.get(entry) === true; if (isActive !== was) { entry.ixTriggers.forEach(function (t) { t.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true })); }); instance.previousIxState.set(entry, isActive); } } instance.activeIndex = newIndex; } } // ---------- bootstrap -------------------------------------------------- function init() { var contentsEls = document.querySelectorAll('[' + ATTR + '="contents"]'); var instances = []; contentsEls.forEach(function (el) { var inst = buildInstance(el); if (inst) instances.push(inst); }); if (!instances.length) return; function update() { for (var i = 0; i < instances.length; i++) { applyActive(instances[i], computeActiveIndex(instances[i])); } } // Throttle to one update per frame. var ticking = false; function onScroll() { if (ticking) return; ticking = true; requestAnimationFrame(function () { update(); ticking = false; }); } window.addEventListener('scroll', onScroll, { passive: true }); window.addEventListener('resize', onScroll); update(); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();

³ΙΘΛVRΚΣΖ΅

Skip to main content

The AI adoption board game: Why law firm leaders can't afford to play it safe

By:
Michelle Nesbitt-Burrell
July 23, 2026
Michelle Nesbitt-Burrell
,
March 18, 2026
March 18, 2026
13 mins

Strategic AI adoption separates winners from laggards β€” and the gap is widening faster than most law firms realize

Key takeaways

  • The recognition gap is widening β€” While 87% of UK lawyers say they recognize AI's transformative impact on the legal industry, only 38% say they expect significant change in their own firms this year, which creates a dangerous disconnect between vision and action.
  • Strategic advantage is quantifiable β€” Law firms with visible AI strategies are 3.9 times more likely to experience ROI than those firms without plans, with innovation leaders expected to unlock $53,000 in value per lawyer within 12 months.
  • Clients are outpacing their counsel β€” More than half (54%) of corporate legal departments invested in new AI tools compared to just 45% of law firms, with corporate counsel using AI at double the rate for core work and making technology prowess a key differentiator in client relationships.

The game has already started, and some law firms don't even realize they're playing.

At a recent Legal Geek conference session in London, attendees were asked a simple question β€” can you articulate your firm's AI strategy in one sentence? The uncomfortable silence that followed revealed a critical gap in the legal industry β€” the distance between recognizing AI's transformative potential and doing something strategic about it.

This gap creates winners and losers at an unprecedented pace. The window for strategic positioning is closing rapidly, according to the latest Future of Professionals research from the ³ΙΘΛVRΚΣΖ΅ Institute, which surveyed 985 legal professionals across 53 countries.

However, there is a roadmap for those firms that are ready to bridge this gap. Seven essential rules that spell out exactly how to play strategically:

PLAYERS β€” Pilot with purpose; Leadership sets the pace; Action beats perfection; Yield to ethics; Educate to accelerate; Rely on data; and Strategy before tools.

These aren't theoretical principles. They're the proven patterns that separate firms achieving 3.9 times better return on investment (ROI) from those stuck in expensive experimentation.

The recognition-to-action gap

The numbers tell a stark story. While 80% of law firm respondents surveyed said they believe AI will fundamentally transform their businesses within the next five years, only 29% said they expect to see transformational change within their own firms this year. That's like seeing a train approaching the platform but remaining frozen in place.

This disconnect is particularly pronounced in the United Kingdom and European markets, where legal professionals demonstrate superior foresight about technological change. A striking 87% of UK lawyers say they expect significant AI transformation within five years, compared to 77% in the United States and 70% in Canada. Yet paradoxically, only 38% of UK and European lawyers say they expect transformational change within their own organizations this year.

British and European lawyers can see the future more clearly than their global peers; however, they're just not acting on that vision at the pace required to maintain a competitive advantage.

However, here's what should concern every law firm partner β€” corporate legal departments aren't just playing the same AI adoption game, they're winning it.

Our data reveals that 54% of corporate legal departments have invested in new AI tools in the past 12 months, compared to just 45% of law firms. That investment is only part of the story, however. Usage patterns reveal an even more significant gap. Nearly half (47%) of UK and European corporate counsel are now regularly using AI-powered tools to start or edit their work, about double the rate seen in UK and European law firms.

These tech-enabled clients can now accomplish more sophisticated work in-house, and they expect their outside counsel to match their technological sophistication. Technology leadership has moved beyond a β€œnice-to-have" feature and is now a key differentiator in client relationships.

β€œWe can now handle contract reviews that used to take our external firm a week β€” we do them in a day,” says one general counsel. β€œIf our law firm can't match that speed and insight, why are we paying premium rates?”

The three positions on the game board

Our research reveals three distinct levels of AI maturity among law firms, each with dramatically different outcomes.

Level 1: Lagging behind. One-third of respondents say their law firms have no significant AI plans. While some are deliberately waiting for the market to mature, this position carries increasing risk. Just 18% of firms without AI initiatives are experiencing ROI, and they're beginning to face talent retention challenges as lawyers, particularly younger professionals, migrate to more technologically sophisticated environments.

Level 2: Unstructured experimentation. The largest cohort (40%) of law firm respondents say their firms are experimenting with AI but lack a structured approach. These firms are seeing early returns, with 58% already experiencing ROI, mainly in the form of efficiency gains and time savings.

This group represents a critical learning phase in which firms build confidence with tools, discover use cases, and develop organizational muscle memory. The challenge isn't being here, it's staying here or getting stuck here. Without a strategic framework to channel this experimentation toward deliberate objectives, firms will plateau and their AI use will remain confined to making existing tasks more efficient rather than transforming how legal work gets delivered.

Level 3: Strategic players. Only 22% of lawyers surveyed say their firms have a visible AI strategy. But the ROI data that these firms report tells a compelling story. Most (71%) of these firms are experiencing at least a form of ROI, more than those firms in the experimentation level and almost four times as much as firms without significant AI plans.

In addition, these Level 3 firms are 1.7 times more likely to see revenue growth compared to unstructured adopters. And what's particularly notable is that strategic advantage isn't exclusively about large firm budgets β€” midsize law firms also are appearing in this tier because they approached AI deliberately from the start.

By the end of 2025, according to our research, the average lawyer expects to free up 240 hours per year through AI usage, up from 200 hours in 2024. That equates to approximately $19,000 worth of time on average annually that can be redirected toward higher volumes of work, business development, or more valuable strategic matters β€” and that's just the raw value based on compensation, without factoring in multiples when converted into billable time.

However, the real winners won't be those firms that just use AI to do the same work faster. The ultimate victors will be those that use these tools creatively, not just to speed up existing workflows, but to devise entirely new ones β€” new service models, new ways to deliver legal insight, and new approaches to client relationships that didn't exist before AI.

Innovators, adopters, and laggards

We surveyed lawyers on their firm's AI adoption level, and on their personal current hours worked, expected time savings from AI, and compensation levels. We were then able to calculate the potential value saved per lawyer and compare average value saved by lawyers at firms at different levels on an AI adoption curve.

This adoption curve categorizes firms by their approach to new technology. For example, Innovators and Early Adopters embrace change proactively; Early Majority adopts once technologies are proven; Late Majority waits for more widespread adoption; and Laggards resist change entirely.

Looking ahead 12 months, our research predicts a dramatic market separation, due mainly to the different levels of AI adoption. We foresee that Innovator law firms are expected to achieve $53,000 in value per lawyer β€” more than $26 million for a 500-lawyer firm, or $2.6 million for a 50-lawyer operation. Early adopters will see $25,000 per lawyer. Meanwhile, late majority and laggard firms will struggle with talent attraction and face increasing competitive pressure.

Given all this, the window for strategic positioning hasn't closed, but it's narrowing rapidly. Those law firms that want to win better start playing the AI adoption board game.

PLAYERS: The 7 rules for playing to win

So how do law firms bridge the gap between recognition and results? As we said, our research points to seven essential principles that spell out a clear framework, PLAYERS.

P β€” Pilot with purpose
Strategic law firms don't implement AI firm-wide on day one. Rather, they identify two to three high-impact, high-feasibility pilot projects at the practice area level. AI innovation embedded into actual legal workflows proves far more enduring for adoption and usage than firm-wide mandates. Early success builds momentum, provides critical lessons, and demonstrates value β€” all of which make broader adoption easier.

L β€” Leadership sets the pace
Firms leaders who lead by example, especially during significant change, consistently see better results within their firms. This isn't about mandating AI usage from the top; instead, it's about leadership that is visibly using AI tools, championing change, and investing appropriately. When partners demonstrate AI adoption behaviors rather than just approving budgets, adoption accelerates at every level below.

A β€” Action beats perfection
Many law firms get trapped waiting for the perfect AI solution or 100% accuracy before scaling beyond pilots. However, strategic firms accept that the competitive advantage gained from implementing AI now, even at 85% to 90% accuracy with human oversight, outweighs the marginal benefits of waiting for perfection. Don't let perfect become the enemy of good.

Y β€” Yield to ethics
Establishing governance policies early on isn't about slowing down adoption, but rather about enabling confident, rapid deployment. Successful firms develop clear policies around data privacy, security, responsible AI use, and client notification practices. They define approval processes for new AI tools and establish protocols for output verification, creating the foundation for trust and sustainable growth.

E β€” Educate to accelerate
AI is simply a tool; it’s people that drive its success. However, almost half of law firm professionals surveyed said they see skills gaps among their colleagues. To counter this, strategic firms invest in training for lawyers and staff. This training is not just around how to use AI, but when and why β€” and critically, how to evaluate AI outputs with professional judgment. This can address anxieties and foster cultures of responsible experimentation through open communication about strategy and benefits.

R β€” Rely on data
Because AI is only as good as the data it's trained on or references, strategic firms ensure they have comprehensive strategies for managing, securing, and leveraging data assets. This includes not just client and third-party data, but also the firm's own internal knowledge base and legal case work. Firms that neglect data strategy find even the most sophisticated AI tools will deliver mediocre results.

S β€” Strategy before tools
This is the most critical rule, supported by the starkest data in the research. Firms should align their AI strategy with their overall firm strategy, especially if the goal is revenue growth. AI initiatives should directly support that objective rather than defaulting to generic efficiency plays. Leaders also should establish SMART (Specific, Measurable, Achievable, Relevant, Time-bound) objectives with clear metrics. And they should define key performance indicators to track success and be prepared to adapt as technology and client needs evolve.

The firms that begin with β€œwhich AI tool should we buy?” rather than with β€œWhat are we trying to achieve?” consistently underperform their more strategic peers.

The execution pyramid

Having rules isn't enough. Firms need to understand how these rules interact. Our research identifies what's called the AI Success Pyramid, with four interconnected levels that must all function properly for AI initiatives to deliver ROI.

At the top of the pyramid sits Strategy. The 22% of firms that have achieved the previously mentioned Level 3 have created a clear, visible strategy that guides all AI investment and adoption decisions.

Below that, Leadership must actively champion transformative change and openly model adoption behaviors. Without visible leadership engagement, even the best strategies stall at the pilot phase.

The Operations level is where transformation actually happens. Strategic firms are making changes to how they price legal work, how they staff matters, and how they deliver services. Indeed, they are not just adding AI to existing workflows, rather they're redesigning their fundamental business model.

At the foundation are Individual Users, the lawyers and staff who must understand AI, feel empowered to use it, and maintain accountability for outcomes. When users lack training or view AI as something imposed rather than enabled, adoption crumbles regardless of the three levels above.

Those law firms that can achieve ROI do so by engaging all four levels simultaneously. Those struggling typically excel at one or two levels but miss the others. And when strategy at the top is weak, every level below suffers from misalignment.

Your firm’s next move

The board is set, and the pieces are moving. Some firms are several squares ahead, while others haven't realized the game has started. However, in this particular boardgame, there's no reset button and no pause function.

The question for every law firm leader is simple: What's our next move?

Will you continue playing without strategy, hoping that your ad hoc adoption and individual experimentation will somehow coalesce into competitive advantage? Or will you follow the seven rules that spell success β€” PLAYERS β€” and play strategically?

The firms that answer that question with deliberate action rather than further analysis will be the ones setting the pace in 12 months' time. The firms that continue to wait and see while competitors act eventually will find themselves explaining to clients, recruits, and partners exactly why they fell behind.

The AI adoption board game rewards strategic players. It's your turn.

About the research

The insights in this feature article are drawn from the ³ΙΘΛVRΚΣΖ΅ β€œβ€, which surveyed 985 legal professionals across law firms in 53 countries. The research provides comprehensive analysis of AI adoption patterns, implementation challenges, and ROI outcomes across the legal industry.

Follow us on social

Have questions?

Get in touch with one of our solutions experts....
³ΙΘΛVRΚΣΖ΅ Institute logo

Featured Event

Table of
Contents
H2
H3
H4
H5
H6
March 18, 2026
The AI adoption board game: Why law firm leaders can't afford to play it safe
Strategic AI adoption separates winners from laggards β€” and the gap is widening faster than most law firms realize
13 mins
March 18, 2026
AI & Future Technologies
The AI adoption board game: Why law firm leaders can't afford to play it safe
Michelle Nesbitt-Burrell
Marketing Strategy Director
³ΙΘΛVRΚΣΖ΅
Headshot of Michelle Nesbitt-Burrell
Business Technology
Efficiency
Emerging Technologies
Law Firm Business
Law Firm Profitability
Legal Technology
Tech adoption
Legal professionals
Innovation and technology
The human side of AI: The growing risks of ubiquitous use of AI on talent
Premortem: Your 2028 agentic AI pilot program failed
The 2030 legal department: 5 ways AI will transform how in-house teams work