Home / 3D Furniture Modeling / How to Optimize 3D Furniture Models for Fast Loading on Mobile (2026 Guide)

How to Optimize 3D Furniture Models for Fast Loading on Mobile (2026 Guide)

How to Optimize 3D Furniture Models for Fast Loading

Want to Increase Conversions by 40% for E-Commerce & Furniture?

Read the Full 3D Guide

US furniture ecommerce  is growing day by day – and most of that shopping starts on a phone. The problem begins here? Most 3D product viewers on mobile are still painfully slow. A 20MB sofa model killing your page load isn’t just a bad experience. It’s lost revenue.

This guide walks you through every practical step to get your 3D furniture models under 5MB, loading in under 3 seconds on 4G, running at 60 FPS on a mid-range Android. No fluff, no filler – just what actually works for furniture brands and Shopify merchants in the US market.

What this guide covers:

  • Choosing the right 3D file format for US mobile delivery
  • Reducing polygon count without wrecking visual quality
  • Compressing textures using KTX2 and Basis Universal
  • Applying Draco and Meshopt compression
  • Implementing Level of Detail (LOD) for the web
  • Lazy loading and progressive rendering for ecom sites
  • Rendering optimizations: draw calls, instancing, culling
  • Testing on real US mobile devices
  • Platform playbook for Shopify, WooCommerce, and custom WebGL

Your target benchmark: < 5MB file size · < 3s load on 4G · 60 FPS on mid-range Android

Why Mobile 3D Performance Matters for US Furniture Ecommerce

Here’s the honest picture: 65% of furniture shoppers browse on their phone first. If your 3D viewer takes 8 seconds to load, most of them leave before they ever see the product.

That slowdown doesn’t just hurt UX. Google’s Core Web Vitals – specifically LCP (Largest Contentful Paint) and INP (Interaction to Next Paint) – directly influence your search rankings. A 3D viewer that blocks your LCP from hitting the 2.5-second threshold is actively pushing your product pages down in Google results.

The conversion math is blunt. Research consistently shows that a one-second delay in load time reduces conversions by 7%. For a furniture brand doing $100,000/month in online revenue, that’s $7,000 gone – every month – from one second of slowness. Sites that pass all three Core Web Vitals thresholds see conversion improvements of 15–30% compared to those that don’t.

The benchmark you’re aiming for:

Metric

Target

File size

< 5MB (ideal: < 3MB)

Load time on 4G

< 3 seconds

Frame rate

60 FPS on mid-range Android

LCP

< 2.5 seconds

“Optimized” doesn’t mean low quality. Done correctly, a 3MB sofa model is visually indistinguishable from a 25MB one in a browser viewer. The difference is in how you get there.

Details Optimization Benchmark Table in 2026 

Technique

Before

After

Load Time Impact

Visual Quality Impact

Difficulty

Polygon reduction (Blender Decimate)

300K tris

40K tris

−60%

Minimal with normal map

⭐⭐ Medium

Draco compression

8MB mesh

0.8MB mesh

−70%

None

⭐ Easy

Texture resolution reduction

4096px

1024px

−75% texture

Minimal on mobile

⭐ Easy

KTX2 / Basis Universal textures

JPEG textures

KTX2

−40% GPU memory

None (GPU-native)

⭐⭐ Medium

Texture atlasing

8 draw calls

2 draw calls

−30% render time

None

⭐⭐⭐ Hard

Lazy loading (<model-viewer>)

LCP blocked

LCP fast

LCP: −2–4s

None

⭐ Easy

LOD implementation

Single mesh

3 LOD levels

−50% on zoom-out

None at distance

⭐⭐⭐ Hard

Baked lighting / AO

Real-time AO

Baked texture

−20% GPU overhead

Very minimal

⭐⭐ Medium

Choose the Right File Format for US Mobile Delivery

Choose the Right File Format for US Mobile Delivery

The file format you choose determines everything downstream – how fast it transfers, how fast it parses, and whether it works in AR on iOS and Android.

GLB: The Web and Android Standard

GLB is the binary version of glTF. It packages geometry, textures, and materials into a single self-contained file. It loads faster than OBJ or FBX, works natively in Three.js, Babylon.js, and Google’s <model-viewer>. For anything web or Android – GLB is your default.

USDZ: Non-Negotiable for iOS AR

iPhone holds 57% of the US smartphone market. For AR Quick Look on iOS – which lets shoppers place a sofa in their living room without any app – you need a USDZ file. There is no workaround. If you skip USDZ, you’re cutting out more than half your US mobile audience from the AR experience.

You need both formats for full US market coverage.

File Format Comparison

Format

Average File Size

Web-Ready

Mobile AR

Verdict

OBJ + MTL

15–40MB

❌ No (multi-file)

❌ No

Avoid for web

FBX

10–30MB

❌ No

❌ No

Avoid for web

GLB

3–8MB

✅ Yes

✅ Android

Use this for web

GLB + Draco

0.5–2MB

✅ Yes

✅ Android

Best for web

USDZ

2–6MB

✅ iOS only

Required for iOS AR

Export Settings Checklist

When exporting GLB from your 3D tool, check these before you export:

  • Blender: File → Export → glTF 2.0 → Format: GLB, enable Draco mesh compression, include only active objects
  • Maya: Export via the glTF plugin with binary output selected
  • Cinema 4D: Use the glTF exporter plugin; disable embedded previews

Tool Comparison Table in 2026 

Tool

Cost

Use Case

Skill Level

Furniture-Ready

Blender

Free

Polygon reduction, baking, export

Intermediate

✅ Yes

glTF-Transform

Free (CLI)

Batch compression, LOD generation

Intermediate

✅ Yes

toktx

Free (CLI)

KTX2 texture conversion

Intermediate

✅ Yes

gltf.report

Free (web)

Audit / analysis

Beginner

✅ Yes

Google <model-viewer>

Free

Web viewer with AR

Beginner

✅ Yes

RapidPipeline

Paid

Automated optimization pipeline

Beginner

✅ Yes

Simplygon

Paid

Enterprise LOD generation

Advanced

✅ Yes

echo3D

Paid

3D asset management + CDN

Beginner

✅ Yes

Reduce Polygon Count Without Losing Visual Quality

This is where most of the file size savings come from. A hero sofa with 800,000 triangles is not only unnecessary – it actively degrades mobile performance.

Mobile Polygon Budgets for Furniture

Product Type

Maximum Triangle Count

Hero product (sofa, bed)

< 50,000 triangles

Secondary piece (chair, side table)

< 10,000 triangles

Small accessory (lamp, cushion)

< 2,000 triangles

These aren’t arbitrary limits. They’re derived from what mid-range Android GPUs (Snapdragon 6xx series) can render at 60 FPS in a WebGL context alongside a product page.

Step-by-Step: Decimate Modifier in Blender

The fastest way to reduce polygon count in Blender without manual retopology:

  1. Select your mesh in Object Mode
  2. Go to the Properties panel → Modifier (wrench icon)
  3. Add → Decimate
  4. Start with Ratio: 0.5 (halves your triangle count)
  5. Check the mesh in Viewport – reduce further if detail holds up
  6. For a sofa, aim for 0.1–0.2 ratio from a high-poly source mesh
  7. Apply the modifier before export

Always check the result at the Ratio you plan to export. The goal is to remove triangles from areas the camera rarely sees – the underside of a frame, interior faces, flat uniform surfaces.

Normal Maps: The Key Trade-Off

After decimation, use a normal map to simulate the high-poly surface detail on the low-poly mesh. This is the single most important technique for keeping furniture looking premium at low polygon counts.

  • Bake the normal map from your high-poly mesh onto the low-poly version (Blender’s Bake panel)
  • A 1024×1024 normal map adds ~1MB but lets you reduce mesh complexity by 80%
  • The visual difference on a phone screen is negligible – the performance difference is enormous

Quick-Win: Audit Your Model First

Before doing any manual work, drop your GLB into gltf.report – it’s free and shows you triangle count, texture sizes, draw calls, and file size breakdown in seconds. Start with the biggest offenders.

Also remove:

  • Hidden geometry (interior faces of hollow furniture)
  • Duplicate vertices (run Merge by Distance in Blender)
  • Back-face data on non-visible surfaces

Compress Textures the Right Way for Mobile

Compressing textures for better mobile performance

Geometry is half the file size problem. Textures are the other half – and most furniture 3D files carry far more texture data than any mobile GPU needs.

Resolution Guide

Surface Type

Recommended Resolution

Hero product (primary surface)

1024 × 1024 px

Secondary material / detail

512 × 512 px

Background or accessory

256 × 256 px

Maximum ever

2048 × 2048 px

Going above 2048×2048 on any furniture texture for mobile web is wasteful. Phones render at 400–500 DPI – the extra data doesn’t make anything look better, it just takes longer to load and uses more GPU memory.

Texture Atlasing

Instead of separate texture files per material (which each require a separate draw call), atlas your textures – combine multiple material maps into one image. A sofa with 6 materials can often be consolidated to 2–3 atlas sheets. Fewer draw calls = faster mobile rendering.

KTX2 + Basis Universal: The Format Most Brands Skip

This is where Orb3D’s workflow genuinely separates from generic optimization advice. KTX2 with Basis Universal is a GPU-native texture format – the GPU decompresses it directly, rather than the CPU loading a JPEG and then uploading it to the GPU.

The result: significantly faster texture load times and lower GPU memory usage on mobile devices.

To convert your textures:

Bash

# Install toktx (free, part of KTX-Software)

# Convert a PNG texture to KTX2 with Basis Universal compression

toktx –t2 –bcmp output_texture.ktx2 input_texture.png

Then reference the KTX2 file in your glTF material. Three.js and <model-viewer> both support KTX2 natively via the KHR_texture_basisu extension.

PBR Maps You Actually Need

Stop including every map your 3D artist exported. For furniture on mobile web, you need:

  • Base Color – the diffuse surface color
  • Metallic-Roughness – combined in one texture (glTF standard)
  • Normal – surface micro-detail
  • Ambient Occlusion (AO) – shadows in crevices

Emissive maps, height maps, and subsurface scattering data are largely wasted on mobile WebGL at furniture scales.

Bake Shadows Into the Texture

Rather than computing shadows in real-time on the GPU (expensive on mobile), bake your AO and shadow information into the Base Color or AO texture. A baked-lighting furniture model renders faster and still looks professional. Blender’s Cycles bake handles this in a few minutes.

Tools for texture work:

  • toktx – free CLI for KTX2 conversion
  • Squoosh – browser-based JPEG/WebP compression for Base Color maps
  • glTF-Transform – CLI that handles texture compression inside the GLB

Apply Draco and Meshopt Compression

After you’ve reduced polygon count and optimized textures, Draco compression is your biggest remaining lever for file size reduction.

What Draco Does

Draco compresses the mesh geometry (vertex positions, normals, UV coordinates) – not the textures. Typical reduction: 70–90% of mesh data size. A sofa mesh that was 4MB after texture optimization can drop to under 400KB with Draco.

Draco vs Meshopt

 

Draco

Meshopt

Compression ratio

Higher (geometry)

Moderate

Decompression speed on mobile

Slightly slower

Faster

Three.js support

✅ Via DRACOLoader

✅ Via EXT_meshopt_compression

Best use case

Maximum compression for delivery

Better for streaming / progressive

2025 recommendation for furniture web

✅ Use this

Use if targeting low-end devices

For most US furniture ecommerce, Draco is the right choice. Meshopt is worth considering if you’re targeting very low-end Android devices where decompression CPU cost matters.

Enable Draco in Blender GLB Export

  1. File → Export → glTF 2.0
  2. In the export panel, expand Mesh
  3. Enable Draco mesh compression
  4. Set compression level to 6 (good balance of speed vs ratio)
  5. Export as GLB

DRACOLoader in Three.js

javascript

import * as THREE from ‘three’;

import { GLTFLoader } from ‘three/examples/jsm/loaders/GLTFLoader.js’;

import { DRACOLoader } from ‘three/examples/jsm/loaders/DRACOLoader.js’;

const dracoLoader = new DRACOLoader();

// Point to the decoder – use Google’s CDN or host your own

dracoLoader.setDecoderPath(‘https://www.gstatic.com/draco/versioned/decoders/1.5.6/’);

const loader = new GLTFLoader();

loader.setDRACOLoader(dracoLoader);

loader.load(‘/models/sofa.glb’, (gltf) => {

  scene.add(gltf.scene);

});

Note on mobile decompression: Draco decoding runs on the main JavaScript thread. On low-end Android (Snapdragon 4xx), this can add 200–400ms. If your target audience is on budget devices, test both Draco and Meshopt and measure the difference. For typical US shoppers on iPhone 14 or Galaxy A53+, Draco decompression is imperceptible.

Read more : High Poly vs Low Poly Models – Understanding the Differences, Benefits & Limitation

Level of Detail (LOD) for Furniture on Mobile Web

LOD is standard practice in game development. Almost no US furniture ecom brands use it on the web – which is a wasted opportunity.

What LOD Means for a Product Page

LOD means having multiple versions of the same model at different polygon counts, switching between them based on how much screen space the object occupies. A sofa taking up the full screen needs the high-detail version. The same sofa in a room scene thumbnail can use a 500-triangle version.

LOD Poly Targets: Sofa Example

LOD Level

When Used

Triangle Count

LOD 0 (full detail)

Product page hero, close zoom

40,000–50,000 tris

LOD 1 (medium)

Default product listing view

8,000–12,000 tris

LOD 2 (low)

Thumbnails, room scenes, far view

500–2,000 tris

Distance-Based LOD in Three.js

javascript

import { LOD } from ‘three’;

const lod = new LOD();

// Assumes you’ve loaded high, med, low meshes separately

lod.addLevel(highDetailMesh, 0);    // Use from 0 units away

lod.addLevel(medDetailMesh, 5);     // Switch at 5 units

lod.addLevel(lowDetailMesh, 15);    // Switch at 15 units

scene.add(lod);

// In your animation loop:

lod.update(camera);

Generate LOD Levels via glTF-Transform CLI

bash

# Install glTF-Transform

npm install -g @gltf-transform/cli

# Generate LOD levels with decimation ratios

gltf-transform simplify input.glb output-lod1.glb –ratio 0.25 –error 0.001

gltf-transform simplify input.glb output-lod2.glb –ratio 0.05 –error 0.01

This generates LOD 1 at 25% of original geometry and LOD 2 at 5% – automated, no manual work in Blender.

Lazy Loading and Progressive Rendering for US
E-commerce Sites

E-commerce performance and lazy loading

Loading a 3D viewer the moment a product page opens is one of the most common performance mistakes furniture brands make. The 3D asset blocks your LCP – the metric Google uses to rank your page.

The “View in 3D” Pattern

The correct pattern: show a static product image by default, load the 3D model only when the user actively requests it. This keeps your LCP fast (it’s rendering a JPEG, not a GLB) and the 3D experience still available for shoppers who want it.

html

<!– Static image with a “View in 3D” trigger –>

<div id=”product-viewer“>

  <img src=”/images/sofa-hero.webp alt=”Sofa id=”static-preview“>

  <button id=”view-3d-btn“>View in 3D</button>

</div>

<script>

  document.getElementById(‘view-3d-btn’).addEventListener(‘click’, () => {

    // Only now do we load the 3D viewer

    import(‘/js/3d-viewer.js’).then(module => module.init());

  });

</script>

Intersection Observer: Load on Viewport Entry

For product listing pages, load the 3D model only when the product card scrolls into view:

javascript

const observer = new IntersectionObserver((entries) => {

  entries.forEach(entry => {

    if (entry.isIntersecting) {

      const productCard = entry.target;

      const modelSrc = productCard.dataset.modelSrc;

      loadModel(modelSrc, productCard);

      observer.unobserve(productCard); // Load once, then stop watching

    }

  });

}, { rootMargin: ‘200px’ }); // Start loading 200px before it’s visible

document.querySelectorAll(‘.product-card[data-model-src]’).forEach(card => {

  observer.observe(card);

});

Google’s <model-viewer>: Best Option for US Ecom

For Shopify merchants and furniture brands who don’t need custom Three.js setups, Google’s <model-viewer> web component is the easiest path to optimized, AR-ready 3D viewing:

html

<script type=”module src=”https://ajax.googleapis.com/ajax/libs/model-viewer/3.4.0/model-viewer.min.js“></script>

<model-viewer

  src=”/models/sofa.glb

  ios-src=”/models/sofa.usdz

  alt=”Orb3D optimized sofa model

  ar

  ar-modes=”webxr scene-viewer quick-look

  camera-controls

  loading=”lazy

  poster=”/images/sofa-poster.webp“>

</model-viewer>

loading=”lazy” is built in. poster shows a static image while the model loads. ar activates AR Quick Look on iOS and ARCore on Android with a single attribute.

Rendering Optimizations: Draw Calls, Instancing, Culling

This section is for developers building custom WebGL viewers. These optimizations are what separate a 60 FPS experience from a 30 FPS one on mid-range Android.

Mobile Draw Call Budget

On WebGL running on a mid-range Android GPU, keep your draw calls under 20 per frame. Each material, each separate mesh, each texture swap = a draw call. A badly structured furniture scene with 15 separate mesh objects and 12 unique materials can easily hit 80+ draw calls.

How to reduce draw calls:

  • Merge static furniture meshes that share the same material into one mesh
  • Use texture atlasing to consolidate multiple materials into one
  • Remove invisible geometry that still issues draw calls

GPU Instancing for Repeated Elements

Chair legs, cabinet handles, sofa legs, shelf brackets – these are the same geometry repeated multiple times. Instead of rendering each one as a separate draw call, use instancing:

javascript

import { InstancedMesh, Matrix4 } from ‘three’;

// 4 identical chair legs – 1 draw call instead of 4

const legMesh = new InstancedMesh(legGeometry, legMaterial, 4);

const matrix = new Matrix4();

legPositions.forEach((position, i) => {

  matrix.setPosition(position.x, position.y, position.z);

  legMesh.setMatrixAt(i, matrix);

});

scene.add(legMesh);

Frustum and Occlusion Culling

Three.js performs frustum culling automatically – objects outside the camera’s view volume are not rendered. Make sure you’re not disabling this (object.frustumCulled = false should only be used when genuinely necessary).

For dense room scenes, consider occlusion culling: don’t render furniture that’s hidden behind other objects. This is more complex to implement but can halve GPU load in room-scale product visualizations.

Testing and Benchmarking on US Mobile Devices

Optimization without measurement is guesswork. These are the tools and devices that matter for the US market.

Your Test Device Matrix

Device

Why It Matters

iPhone 14 or 15

iOS AR Quick Look, 57% of US smartphone market

Samsung Galaxy A53 or A34

Mid-range Android, representative of US Android buyer

Chrome DevTools (throttled)

Fast iteration before real-device testing

Chrome DevTools Workflow

  1. Open DevTools → Performance tab
  2. Click the throttle icon → Mid-tier mobile (simulates Snapdragon ~660)
  3. Run Lighthouse in Mobile mode – check LCP, INP, CLS scores
  4. Network tab → throttle to Slow 4G → reload and watch model load timing

gltf.report: Audit Before Publishing

Drop your GLB into gltf.report and check:

  • Total triangle count
  • Texture dimensions and formats
  • Number of draw calls
  • File size by component (geometry vs textures)

Run this before and after optimization. The before/after numbers will tell you exactly where your improvements came from.

Target Benchmark Table

Metric

Poor

Acceptable

Target (Orb3D Standard)

GLB file size

> 15MB

5–15MB

< 5MB

Triangle count (hero sofa)

> 200K

50–200K

< 50K

Load time on 4G

> 8s

3–8s

< 3s

Frame rate (mid-range Android)

< 30 FPS

30–45 FPS

60 FPS

LCP with lazy loading

> 4s

2.5–4s

< 2.5s

Google WebPageTest

Test from real US locations (New York, Los Angeles) on mobile 4G at webpagetest.org. This gives you real-world LCP numbers from the same network conditions your US customers experience – not just what Lighthouse estimates in a lab.

Platform Playbook: Shopify, WooCommerce, Custom

Shopify

Shopify activates its built-in 3D/AR viewer automatically when you upload both a GLB and USDZ to a product. No code required.

What to know:

  • Shopify’s technical file limit is 50MB, but target under 10MB for real-world performance
  • The viewer uses <model-viewer> under the hood – all the lazy loading and AR features are included
  • Name your files clearly: product-name.glb and product-name.usdz

WooCommerce

WooCommerce doesn’t have native 3D support, so you’ll need a plugin or custom embed:

  • ModelViewer for WooCommerce (plugin) – wraps Google’s <model-viewer>, straightforward
  • CDN hosting: Don’t serve GLB files from your WordPress server. Upload them to Cloudflare R2 or AWS S3 + CloudFront. Serve from the CDN edge node closest to your US buyer

Custom WebGL: Framework Decision Matrix

Framework

Best For

Skill Level

Furniture-Ready

Google <model-viewer>

Shopify-style quick implementation, AR

Beginner

✅ Out of the box

Three.js

Full custom viewer, room scenes

Intermediate–Advanced

✅ With setup

Babylon.js

Complex scenes, physics, advanced AR

Advanced

✅ With setup

If you’re building a product configurator, room planner, or anything with real-time customization – Three.js. If you just need a fast, reliable product viewer with AR – <model-viewer> gets you there in 20 lines of HTML.

US CDN Strategy

Serve your GLB and USDZ files from CDN edge nodes, not your origin server. For a US-focused furniture brand:

  • Cloudflare R2 – free egress, fast US edges, simple setup
  • AWS CloudFront – more configuration, better for existing AWS infrastructure
  • Target: CDN edge → browser transfer time under 800ms for a 3MB GLB on US 4G

Optimization Benchmark Table

Technique

Before

After

Load Time Impact

Visual Quality Impact

Difficulty

Polygon reduction (Blender Decimate)

300K tris

40K tris

−60%

Minimal with normal map

⭐⭐ Medium

Draco compression

8MB mesh

0.8MB mesh

−70%

None

⭐ Easy

Texture resolution reduction

4096px

1024px

−75% texture

Minimal on mobile

⭐ Easy

KTX2 / Basis Universal textures

JPEG textures

KTX2

−40% GPU memory

None (GPU-native)

⭐⭐ Medium

Texture atlasing

8 draw calls

2 draw calls

−30% render time

None

⭐⭐⭐ Hard

Lazy loading (<model-viewer>)

LCP blocked

LCP fast

LCP: −2–4s

None

⭐ Easy

LOD implementation

Single mesh

3 LOD levels

−50% on zoom-out

None at distance

⭐⭐⭐ Hard

Baked lighting / AO

Real-time AO

Baked texture

−20% GPU overhead

Very minimal

⭐⭐ Medium

Conclusion

Fast-loading 3D furniture models are no longer optional for mobile ecommerce in 2026. By optimizing polygons, textures, compression, and rendering, brands can deliver smooth AR-ready experiences that improve Core Web Vitals, user engagement, and conversions – without sacrificing visual quality.

Want lightweight, high-performance 3D furniture models for your ecommerce store? Orb3D helps furniture brands optimize GLB and USDZ models for faster loading, better mobile performance, and higher conversions. Book a Call for a free trial.

Frequently Asked Questions

Q: What’s the most important single optimization for mobile 3D furniture?

Polygon reduction combined with Draco compression. Together they can reduce a typical furniture model from 20MB+ to under 3MB with no visible quality loss in a mobile browser.

Q:  Do I need to hire a 3D artist to do this?

Not necessarily. Blender’s Decimate modifier and glTF-Transform CLI handle the heavy lifting. If you already have GLB files, most of the pipeline described here is tooling work, not artistic work.

Q:  Can Orb3D help with the optimization pipeline?

Yes – Orb3D handles the full 3D optimization workflow for furniture brands, from polygon reduction and texture compression to platform-ready GLB and USDZ delivery. If you want models that hit these benchmarks without building the pipeline yourself, that’s exactly what Orb3D is built for.

Q:  Does Draco compression work with all 3D viewers?

It works with Three.js (requires DRACOLoader), Babylon.js, and Google’s <model-viewer>. Shopify’s built-in viewer supports it. Some older or simpler viewers may not – check your viewer’s documentation.

Q:  What’s the minimum Android device I should test on?

The Samsung Galaxy A-series (A53, A34, or similar) is representative of the mid-range US Android buyer. If your model runs smoothly on one of these, it’ll run fine on higher-end devices.

Overview

Every engaging element on our site and in our promotions has been handcrafted by the Orbe3D Content Marketing Team.

Upload Your Furniture References to Get Started…

We've got all your answers

3D furniture rendering services 5

Get 3D & AR insights
by subscribing

Stay up-to-date with new features, trends, and

special offers.

Make your eCommerce strategy stand out
with 3D & AR

15% Off for New Client

Submit your email and get 15% OFF – use your discount whenever you’re ready. Claim your offer before it’s gone.

We value your privacy. Your email will be kept strictly confidential and used only to send updates and special offers. We do not sell or share your information. View our Privacy Policy.