3D Commerce Strategy

A 3D Product Viewer for Visual Commerce: What to Measure

A measurement specification for visual-commerce viewers that separates availability, intent, readiness, meaningful use, errors, commerce progression and causal evidence.

Adjustable desk lamp inside separate state, quality and commerce arcs, showing that availability, usable performance and a later commerce action need different evidence.
A viewer measurement plan connects states without letting one state stand in for the next.

A 3D product viewer for visual commerce should be measured as a sequence of states: the experience was eligible, offered, opened, ready, used and followed by a commerce action, or it failed along the way. Raw orbit counts cannot tell you whether the model loaded, whether a shopper inspected a useful feature or whether the viewer helped answer a product question.

Start with an event contract, not a dashboard. Give every event one firing rule, a small parameter set, an owner and a test. Then calculate rates with explicit denominators. Keep page performance, viewer readiness and commerce outcomes separate. This produces evidence a product, marketing and engineering team can review without turning an association into a universal lift claim.

The interactive 3D product experience guide owns the wider format, UX, fallback and performance architecture. This guide stays with measurement: which transitions to record, how to validate them and what each KPI can legitimately support.

Model the viewer as a state machine

A page view is not viewer exposure. Exposure is not intent. Intent is not a usable first frame. Build the data model around those distinctions.

Use one attempt record per product, variant and viewer opening. The attempt begins when an accepted pointer or keyboard action requests 3D. It ends when the viewer closes, the product state changes, the page becomes inactive or a blocking error prevents progress. If policy permits a join key, keep it ephemeral and out of reporting dimensions. Product, asset and viewer revisions matter more for diagnosis than a permanent user identifier.

Before the attempt, record whether the viewer could be offered for the selected product state. That eligibility denominator exposes missing assets, unsupported placements and configuration gaps. After opening, record readiness only when the first meaningful frame is visible and required controls can respond. A download completion callback is too early if shader work, product-state binding or control setup is unfinished.

Meaningful use should be sparse. Record the first deliberate orbit, named view, hotspot, animation or material change. Do not send every pointer move. A long stream rewards restless gestures and inflates event volume without showing whether the shopper learned anything.

A single adjustable desk lamp sits beside separate offered, open, ready, use and outcome gates, with an error branch leaving the path before later states can be counted.
Each state owns its own firing rule and denominator; a later state cannot be assumed from an earlier one.

Use one versioned event and KPI specification

The following table is an original Double Edged specification. Event names are examples for a custom analytics implementation, not a platform standard. The firing rules are the contract.

Use one versioned event and KPI specification
EventFire once whenRequired low-cardinality parametersKPI role and QA gate
viewer_offeredThe 3D entry control is visible, enabled and valid for the current product stateproduct_id, variant_id, asset_revision, viewer_version, placementDenominator for offer and open rates. In 20 scripted sessions, it must fire once only when the control is actionable.
viewer_openA trusted pointer or keyboard action is accepted and starts a new attemptAll offer fields plus entry_point, input_type, attempt_sequenceNumerator for open rate and start of ready latency. Reject automatic opens, double taps that create two attempts and events fired before consent permits collection.
viewer_readyThe first product frame is visible, the intended product state is bound and required controls respondready_ms_band, cache_state, device_class, network_class, asset and viewer revisionsNumerator for ready success. Compare exact User Timing data in engineering telemetry; send bands to analytics when exact values add cardinality without decision value.
viewer_first_useThe first deliberate camera, named-view or feature action changes viewer state after readinessinteraction_type, product and variant IDs, seconds_to_use_bandNumerator for meaningful-use rate. Fire once per attempt; automated rotation and prompts do not qualify.
viewer_featureA named product feature, animation or configured material state is intentionally opened for the first timefeature_id, state_id, product and variant IDsMeasures feature reach against ready attempts. Use a governed feature dictionary rather than free text.
viewer_ar_requestThe shopper deliberately requests an available AR routedestination_requested, entry_point, product, variant and asset revisionsMeasures AR intent only. It is not a launch, placement or compatibility success event.
viewer_errorA classified asset, network, decoder, GPU, binding or runtime failure blocks a state transitionerror_stage, error_class, recoverable, asset and viewer revisionsNumerator for blocking-error rate. Map raw messages to a short dictionary and keep stack details in technical logs.
viewer_exitThe active attempt closes, loses its valid product state or reaches a defined page-exit boundaryfurthest_state, duration_band, exit_reasonCloses attempt reconciliation. Every open must have one ready or blocking error and one terminal record, allowing a documented page-exit exception.

An implementation can adapt browser-component signals to this contract. The current official <model-viewer> documentation says its load event fires after the first render frame, while poster-dismissed can occur later because shader compilation may add delay. It also exposes camera-change with a user-interaction source, classified loading and WebGL errors, and progress covering concurrent download and processing work.[1] Those signals are useful adapters. They are not business events by themselves, and another runtime will have different hooks.

Adjustable desk lamp crossing separate viewer-state, delivery-quality and commerce bands, with notches marking a distinct firing rule and test for each transition.
The event contract links a state transition to a KPI and QA test without merging viewer telemetry into commerce events.

Measure timing at the transition it describes

Define viewer_ready_ms from the accepted viewer_open action to the first usable viewer state. W3C User Timing provides high-resolution mark() and measure() entries for application-defined intervals, including metadata on marks and measures.[2] Mark the opening action from its event timestamp, mark the usable state after rendering and control setup, then measure between them. Keep raw timing in performance telemetry and report percentiles, not an average alone.

Resource Timing can add fetch start, response end, transfer size, encoded body size and decoded body size for HTTP(S) resources. Cross-origin detail may be zeroed unless the resource response grants access through Timing-Allow-Origin.[3] Verify the field before designing a dashboard around bytes. A CDN migration can otherwise turn a real value into zero and look like an optimization.

Event Timing measures the interval from physical input through the next paint and separates input delay from processing time. Its specification excludes continuous events such as pointermove, touchmove, wheel and drag from the exposed event set.[4] Use it for discrete viewer controls and the first accepted interaction where supported. Use viewer-specific frame sampling for drag smoothness; do not pretend Event Timing supplies a complete orbit-frame metric.

Keep these three clocks distinct:

  • page experience: LCP, INP and CLS for the complete product page;
  • viewer readiness: accepted open to usable first frame;
  • viewer interaction: a named input to its visible response.

One clock cannot stand in for another. A fast page can open a slow model, and a fast model can sit inside a page with poor interaction latency.

Calculate rates with explicit denominators

A KPI name without a denominator invites argument. Publish the formula beside the chart and exclude test traffic, duplicate attempts and sessions where required consent was absent.

Calculate rates with explicit denominators
KPIFormulaWhat it supportsWhat it does not support
Offer coverageeligible product-page sessions with viewer_offered ÷ in-scope product-page sessionsAsset and implementation coverageShopper interest or commercial value
Open ratesessions with viewer_open ÷ sessions with viewer_offeredIntent to try the offered viewerReadiness, meaningful use or causation
Ready successattempts with viewer_ready ÷ attempts with viewer_openDelivery reliability under the observed mixA performance threshold without latency percentiles
Ready latencyp50, p75 and p95 viewer_ready_ms for successful attempts, with failures reported separatelyTypical and tail waiting time by named segmentExperience of failed attempts if they are silently removed
Meaningful-use rateready attempts with viewer_first_use ÷ attempts with viewer_readyDeliberate use after the viewer became usableProduct understanding or purchase intent by itself
Blocking-error rateattempts with a blocking viewer_error ÷ attempts with viewer_openReliability and the affected stageThe frequency of non-blocking warnings
Commerce progressioneligible sessions reaching an existing commerce event ÷ eligible sessions, split by viewer stateAssociation between viewer state and a later commerce stepIncremental lift caused by the viewer

Google Analytics recommends checking for an automatically collected or recommended event before creating a custom event, and describes a custom event as a name plus parameters. Its guidance also warns that high-cardinality dimensions can be rolled into an (other) row or trigger sampling in some reports.[5] Keep asset revisions and feature IDs governed; do not send camera coordinates, URLs or raw error strings as report dimensions.

Leave commerce actions with the commerce layer. GA4 documents view_item, add_to_cart, begin_checkout, purchase and refund among its ecommerce events.[6] Do not create viewer_add_to_cart as a rival source of truth. Join the viewer state to the existing event in an approved warehouse model or attach a small exposure state where the analytics design and consent policy allow it.

Fix the test profile before choosing a threshold

Every technical gate needs the tested artifact and conditions. The profile below is a starter acceptance contract, not a report of completed tests and not a universal benchmark. Before execution, record the exact release GLB filename and SHA-256, viewer build, host-page build, browser versions and physical device model. If any identity field is missing, the run is not release evidence.

Use a cold cache, a 10 Mbps down, 1 Mbps up and 100 ms round-trip lab network, one current stable desktop Chromium build on Windows 11, one named mid-range physical Android device with current stable Chrome, a mobile viewport, and five timing runs per file and browser combination. Record any CPU throttling rather than leaving it implicit.

Fix the test profile before choosing a threshold
GateStarter acceptance threshold under that profileEvidence to retain
Event integrityTwenty scripted attempts produce every expected transition exactly once, 100% of required parameters and no event before its firing conditionEvent dictionary version, browser log, outbound requests and receiver records
Viewer readinessAll five cold runs reach viewer_ready; median open-to-ready time is at or below 5 seconds; every failure in forced-failure runs produces one classified blocking eventFive traces, raw User Timing entries, resource waterfall, file hash and failure captures
Discrete controlsTen of ten orbit-start, named-view, reset, feature and exit tasks produce the expected visible state; each observed discrete response is at or below the project-set 200 ms gateEvent Timing entries where supported, screen recording, task sheet and device versions
Page field performanceAt least 75% of page visits meet LCP at or below 2.5 seconds, INP at or below 200 milliseconds and CLS at or below 0.1, segmented between mobile and desktopField report, date range, sample coverage and release annotation
FallbackBlocked model, corrupt response, offline interruption, unavailable rendering and runtime exception all leave approved product media and the purchase route usableFive scenario records, console and network evidence, visible fallback captures

For GA4 implementations, DebugView shows events and their parameters in real time after debug mode is enabled, subject to privacy and consent controls.[7] Reconcile the browser log, transport request and receiver view. A green debugger row alone does not prove the event fired once, carried the right identity or joined to the intended product state.

The page thresholds come from current Core Web Vitals guidance.[8] The 5-second viewer-ready gate, five-run method, 20-attempt reconciliation and control-task thresholds are editorial starting points. Replace them before testing when the product, audience network or risk needs another bar. Never move them after seeing a failure without recording the decision.

Separate observed association from causal evidence

Viewer users select themselves. They may already be more interested, have a compatible device, choose a higher-consideration product or spend longer on the page. A commerce rate among users who opened 3D is descriptive, even when the difference is large.

Use an evidence ladder:

  1. validate instrumentation and reliability;
  2. report eligible cohorts by offered, opened, ready and meaningfully used states;
  3. compare commerce progression with the same eligibility, product and time definitions;
  4. run a controlled experiment when the decision requires an incremental estimate.

For that experiment, randomize eligible sessions before 3D assets download. Keep product content, offer placement and commerce behavior equal apart from the treatment. Define one primary commerce metric, viewer-ready and error guardrails, page-performance guardrails, exclusions, minimum runtime and decision rule before reading results. Analyze the assigned groups, not only the treatment users who chose to open the viewer. Publish uncertainty and negative findings. The method earns a causal interpretation; an interaction segment does not.

Adjustable desk lamp between a self-selected, uneven cohort and a preassigned, balanced test cohort, with no outcome or winner shown.
Observed viewer users describe behavior; only a controlled assignment can support an incremental estimate.

Keep browser, commerce and AR outcomes separate

A browser viewer event cannot prove an external AR runtime completed. The current <model-viewer> documentation limits detailed ar-status states to WebXR sessions, except for a failure emitted when all requested modes fail to start.[1] Record viewer_ar_request as intent, then use destination-specific evidence for launch, placement and exit where the destination can return it. State missing telemetry instead of converting an unavailable callback into success.

The planned automotive AR commerce guide owns configurator, parts and dealer use cases. Its outcomes still need separate eligibility and destination definitions; they should not inherit a browser-viewer pass.

The Private GLB Readiness Checker inspects and previews a selected self-contained GLB locally in the browser. The selected self-contained GLB remains local. It reports four separate destinations: Online store, Shopify, Product customizer and Android AR. A successful browser preview does not prove destination compatibility or performance. The optional editable Excel QA workbook is a secondary handoff resource, not the main experience.

Use the checker findings to prepare the file and destination tests in the measurement plan. If the viewer itself needs a managed product route, review Double Edged interactive 3D products with the event contract, exact asset and acceptance profile already defined. That keeps the commercial conversation attached to a testable brief rather than a promised lift.

Sources

  1. Examples and DocumentationGoogle model-viewer · accessed August 31, 2026
  2. User TimingWorld Wide Web Consortium · accessed August 31, 2026
  3. Resource TimingWorld Wide Web Consortium · accessed August 31, 2026
  4. Event Timing APIWorld Wide Web Consortium · accessed August 31, 2026
  5. Custom eventsGoogle Analytics Help · accessed August 31, 2026
  6. Measure ecommerceGoogle Analytics for Developers · accessed August 31, 2026
  7. Monitor events in DebugViewGoogle Analytics Help · accessed August 31, 2026
  8. Web Vitalsweb.dev · accessed August 31, 2026