StoreToNative

Description

StoreToNative connects your WooCommerce store to the StoreToNative platform so it can power a native iOS and Android app built from your catalog. This companion plugin runs entirely on your own site and only does five things:

  • 1-click connect. Paste a short pairing code from your StoreToNative console into this plugin. No OAuth redirect, no “approve this application” screen to trip over on security-hardened sites.
  • Deep-link hosting. Serves .well-known/apple-app-site-association and .well-known/assetlinks.json from your store’s own domain, which is what iOS Universal Links and Android App Links require. These files must be served from your domain — a plugin is the only way to do that without touching your host’s file system by hand.
  • Smart app-install banner. Once your app exists, shows a lightweight, bundled-JS install banner to shoppers browsing your storefront in a mobile browser, plus an apple-itunes-app meta tag so Safari’s own native banner takes over on iOS.
  • Store readiness checks. Looks over your own WooCommerce settings for the dozen things that quietly break a mobile app — “Coming soon” mode still switched on, no payment method enabled, Plain permalinks, no shipping zone, a stale product price index — and tells you what each one costs you and exactly which screen to fix it on. The checks read only your own site and run entirely inside WordPress.
  • Shopper sign-in. Lets a shopper sign in to your native app with their existing WooCommerce account (email + password). This runs entirely between your site and its own app over REST routes this plugin registers — it never involves the StoreToNative platform at all, and your shoppers’ passwords are checked by WordPress itself, exactly as they are on your website’s own login form.

No network requests of any kind are made until you explicitly pair your store — see “External services” below for exactly what is sent, and when.

Requirements

  • WooCommerce must be installed and active. This plugin does nothing without it.
  • A StoreToNative account with a store already set up in the console (to generate a pairing code).

WooCommerce HPOS

This plugin declares compatibility with WooCommerce’s High-Performance Order Storage (HPOS / “Custom Order Tables”) feature. It does not read or write order data itself.

External services

This plugin connects to the StoreToNative platform (api.storetonative.com) to power your store’s native app. There is zero network activity before you explicitly pair your store — installing or activating this plugin alone sends nothing anywhere.

Pairing requires https. This plugin refuses to pair (and refuses to talk to the StoreToNative API at all) unless your store is served over https — see the FAQ below.

When you pair (entering a pairing code from your StoreToNative console into this plugin’s connect screen), the plugin sends, once:

  • Your store’s URL.
  • A WooCommerce REST API key/secret pair that this plugin generates for itself at that moment. It is a read/write key (a standard WooCommerce REST API key): the app needs to read your product catalog and to create and read orders that shoppers place through the app, on your behalf. You can revoke it at any time from the plugin’s Disconnect button or under WooCommerce Settings Advanced REST API.
  • This plugin’s version number and a short list of its own feature names (currently status, deep-links, smart-banner, readiness, shopper-auth, checkout-fields, pair-challenge — which parts of the plugin are active, not any data those features touch).

While that pairing request is in flight, the StoreToNative platform makes one request BACK to your site to confirm the pairing really came from it and not from someone who merely learned your code: it asks a public read-only route this plugin registers (storetonative/v1/pair-challenge) to sign a random value with the pairing code you just typed. The answer is a single one-way HMAC digest — the pair-challenge feature sends nothing anywhere itself (the code is sent to StoreToNative only inside your own pairing request above, never in this answer), and the route answers “nothing in progress” at every other moment. This is what stops a stranger with a StoreToNative account from attaching their own app to your store’s address.

After pairing, the plugin sends a small heartbeat so your StoreToNative console can show the connection is healthy — roughly once a day, once immediately after pairing, at most once every 12 hours while you work in wp-admin, at most once a minute while you have this plugin’s own screen open, and once each time you press Check connection on it. Every one of those carries the same thing:

  • This plugin’s version, its feature-name list (the same seven names above), your WordPress version, and your WooCommerce version.
  • Whether your store’s WooCommerce customer account registration setting is switched on (true/false only) — this is what lets the app decide whether to offer shoppers a sign-up option alongside sign-in.
  • The result of the store readiness checks, as a short list of check names paired with a one-word verdict — for example payment_gateway: fail, guest_checkout: warn, permalinks: pass. Names and verdicts only: no counts, no product names, no URLs, no settings values, and no text of any kind that you or anyone else typed into this site. The wording you read on the readiness card is stored in the plugin and in the console, never sent between them. This is what lets your console show you the same warnings without anyone having to log in to your store. It is only ever sent after you have paired, and only the thirteen fixed check names this plugin ships with can appear.

The checkout-fields feature sends nothing anywhere. Like the shopper-auth name above, it is only ever REPORTED to the console so it knows this plugin build supports it. What it does is serve a read-only route on your own site that describes the shape of your checkout form — your field labels, which fields you have marked required, which countries you sell to, and the state/governorate lists WooCommerce already has for them. The app reads it so its native checkout screen asks for exactly what your own checkout page asks for. It contains no orders, no customers, no prices, no settings values and no secrets; every value in it is already visible to any visitor who opens your checkout page. It is a read-only route: nothing about it writes to your store, and it never sends anything to api.storetonative.com.

Shopper sign-in never reaches the StoreToNative platform. The shopper-auth feature name above is only ever REPORTED to the console (so it knows this plugin build supports sign-in); the sign-in requests themselves — a shopper’s email and password — go directly from the app to your own site’s REST API and nowhere else. This plugin checks them the same way your website’s own login form does (WordPress’s own wp_authenticate()), and issues the app a signed token it can use to prove who’s asking on later requests. A shopper’s password and that token never leave your site — neither is ever sent to api.storetonative.com. Signing in, signing out and resetting a password send nothing about the shopper there at all; there is exactly one moment when anything identifying a shopper is sent, and it is the next paragraph.

When a shopper deletes their own account — the “Delete account” option in the app, which asks for their password again before it will proceed — this plugin erases that account here on your site: it runs WooCommerce’s own personal-data erasers (honouring the retention settings you’ve configured), then deletes the WordPress user. It then sends one signed notification to api.storetonative.com so StoreToNative can delete its own copy of that shopper’s sign-in record, which it keeps to know which app installs belong to which account. That notification carries exactly three things:

  • A one-time id for the notification itself (so a repeat of the same notice can be recognised and ignored).
  • The numeric WordPress user id of the account that was just deleted.
  • A one-way SHA-256 hash of that account’s email address — not the address itself.

No password and no token are included, and nothing else about the shopper is. It is sent only after the shopper themselves asks for the deletion, and it is the only notification this plugin ever sends that refers to an individual shopper.

Disconnecting from the StoreToNative menu (without uninstalling) sends one more signed notification so the console can mark the store as disconnected — it carries no data beyond that notice. Separately, the plugin periodically fetches (never sends) a small public configuration document — your app’s name, theme color and icon, install-banner text — used to keep the deep-link files and install banner up to date; that request carries no store or site data at all.

Apart from the account-deletion notification described above, no other data — no order data, no content, and nothing else about any customer — is ever sent by this plugin. This use of an external service is governed by StoreToNative’s Terms of Service and Privacy Policy.

Installation

  1. Upload the plugin to /wp-content/plugins/, or install it directly from the WordPress plugin directory.
  2. Activate the plugin through the “Plugins” screen in WordPress. WooCommerce must already be installed and active.
  3. Go to the new “StoreToNative” menu in your wp-admin sidebar.
  4. Open your StoreToNative console, generate a pairing code for this store, and enter it on the connect screen.
  5. Read the Store readiness card and fix anything it flags — it works before you pair, too.
  6. Once paired, the dashboard shows your app’s connection status, deep-link readiness, and the smart banner toggle.

FAQ

Do I need a StoreToNative account?

Yes. This plugin pairs your store with a StoreToNative account and console — it isn’t a standalone app builder.

Does this send data before I connect?

No. Installing or activating this plugin makes zero network requests. The very first request it ever makes is the pairing request, and only after you’ve pasted a pairing code into the connect screen yourself. See “External services” above for exactly what that first request contains.

Does it work without HTTPS?

No. This plugin refuses to pair — and therefore never talks to the StoreToNative API at all — unless your store itself is served over https. That check happens locally, before any network request is made, so a plain-http site can’t even attempt it.

Pairing fails with “could not confirm this site” (site_unverified) — what does that mean?

During pairing, the StoreToNative platform makes one request back to your site — https://your-store/wp-json/storetonative/v1/pair-challenge — and your site has to answer it while the pairing request is still running. That fails on four kinds of setups: a security plugin, firewall or WAF that blocks anonymous requests to the WordPress REST API (allow that one route, or the StoreToNative platform’s requests); a host that runs a single PHP worker, which cannot answer a second request while the first is waiting (the built-in php -S development server is the usual case — production hosts run several); an object cache that is private to each PHP process, so the worker answering the call cannot see what the pairing worker stored; and a host so slow that a fresh request takes more than ten seconds to answer. The code you typed is spent either way — generate a fresh one after fixing the cause.

What happens if I deactivate WooCommerce?

The plugin shows an admin notice explaining that WooCommerce is required and does not register any of its other functionality until WooCommerce is active again.

What happens if I uninstall the plugin?

Uninstalling removes all of this plugin’s local data (pairing, settings, cache, and the WooCommerce API key it created for itself) and stops your store from syncing with your native app. It does not make any remote request — your StoreToNative console will simply notice the store has gone quiet the next time it checks in. Reconnecting later starts a fresh pairing.

Does this work on WordPress multisite?

This has not been tested on a multisite installation. Use on multisite at your own risk until this is verified.

Is this compatible with WooCommerce’s High-Performance Order Storage (HPOS)?

Yes, compatibility is explicitly declared. The plugin does not read or write order data.

Reviews

Gwynngala 6, 2026
Honestly, this plugin saved me hours of head-scratching. Setting up deep links and API permissions usually makes me want to pull my hair out, but pasting the pair code literally took five seconds. The readiness check caught a misconfigured permalink setting that would’ve definitely broken my mobile catalog before launch. Highly recommend it if you’re building an app with StoreToNative—it just works without messing up your store.
Read all 1 review

Contributors & Developers

“StoreToNative” is open source software. The following people have contributed to this plugin.

Contributors

Translate “StoreToNative” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

1.5.2

  • New: once your store is connected and checking in, the dashboard shows a small card asking for a wordpress.org review, with a “No thanks” that hides it for good. It appears only while the connection is healthy, sends nothing anywhere, and offers nothing in return.

1.5.1

  • This is the first directory release after 1.4.1 and carries everything in 1.5.0 below. It also keeps both 1.4.1 fixes (the account-deletion re-authentication check and the dismissible deep-link notice), which the 1.5.0 build served from the StoreToNative console did not include.

1.5.0

  • Security: Pairing now proves it came from your site. While your pairing request is in flight, the StoreToNative platform makes one request back to a new read-only route on your site (storetonative/v1/pair-challenge) and your site answers with a one-way digest computed from the code you typed. Before this, anyone with a StoreToNative account who learned — or guessed at — your store’s address could attach their own app to it; now only the site itself can complete a pairing (older plugin versions, until this plugin’s 1.6 release, are instead checked by proving that the WooCommerce key they created can write to the store). Nothing new is sent to StoreToNative; see “External services”.
  • New: pair-challenge added to the plugin’s reported feature list.
  • Changed: the pairing request’s timeout is now 25 seconds (it has to wait for the round trip above); every other request keeps its 10 seconds.
  • New: a clearer error on the connect screen when that round trip fails, naming the things that usually block it; and a second Connect pressed while one is still running is refused without spending your code.

1.4.1

  • Security: account deletion now re-checks who was actually re-authenticated. The “Delete account” flow asks for the shopper’s password again before it will proceed. It previously accepted any successful re-authentication; on a site running a plugin that filters WordPress’s authentication (single sign-on, social login), that could be a different account than the one the request was for. It now requires the re-authentication to come back as the same account the request is deleting, and refuses otherwise. Sign-in was hardened the same way.
  • Fix: the notice warning that a file on your server is shadowing a deep-link file can now be dismissed, like the plugin’s other admin notices.

1.4.0

  • New: Downloadable-product check. The readiness card now warns when your catalogue contains products marked Downloadable — including the variations of a variable product. Apple and Google both require digital content to be sold through their own in-app purchase systems rather than your website checkout, and an app that sells it through the web checkout is rejected by both stores. The check deliberately ignores the Virtual box: in WooCommerce that means “no shipping required”, not “digital”, so appointments, bookings, classes, repairs and deliveries tick it — and both stores exempt real-world services. A service business is never flagged here. Setting a product’s Catalog visibility to Hidden clears it from this check, though note that also hides it from your own website shop. This is a warning, not a blocker.

1.3.0

  • New: Checkout fields. The plugin now serves a read-only route describing the shape of your own checkout form — your field labels, which fields you have marked required, which countries you sell to, and the state/governorate lists WooCommerce already has for them — so the app’s native checkout screen asks for exactly what your own checkout page asks for, instead of a generic address form. It sends nothing anywhere; see “External services”.
  • New: checkout-fields added to the plugin’s reported feature list.

1.2.1

  • Fixed: after re-connecting this store to a different StoreToNative app, the deep-link files (apple-app-site-association / assetlinks.json) could keep serving the previous app’s identity for up to 12 hours from cache. The cache is now cleared whenever the connection changes, so a fresh connection always serves fresh files.

1.2.0

  • New: Shopper sign-in. The native app can now sign a shopper in with their existing WooCommerce account (email + password), entirely through REST routes this plugin registers on your own site — no sign-in request, password or token ever reaches the StoreToNative platform. See “External services” for exactly what that involves.
  • New: Shoppers can delete their own account from the app. The plugin re-checks their password, runs WooCommerce’s own personal-data erasers (honouring your retention settings), deletes the WordPress user, and then sends StoreToNative a single signed notification so it can delete its own sign-in record for that shopper. That notification carries a one-time id, the deleted WordPress user id, and a one-way hash of the email address — never the address itself, never a password or token. It is the only thing this plugin ever sends that refers to an individual shopper; see “External services”.
  • New: shopper-auth added to the plugin’s reported feature list.
  • New: whether your store allows customer account registration is now included in the existing heartbeat (true/false only — see “External services”), so the app knows whether to offer sign-up.

1.1.0

  • New: a Store readiness card on the StoreToNative screen. Twelve checks over your own WooCommerce configuration — “Coming soon” mode, HTTPS, published products, payment methods, permalinks, the product price index, shipping zones, guest checkout, the checkout page, your site icon, conflicting swatch plugins, and WordPress/WooCommerce/PHP versions — each explained in plain language with what it costs you and which screen to fix it on. Blocking problems come first, warnings next, everything that passed is tucked away.
  • New: the card also renders before you connect, so you can fix your store first.
  • New: a one-click Rebuild price index button for a stale product lookup table, which asks WooCommerce’s own tool to do the work in the background.
  • New: your store’s readiness results (check names and one-word verdicts only — see “External services”) are included in the existing daily heartbeat, so your console shows the same warnings.
  • New: readiness added to the plugin’s reported feature list.
  • Fix: the StoreToNative screen could keep showing “Connected” for up to half a day after the app was deleted or unpaired in your console. Opening this plugin’s own screen now re-checks the connection (at most once a minute, and only there — no other wp-admin page checks any more often than before), and a new Check connection button on the connection card checks on the spot. Nothing new is sent: it is the same check-in the plugin already made, just sooner.

1.0.0

  • Initial release: 1-click pairing with the StoreToNative console, .well-known deep-link hosting for iOS Universal Links and Android App Links, a smart mobile install banner, and a periodic heartbeat that reports connection health back to your console.