Shopify CLI 4.0: What Developers Need to Know — Semantic Versioning, Automatic Updates, and Safer App Releases

Shopify CLI 4.0: What Developers Need to Know — Semantic Versioning, Automatic Updates, and Safer App Releases

Table of Contents

  1. Key Highlights:
  2. Introduction
  3. What Shopify CLI 4.0 changes at a glance
  4. Semantic versioning: clearer compatibility guarantees and how to use them
  5. Automatic upgrades: how they work and how to control them
  6. Removing the --force flag: context, risk, and safer alternatives
  7. Other removed commands and their replacements
  8. Migration strategy and CI/CD examples
  9. Practical examples and patterns
  10. Best practices for safe app releases
  11. Troubleshooting and rollback strategies
  12. Why these changes improve long-term developer experience
  13. FAQ

Key Highlights:

  • Shopify CLI 4.0 adopts semantic versioning and adds automatic in-place upgrades, while skipping upgrades in CI, project-local installs, and during major-version changes.
  • The deprecated --force flag for app deploy/release has been removed; use the more granular --allow-updates and --allow-deletes flags. Several other deprecated commands and flags have been replaced with clearer alternatives.

Introduction

Shopify released CLI 4.0 to clarify how the tool evolves and to reduce accidental, high-risk changes during app deployments. The update formalizes versioning, introduces automatic upgrades tied to the package manager used at installation, and tightens safeguards around app releases by removing the blunt-force --force flag. For teams that automate builds and deployments, these changes alter the default operational risk profile and require updates to CI/CD pipelines and developer workflows.

This article explains what changed, why it matters, and how to adapt build scripts and release processes. Detailed migration steps, command examples, CI configuration patterns, and defensive practices are included to help engineering teams adopt CLI 4.0 safely and confidently.

What Shopify CLI 4.0 changes at a glance

Shopify CLI 4.0 bundles three categories of changes that affect developer ergonomics and automation:

  • Versioning discipline: The CLI now follows semantic versioning (SemVer). New features will appear in minor version bumps, bug fixes in patch releases, and breaking changes will be signaled by major releases.
  • Automatic upgrades: The CLI can upgrade itself automatically using the package manager used for installation. Auto-upgrades are skipped when running in continuous integration (CI), for project-local installs, and for major-version updates. Auto-upgrades are opt-out via configuration.
  • Safer app release behavior: The --force flag for shopify app deploy and shopify app release has been removed. Replace it with targeted controls — --allow-updates and --allow-deletes — so CI pipelines can perform low-risk operations unattended while preventing accidental destructive changes.

Additionally, a set of deprecated commands and flags were removed and replaced by clearer alternatives (for example, shopify theme serve → shopify theme dev, shopify webhook trigger → shopify app webhook trigger).

The practical effect: fewer surprises when the CLI changes behavior, fewer silent destructive operations in automated pipelines, and a clearer path for teams to manage CLI updates.

Semantic versioning: clearer compatibility guarantees and how to use them

Shopify CLI now follows semantic versioning conventions. That shifts both expectation and practice for maintainers relying on the tool.

What SemVer means here

  • Versions are in the form MAJOR.MINOR.PATCH (for example, 4.0.1).
  • Patch releases (x.y.Z) are for bug fixes and should not change command behavior.
  • Minor releases (x.Y.z) add features while keeping backward compatibility for existing commands.
  • Major releases (X.y.z) signal breaking changes in command structure or behavior that may require code or script updates.

Why this matters to teams

  • Predictability: When a minor or patch release appears, scripts and automation can be trusted not to break in unexpected ways.
  • Planning: Major-version bumps become the explicit signal that automated processes and developer habits may need review and migration.
  • Release communication: Changelogs aligned to SemVer allow teams to triage upgrade urgency and potential impact.

Recommended versioning practices for teams

  • Pin major version in CI: Ensure CI installs a CLI version constrained to the current major release (for example, ^4.0.0 or ~4.0.0 depending on your policy) to avoid surprise breaking changes from a future major release. Automatic upgrades in the CLI itself are skipped for major releases, but the package manager used in CI might pull a new major unless constrained.
  • Use lockfiles for reproducibility: If you installed the CLI with a package manager that uses a lockfile (for example, npm/yarn), commit lockfiles and install exactly the versions you have tested.
  • Test minor upgrades in staging first: If you allow minor upgrades, run them in a staging environment to validate compatibility before letting them reach production processes.

Examples

  • A patch: 4.0.1 — bug fixes, no changes to command signatures are expected.
  • A minor: 4.1.0 — adds a new command or feature while preserving the existing CLI surface.
  • A major: 5.0.0 — could change argument names, remove flags, or change CLI defaults that would break automation.

SemVer makes it easier to make decisions about whether to accept upgrades automatically or gate them through testing and manual approvals.

Automatic upgrades: how they work and how to control them

CLI 4.0 introduces automatic self-upgrades that use the same package manager you used to install Shopify CLI. The intent is to make staying up to date easier while avoiding upgrades where they could interrupt automation.

How automatic upgrades behave

  • The CLI attempts to upgrade itself using the package manager used for installation (for example, Homebrew on macOS, apt on Linux, or npm/yarn when installed via Node tooling).
  • Auto-upgrade is intentionally skipped in CI environments, for project-local installs, and for major version updates to avoid breaking automation.
  • You can disable auto-upgrade globally via a configuration command: shopify config autoupgrade off. Re-enable with shopify config autoupgrade on.

Why Shopify skips auto-upgrades in CI and project-local installs

  • CI pipelines must be deterministic. An unexpected CLI upgrade during a build can change behavior and break deployments.
  • Project-local installs often aim to ensure a specific toolchain version for reproducible builds; auto-upgrading would defeat that purpose.
  • Major-version upgrades are skipped to prevent breaking changes from being applied automatically; that remains a deliberate, manual decision.

Operational implications and recommendations

  • Local development: Enable auto-upgrade locally to benefit from bug fixes and minor features quickly. That reduces the maintenance burden on developers while keeping CLI functionality current.
  • CI: Keep auto-upgrade disabled in CI. Even though the CLI auto-upgrade is skipped in CI by default, ensure the environment's package manager is configured to install a constrained version to prevent accidental major upgrades.
  • Project-local installs: Maintain a policy of using a project-local CLI only when you want strict reproducibility. If you use a project-local install, expect auto-upgrade to be skipped; update your lockfiles or scripts deliberately.
  • Security: Auto-upgrades speed the delivery of security fixes. For local developers, enabling auto-upgrades reduces the window during which a known vulnerability exists on developer machines.

Practical controls

  • Disable auto-upgrade (global): shopify config autoupgrade off
  • Re-enable auto-upgrade (global): shopify config autoupgrade on
  • Verify the current CLI version: shopify version or shopify --version

Note on package managers The CLI relies on whichever package manager installed it. Common installation paths include:

  • Homebrew (macOS): brew install shopify-cli or brew upgrade shopify-cli
  • apt or other Linux package manager: apt install shopify-cli or equivalent
  • npm / yarn: npm install -g @shopify/cli or yarn global add @shopify/cli

Auto-upgrade behavior aligns with the semantics of the package manager, so teams should understand how their package manager resolves versions before trusting automatic upgrades.

Removing the --force flag: context, risk, and safer alternatives

The blunt --force flag made unattended releases easier but also created high-risk scenarios. It allowed app deploy and app release to make destructive changes — including deleting extensions — without distinction. Shopify CLI 4.0 removes that option and replaces it with more deliberate controls.

Why --force was problematic

  • Lack of granularity: --force bundled different actions under one override, meaning a single flag might permit both low-risk updates and irreversible deletes.
  • Silent destructive changes: In CI or scripted deployments, a misplaced --force could remove an extension or other resource without intervention, potentially breaking live stores or losing data.
  • Difficult to audit and test: The binary nature of the flag made it hard to reason about what would change in any given release step. That reduced confidence in fully automated pipelines.

New alternatives: --allow-updates and --allow-deletes

  • --allow-updates: Opt in to updating existing extensions or resources without requiring manual approval.
  • --allow-deletes: Opt in to deleting extensions or resources as part of the release process.

These flags allow pipelines to separate routine publish/update operations from destructive delete operations. Use cases:

  • Fully automated, low-risk pipelines: Use --allow-updates but not --allow-deletes so routine publishing proceeds unattended while deletes require manual steps.
  • Controlled destructive releases: Include --allow-deletes only in a protected release job that requires human approval (for example, a protected GitHub Actions workflow requiring a manual approval step) or a scheduled maintenance window.

Command examples

  • Update-only release: shopify app release --allow-updates
  • Update and delete (explicit): shopify app release --allow-updates --allow-deletes

Replacing --force in existing scripts

  • Find occurrences of --force in your repositories and CI configuration:
    • Unix grep example: grep -R --line-number "shopify .*--force" .
  • Replace with one or both new flags depending on intent.
    • Routine update example: replace --force with --allow-updates
    • Intentional delete example: explicitly add --allow-deletes in a pipeline stage protected by manual approval

Real-world scenario: preventing accidental deletion A team automated their app release in a CI pipeline and used --force to ensure deployments never hung on prompts. An accidental removal of an extension in the app repository caused the pipeline to delete the corresponding extension in production storefronts. With --allow-updates but not --allow-deletes, the same pipeline would have published the updates but refused to perform deletions, surfacing the change for manual review and preventing a production outage.

Guidelines for safe adoption

  • Default pipelines: Use --allow-updates only.
  • Deletes: Run delete-capable releases in a job that requires a human review or an approval step.
  • Audit logs: Ensure your pipeline logs what changes the CLI intends to make before applying them. If possible, run a "preview" or dry-run step to list changes. (If the CLI does not offer a built-in dry-run, script a check that compares the extension set between branches or uses the Shopify API to detect mismatches.)
  • Backups: Keep a copy of extension source code and relevant configurations in version control and archive releases, so recovery from accidental deletions is possible.

Other removed commands and their replacements

Shopify CLI 4.0 removed several older commands and flags in favor of clearer, more consistent alternatives. Replace deprecated usage in scripts and local shortcuts to avoid breakage.

Removed → Replacement

  • shopify webhook trigger → shopify app webhook trigger
    • Rationale: Namespacing webhook operations under app makes intent explicit.
    • Example replacement: shopify app webhook trigger --address https://example.com/webhooks --topic ORDERS_CREATE
  • shopify theme serve → shopify theme dev
    • Rationale: "dev" communicates the local development intent more consistently across CLI tooling.
    • Example replacement: shopify theme dev
  • shopify app generate schema → shopify app function schema
    • Rationale: Function-specific schema generation moved under app function.
    • Example replacement: shopify app function schema --path path/to/function
  • shopify app webhook trigger --shared-secret → shopify app webhook trigger --client-secret
    • Rationale: Flag name aligns with modern authentication terminology and distinguishes webhook shared secrets from client secrets used in OAuth flows.
    • Example replacement: shopify app webhook trigger --client-secret $CLIENT_SECRET --topic PRODUCTS_UPDATE
  • shopify app generate extension --type → shopify app generate extension --template
    • Rationale: Template better describes the starting point for generated extensions.
    • Example replacement: shopify app generate extension --template=checkout_ui_extension --name=my-extension

Migration checklist

  • Search and replace: Use repository-wide search to find deprecated CLI invocations and update them.
  • CI jobs: Update job steps and re-run pipeline to validate no syntax or behavior changes.
  • Local developer docs: Update README files and developer onboarding notes to reflect new commands.
  • Alias and wrappers: If you rely on shell aliases or wrapper scripts, update them or remove indirection to reduce maintenance.

Command search examples

  • Find all instances of removed commands: grep -R --line-number "shopify .*theme serve" .
  • Replace with sed for batch changes (exercise caution; validate with git diffs): git ls-files | xargs sed -i 's/shopify theme serve/shopify theme dev/g'

Migration strategy and CI/CD examples

Moving to CLI 4.0 in a controlled way requires coordinated changes across developer machines, CI, and documentation. The following sections propose a migration plan and provide concrete CI configuration patterns.

Migration plan (suggested)

  1. Inventory: Identify all places the CLI is invoked: local scripts, CI pipelines, developer docs, scheduled tasks.
  2. Search for deprecated flags/commands: Use automated search tools to find instances of --force and other deprecated forms.
  3. Update scripts: Replace deprecated commands with the new forms and replace --force with the correct combination of --allow-updates and/or --allow-deletes.
  4. Lock CLI versions in CI: Configure CI to install a pinned or constrained CLI version and verify builds.
  5. Test in staging: Run full CI workflows against a staging store. Validate that releases do not perform unwanted deletions.
  6. Protect destructive steps: Require manual approvals for jobs that pass --allow-deletes.
  7. Enable developer auto-upgrades: Allow auto-upgrade on local machines to capture fixes and small improvements.
  8. Update documentation: Refresh onboarding and runbooks with new command names and operational guidance.

Example: GitHub Actions workflow for safe releases Below is a conceptual workflow that demonstrates protecting delete-capable deployments and ensuring deterministic CLI versions in CI. Replace placeholders with your own actions and secrets.

name: Release app on: workflow_dispatch: push: branches: - main

jobs: build: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4

  - name: Set up Node
    uses: actions/setup-node@v4
    with:
      node-version: '18'

  - name: Install Shopify CLI (pinned)
    run: npm install -g @shopify/[email protected]

  - name: Authenticate to Shopify
    run: shopify login --store ${{ secrets.SHOPIFY_STORE }} --api-key ${{ secrets.SHOPIFY_API_KEY }}

  - name: Run tests
    run: npm test

  - name: Release (update-only)
    run: shopify app release --allow-updates --message "Automated release - update only"
    env:
      SHOPIFY_API_KEY: ${{ secrets.SHOPIFY_API_KEY }}
      SHOPIFY_API_SECRET: ${{ secrets.SHOPIFY_API_SECRET }}

release-with-deletes: needs: build runs-on: ubuntu-latest if: github.event_name == 'workflow_dispatch' # only manual dispatch steps: - name: Checkout repository uses: actions/checkout@v4

  - name: Install Shopify CLI (pinned)
    run: npm install -g @shopify/[email protected]

  - name: Authenticate to Shopify
    run: shopify login --store ${{ secrets.SHOPIFY_STORE }} --api-key ${{ secrets.SHOPIFY_API_KEY }}

  - name: Manual approval check
    uses: chrnorm/deploy-approval@v1
    with:
      approvers: 'team-lead,ops'

  - name: Release (allow deletes)
    run: shopify app release --allow-updates --allow-deletes --message "Release with deletes"
    env:
      SHOPIFY_API_KEY: ${{ secrets.SHOPIFY_API_KEY }}
      SHOPIFY_API_SECRET: ${{ secrets.SHOPIFY_API_SECRET }}

Notes and rationale:

  • The build job performs routine updates without allowing deletes. This keeps everyday pipeline runs low-risk.
  • The release-with-deletes job runs only after manual approval and is gated to manual workflow dispatches to avoid accidental deletions.
  • The CLI version is pinned to 4.0.0 in CI. Adjust the pinned version as you validate minor upgrades; avoid pulling an unconstrained version that might automatically install a new major release.

Example: GitLab CI snippet stages:

  • test
  • release
  • release_protected

variables: SHOPIFY_CLI_VERSION: "4.0.0"

before_script:

  • npm install -g @shopify/cli@${SHOPIFY_CLI_VERSION}

test: stage: test script: - npm ci - npm test

release: stage: release script: - shopify login --store $SHOPIFY_STORE --api-key $SHOPIFY_API_KEY - shopify app release --allow-updates --message "Update-only release from CI"

release_protected: stage: release_protected script: - shopify login --store $SHOPIFY_STORE --api-key $SHOPIFY_API_KEY - shopify app release --allow-updates --allow-deletes --message "Release with deletes" when: manual only: - main

This pattern uses CI-level pinning and a manual job for destructive operations.

Practical examples and patterns

Below are concrete examples illustrating how teams will work differently after 4.0.

Example 1: Single-step automated release becomes two-stage Before: A single CI job ran shopify app release --force making updates and deletions without oversight. After: Split into two jobs: an automated job that runs shopify app release --allow-updates and a manual approval job that runs shopify app release --allow-updates --allow-deletes if deletion is intended.

Example 2: Local developer convenience with auto-upgrade Developers enable auto-upgrade on their machines (shopify config autoupgrade on) so the CLI self-updates on login. They pin the CI install to a specific 4.x version to keep CI deterministic.

Example 3: Replacing deprecated commands in scripts Before: A test harness used shopify webhook trigger --shared-secret to simulate webhooks. After: Update harness to shopify app webhook trigger --client-secret and update test secrets accordingly.

Command conversion table

  • shopify webhook trigger --shared-secret => shopify app webhook trigger --client-secret
  • shopify theme serve => shopify theme dev
  • shopify app generate schema => shopify app function schema
  • shopify app generate extension --type=my_type => shopify app generate extension --template=my_template

Best practices for safe app releases

Adopt these practices to reduce operational risk and align with CLI 4.0 behavior.

  1. Separate update and delete workflows
    • Make deletions deliberate. Use a separate job with approval for --allow-deletes.
  2. Pin versions in CI and use lockfiles
    • Ensure deterministic installs. Pin the CLI package version or use a lockfile supported by your package manager.
  3. Maintain backups and versioned artifacts
    • Keep artifacts of releases and extension packages in an artifact repository. That simplifies rollbacks if a deletion or update has unexpected consequences.
  4. Keep local tools up to date
    • Enable CLI auto-upgrade on developer machines to capture bug fixes and small improvements that reduce friction during development.
  5. Add preflight checks
    • Add assertions that verify the set of extensions to be published matches expectations. For example, run a script that compares current extensions in the store with those in the repository.
  6. Document release policies
    • Add release runbooks that explain when to allow deletes, who signs off, and how to perform rollbacks.
  7. Audit and logging
    • Ensure CI logs the exact CLI command used and the environment variables. Keep these logs for incident investigation.
  8. Use feature previews for large changes
    • For major architectural changes, test in preview or staging stores before deploying to production.
  9. Continuous monitoring post-release
    • Monitor store health and extension functionality immediately after a release, especially if deletes were involved.

Troubleshooting and rollback strategies

Even with controls, problems occur. Prepare strategies to detect and recover.

Detecting issues

  • Monitor API error rates and store telemetry immediately after a release.
  • Check extension presence and health via Shopify admin APIs.
  • Use automated integration tests against a staging or preview store before promoting to production.

Rolling back updates

  • If a release created regressions but did not delete resources, you can typically publish a hotfix release with the previous working versions of affected extensions.
  • If artifacts are retained in your artifact store or Git history, redeploy the prior commit or re-publish a tagged artifact.

Recovering from deletions

  • If an extension or resource was deleted, recovery depends on the nature of the resource:
    • Source code: Restore from the VCS and re-create the extension.
    • Store metadata: If metadata is deleted and not restorable via APIs, rebuild from stored config files or backup exports.
  • Prevention is the best remedy: avoid production deletions without manual review and ensure backups and source control are authoritative.

How to roll back a CLI upgrade

  • If a CLI upgrade causes local issues, reinstall a previous version via your package manager:
    • npm example: npm install -g @shopify/[email protected]
    • Homebrew example: brew unlink shopify-cli && brew install shopify-cli@3 (Homebrew formula names and availability vary)
  • If the package manager cannot install older releases, download a release artifact (if available) from Shopify CLI release pages and install manually.

Investigative steps after a bad release

  1. Reproduce the issue locally using the same CLI version and the same release command.
  2. Inspect CI logs and the exact shopify app release command used (including flags).
  3. Compare the commit or artifact deployed to the last known good release.
  4. Consult Shopify CLI changelogs to see whether a change in minor/patch behavior could explain the issue.

Why these changes improve long-term developer experience

The changes in CLI 4.0 address two recurring pain points for developers and release engineers:

  • Unclear upgrade semantics: Moving to SemVer clarifies the risk associated with upgrades. Teams can adopt predictable policies for accepting or gating updates.
  • Overly broad destructive overrides: Replacing --force with two explicit flags prevents accidental destructive behavior and encourages explicit intent in automation.

Together, these changes encourage safer default behaviors while preserving the ability for power users and operators to perform deliberate destructive actions under controlled conditions.

FAQ

Q: How do I check my Shopify CLI version? A: Use shopify version or shopify --version. These commands report the installed CLI version and help you confirm you are running 4.0.x or later.

Q: What replaced the --force flag for app releases? A: Use --allow-updates to permit non-destructive updates and --allow-deletes to permit deletions. Add one or both depending on the intent of the release.

Q: Will Shopify CLI auto-upgrade itself in CI environments? A: No. Automatic upgrades are skipped in CI by design. That maintains deterministic builds. Also, auto-upgrade is skipped for project-local installs and for major-version releases.

Q: How do I disable automatic upgrades on my machine? A: Run shopify config autoupgrade off. Re-enable with shopify config autoupgrade on.

Q: What should I change in my CI pipelines after upgrading to CLI 4.0? A: Pin the CLI version you install in CI, update any scripts that used deprecated commands or flags (notably replacing --force), and split release workflows so deletes are gated by manual approvals or separate jobs.

Q: What are the main deprecated commands removed in 4.0 and their replacements? A:

  • shopify webhook trigger → shopify app webhook trigger
  • shopify theme serve → shopify theme dev
  • shopify app generate schema → shopify app function schema
  • shopify app webhook trigger --shared-secret → shopify app webhook trigger --client-secret
  • shopify app generate extension --type → shopify app generate extension --template

Q: How can I find all instances of removed commands in my repository? A: Use a repository-wide search tool such as grep or ripgrep:

  • grep -R --line-number "shopify .*theme serve" .
  • rg "shopify .*--force" -n

Q: Should I allow auto-upgrades for developers and for CI? A: Enable auto-upgrade for local developer machines to benefit from bug fixes and small improvements. Keep CI installations pinned and deterministic; auto-upgrade is skipped in CI by default but also configure your package manager to pin CLI versions.

Q: What are good rules for using --allow-deletes? A: Restrict --allow-deletes to protected jobs that require manual approval, run only against staging or during maintenance windows when possible, and ensure backups and artifact archives exist to reconstruct deleted resources if necessary.

Q: What steps should I take before applying a release that includes deletions? A: 1) Review changes and diff the set of extensions; 2) run a staging release to validate behavior; 3) require a human approval step in CI; 4) ensure you have backups and artifacts for recovery.

Q: How do major, minor, and patch releases affect commands? A: Patch releases (x.y.Z) should be bug fixes without behavioral changes; minor releases (x.Y.z) may add features but preserve existing commands; major releases (X.y.z) may introduce breaking changes in command structure or behavior and require migration effort.

Q: Where can I find the changelog for CLI releases and deprecations? A: Consult the Shopify CLI changelog and the Shopify developer documentation pages where deprecations and removals are announced. Pay attention to deprecation announcements before major releases.

Q: If my team used --force previously to avoid prompts, what alternatives exist now? A: Replace --force with flags that match the exact intent. For unattended, routine releases use --allow-updates. For destructive operations, require a protected job that explicitly includes --allow-deletes and a confirmation step.

Q: Can the CLI show what it will change before applying a release? A: If the CLI provides a dry-run or preview command, use it to inspect planned changes. If not, build a script that compares the current repository state with the store's state via the Shopify API or lists planned extension changes so a human can approve them before running the release.

Q: How can I roll back a CLI upgrade that causes problems? A: Reinstall a previous CLI version via your package manager (for example, npm install -g @shopify/cli@<version>) or restore a previously installed binary. If package managers do not provide older versions directly, consult Shopify CLI release archives for downloadable artifacts and follow your OS-specific installation procedures.

Q: Do these changes affect theme development commands? A: Yes. The old shopify theme serve command is removed; use shopify theme dev for local theme development.

Q: What immediate actions should teams take to prepare for CLI 4.0? A: Inventory CLI usage, search and replace deprecated commands, pin CLI versions in CI, split update and delete flows, and update onboarding docs for local developers to leverage auto-upgrade responsibly.


Adopting Shopify CLI 4.0 realigns CLI behavior with common expectations for modern developer tooling: clearer version semantics, safer defaults for automation, and more explicit controls for destructive operations. Teams that update scripts and CI flows, pin versions where reproducibility matters, and gate deletes with approvals will reduce risk and gain the benefits of a more predictable CLI lifecycle.

POWER your ecommerce with our weekly insights and updates!

Stay aligned on what's happening in the commerce world

Email Address

Handpicked for You

Shopify CLI 4.0: What Developers Need to Know — Semantic Versioning, Automatic Updates, and Safer App Releases

21 May 2026 / Blog

Shopify CLI 4.0: What Developers Need to Know — Semantic Versioning, Automatic Updates, and Safer App Releases
Read more
Shopify Revamps Customer Sign‑In Page: Two‑Column Layout, Custom Backgrounds, and API Control

20 May 2026 / Blog

Shopify Revamps Customer Sign‑In Page: Two‑Column Layout, Custom Backgrounds, and API Control
Read more

20 May 2026 / Blog

Shopify Cumulative Metrics: How Running-Totals Transform Goal Tracking, Comparisons and Dashboards
Read more