Apps can affect loading, interactivity, and layout stability—but so can themes, images, analytics tags, and custom code. The goal is not to find the largest file. It is to identify a controllable cause without breaking something that earns money.

1. Start with the symptom, not the app count

Open Shopify’s performance summary from Online Store → Themes, or search the Reports list for Largest Contentful Paint, Interaction to Next Paint, and Cumulative Layout Shift. Record the weak metric, device type, affected page group, and date range.

Shopify’s current report uses real-user data, can connect trend changes with app installs, theme updates, and new code, and may lag by up to 36 hours. That makes it better for direction and change history than for an immediate after-click result.

Official source: Shopify web performance reports ↗

WRITE THIS DOWN

“Product pages on mobile moved from Good to Poor INP after August 4” is testable. “We have too many apps” is not.

2. Fix the test pages and conditions

Choose one representative home page, product page, and collection page. Save the exact URLs. Use the same browser profile, viewport, throttling, cache setting, and test location for every comparison. Run each page several times and compare the median—not the best or worst result.

This page set follows Shopify’s own storefront-app testing model, which measures home, product, and collection pages before and after an app change. Shopify weights product and collection pages more heavily in its app-performance calculation, so do not let a fast homepage hide a weak shopping path.

Official source: Shopify storefront performance testing ↗

3. Record the requests before you diagnose them

  1. Open the storefront page in Chrome.
  2. Open DevTools and select Network.
  3. Enable Disable cache while DevTools is open.
  4. Reload the page and interact with the feature you are testing.
  5. Filter for JS, then review Domain, Size, Time, and Initiator.
  6. Save a sanitized HAR only if you need to share or compare the trace; review it before sending.

Chrome can show request initiators and dependencies, timing breakdowns, transferred and uncompressed sizes, and the JavaScript stack that caused a request. Those signals are much stronger than guessing from a filename.

Official source: Chrome DevTools Network reference ↗

OPTIONAL CONSOLE HELPERInventory external resource hosts
(() => {
  const currentHost = location.hostname;
  const rows = performance.getEntriesByType("resource")
    .map((entry) => {
      const url = new URL(entry.name);
      return {
        host: url.hostname,
        type: entry.initiatorType || "other",
        transferKB: Math.round((entry.transferSize || 0) / 1024),
        durationMS: Math.round(entry.duration),
        path: url.pathname.slice(0, 90)
      };
    })
    .filter((row) => row.host !== currentHost)
    .sort((a, b) => b.transferKB - a.transferKB);

  console.table(rows);
  return rows;
})();

This reads resource timing already visible in your browser and prints a local table. It sends nothing to MerchantTrim or any third party. A hostname is a lead, not proof that a specific app caused a performance problem.

4. Map each suspect to an owner

Create a short table with request host, resource path, initiator, page, likely owner, and confidence. Match it against installed and previously uninstalled apps, theme app embeds, theme code, pixels, tag managers, and consent tooling.

SIGNALWHAT IT PROVESNEXT CHECK
Vendor hostname

A service handled the request

Match vendor, product, path, and initiator

Theme file initiator

Theme code started the request

Search the duplicate theme and recent edits

App embed toggle

A theme extension may control loading

Disable only in a safe test and repeat

Before/after median

The change correlates with the result

Repeat and check the real-user trend

A third-party host does not automatically identify an app, and transfer size does not equal main-thread cost. Record uncertain ownership as uncertain.

5. Change one reversible variable

Use a duplicate theme or a controlled low-risk window. Disable one app embed, integration, or optional feature—not the whole stack. Repeat the same page set and conditions. If the app supports page-specific loading, test that configuration before removal.

For weak INP, Shopify specifically points merchants toward excessive JavaScript from theme code, app code, or third-party/tag-manager code. The correct action is to clean up the verified offender, not assume every installed app participates in the storefront.

Official source: Shopify performance troubleshooting ↗

6. Make the business decision

Performance impact is one line in the app’s total-cost record. Add subscription, setup, maintenance, overlap, exit risk, and the verified revenue or labor value. Keep a slower app if it demonstrably earns more than the cost and no lighter implementation preserves the outcome. Remove or replace it when the job is weak, duplicated, or unmeasured.

7. Remove without creating a second problem

Before uninstalling, export needed data, list dependent workflows, note app-managed inventory, confirm whether billing occurs outside Shopify, and read the developer’s removal instructions. Shopify warns that some app code can remain in a theme and that app data or settings may not return after reinstalling.

Official source: Shopify app uninstall guidance ↗

FREE OPERATING ASSET

Put the evidence beside the bill.

Download the inventory workbook and record owner, cost, job, dependencies, and keep/remove decision.

Get the workbook

Questions merchants ask

Does every external script come from a Shopify app?

No. Themes, analytics pixels, tag managers, consent tools, Shopify services, and apps can all create external requests. Use the request initiator, installed-app list, theme search, and vendor documentation together.

Can one Lighthouse run prove an app is slow?

No. Lab results vary. Repeat the same page and conditions, compare medians, and use Shopify's real-user Web Vitals report when enough traffic exists. Treat a score change as evidence to investigate, not a verdict by itself.

Should I uninstall the heaviest script immediately?

Usually not. First confirm the owner, business job, dependencies, data export, billing path, and a reversible test. A large resource may be valuable, and a small script can still create costly main-thread work.

Disclosure and limits

This guide contains no affiliate links. It is an editorial diagnostic method, not a substitute for a qualified developer working on production theme code. MerchantTrim does not receive your console output, HAR files, store URL, or test results.