Privacy Policy
Ghost Code — Shopify Theme Audit App
Effective date: October 12, 2026
This Privacy Policy explains how Alpenglow Software LLC ("we," "us," "our"), operator of Ghost Code ("the App") collects, uses, stores, and protects information when you install and use the App through the Shopify platform.
1. Information We Collect
Data from Shopify APIs
When you install the App, we access the following through the Shopify Admin API using the read_themes scope:
- Theme files — Liquid templates, sections, snippets, and layout files from your published theme. We access these files in read-only mode to scan for orphaned code left by previously uninstalled apps.
- Theme metadata — Theme name, ID, and role (whether it is your published theme) to identify which theme was scanned; the theme's name, version and author as listed in the theme's own settings file, and whether it is an Online Store 2.0 theme; and how many unpublished themes your store has, shown in the App's theme health checklist.
- Store domain: your store's primary domain and myshopify.com domain, used to find your public storefront homepage (see below).
We do not request write access to your themes. We do not modify any theme files.
Optional scopes
You can grant additional read-only scopes from the Permissions card on the App's Settings page, or from the optional link on the App's home page before your first scan. Each one is requested through Shopify's consent screen, and the App does not access that data until you approve it. You can revoke these scopes at any time in your Shopify admin.
read_translations: translated content for your store, used to find orphaned translations left by uninstalled apps.read_locales: the languages enabled on your store, used together withread_translationsso the App knows which translations to check.read_products: product tags, prices and compare-at prices, and product metafields, used to find orphaned product tags, stale compare-at prices, leftover metafields, and structured-data (JSON-LD) prices in your theme that no longer match your live product prices.read_content: your online store pages, used to find orphaned pages and links to pages that no longer exist.read_online_store_navigation: your URL redirects, used to find orphaned redirects left by uninstalled apps.
If you do not grant a scope, the App skips the checks that depend on it.
Your public storefront homepage
When the App scans your published theme, our server loads your store's public homepage once per scan (again only if that step is retried after an error), the same page any visitor sees. If your homepage redirects, the App follows up to 3 redirects, and only to your primary domain or your myshopify.com domain. If it redirects anywhere else, the App skips this check. We use the page only for three things: to find the list of script addresses that Shopify adds for your installed apps ("script tags"); to find "missing snippet" Liquid error messages that Shopify has printed on the page (for example "Liquid error (layout/theme line 309): Could not find asset snippets/example.liquid"), which we report only when your theme files confirm the snippet is missing; and to confirm it is a Shopify page that is not password-protected. We do not read or keep any other text on the page. Our requests identify themselves with the User-Agent GhostCode/1.0 (+https://alpenglowsoftware.com). We do not log in, submit forms, or send cookies. We do not collect information about your visitors or customers. If your storefront is password-protected, the App does not try to get past the password page and skips this check. Before a store speed report, the App also loads your homepage once in the same way, only to check whether it is password-protected.
Data collected through Shopify session
Shopify provides the following data as part of the standard app authentication process:
- Shop domain
- Staff member name, email address, and user ID
- Account role (store owner or collaborator) and email verification status
- Locale preference
- Session tokens, access tokens, and refresh tokens
This session data is managed by Shopify's official session storage library and is required for the App to function within the Shopify Admin.
Store owner email address and store name
If your store receives the summary email (see Section 2), we read your store owner's email address and your store's name from the Shopify Admin API. Shopify describes the email as the address it uses to communicate with the shop owner. Reading them does not require any additional scope. It is not your public customer-facing contact email, and it is not a staff member's email address.
We store a copy of both on your shop record and refresh them from Shopify from time to time while the App is installed. We use the email address only to send the summary email and to show you, in the App, which address the summary goes to. We use the store name only to address the summary email to your store.
Information you provide
- Feedback: if you choose to use the in-app feedback form, we collect a satisfaction rating (1 to 5), your answers to up to three optional free-text questions, and an optional contact email address.
- App name suggestions: if you suggest which app an unrecognized script belongs to, we store your suggestion for review.
- Ignored findings: if you choose to ignore a finding, we store that choice and any optional note you add.
- Email preference: whether the summary email is turned on or off for your store, and when we told you about it in the App or you turned it on yourself.
Usage of the App
The App records your use of its own pages so we can operate and improve it. These are server-side records kept in our own database:
- A page visit record (your shop domain and the App page you opened) each time an App page is loaded.
- The last time your store opened the App.
- Whether in-app prompts (for example, the feedback prompt or an upgrade preview) were shown to you, clicked, dismissed, or completed.
- Technical error reports when an App page fails in your browser: the error message, a short code location trace, the App page path (without any query string), the HTTP status of a failed request, and your browser family (for example, Chrome). We strip query strings, tokens, and email addresses from these reports before storing them, and delete them after 30 days.
This does not use cookies or third-party analytics tools, and it does not record anything outside the App's own pages.
Data we do NOT collect
- Customer or shopper personal information
- Order or transaction data
- Payment or financial information
- Storefront visitor analytics or behavior data
- Marketing or advertising data
- Any content behind your storefront password
2. How We Use Your Information
We use the data we collect solely to provide and improve the App's services:
- Theme scanning — We analyze your theme files in memory to detect orphaned code patterns (ghost scripts, stylesheets, snippets, and sections) left by previously uninstalled apps.
- Scan results — We store findings (file name, line number, a short code snippet of up to 300 characters, severity, and the identified app name) so you can review results in the App.
- Optional-scope findings: for checks that use an optional scope, findings store short excerpts (up to 300 characters) and identifiers such as tag names, product or page handles, metafield keys with short value excerpts, and redirect paths. Full product, page, translation, and redirect data is not stored.
- Third-party script domains: for each scan we store the third-party domains your theme references and any unrecognized script URLs, with the file name, line number, and a short code snippet. We may analyze this data in aggregate across stores to improve how the App recognizes apps. This data is never sold, and it is deleted with the rest of your shop data as described in Section 6.
- Storefront script tags: for each scan we store the web addresses of the scripts that Shopify loads on your storefront for your apps, with query strings and fragments removed, kept in a short excerpt of up to 300 characters per app, along with the app we identify for each one. These addresses belong to third-party apps and may contain identifiers those apps use for your store. Your store's file ID in addresses on Shopify's CDN (cdn.shopify.com) is removed. We use them to warn you about apps that will stop working when Shopify stops running script tags on March 1, 2027. This data is deleted with the rest of your shop data as described in Section 6.
- Feedback: we use feedback only to improve the App and, if you gave an email address, to reply to you.
- Usage records: we use records of your use of the App's pages and prompts to operate and improve the App.
- App removal records: Shopify does not tell us which apps you install or remove. When an app was active in your store at one scan (its app embed was switched on in your theme, or it loaded through a storefront script tag) and is no longer active at the next scan of the same theme, while its code is still in your theme, we infer that the app is no longer active and record what it left behind. For each removal we detect, we store your shop ID, the theme ID, the app's name, the IDs of the scan that detected it and of the previous scan, the number of leftover items, its status (removed, cleaned up, or reinstalled), and when it was detected and last updated. Later scans update the status. These records contain no code and no personal data. We use them to show these apps in the App and in the summary email. Because this is an inference, it can miss a removal (for example, an app that left no code behind, or an app we cannot see as active) or, rarely, report one that did not happen (for example, if you only switched an app's embed off).
- Active apps at scan time: each scan stores the names of the apps it saw as active in your store (apps whose app embed was switched on, and apps loading through storefront script tags). We use this only to detect apps that are no longer active, as described above.
- App signature fingerprints: each scan stores a fingerprint (hash) of each of the App's built-in app signatures as they were when the scan ran. These describe our own detection rules, not your store. We use them so that an update to our rules is never mistaken for an app removal.
- Summary email: after each scheduled scan, we email your store owner's email address a summary of what changed in your scans. On the Professional plan this is weekly; on the Standard plan it is monthly. On the Professional plan, a noticeable change in your store speed report can also be a reason to send it. Free plan stores do not receive it. The email contains your store name (or your myshopify domain if no name is available), the apps we detected as no longer active since the previous summary (or, for your first summary, since the previous scan), each with the number of items it left behind or a note that they were cleaned up, the number of new findings, fixed findings, and findings still in your theme, on the Professional plan the result of your latest store speed report (your homepage speed score and the app that used the most processing time) when it changed noticeably or is your first report, a link to the App in your Shopify admin, an unsubscribe link, and our company name, logo, and contact email. The logo image is loaded from our website when you open the email. We do not use open tracking (tracking pixels) or click tracking in the summary email: its links are not rewritten and we are not told when you open it or click a link. It does not contain code snippets, theme file names, or any customer data. We send at most one summary email per store for each scheduled scan. If nothing changed since the previous summary (no new or fixed findings, no app newly inactive or cleaned up, and on the Professional plan no noticeable change in your store speed report), we do not send one.
- Summary email records: for each summary email we send, we store your shop ID, the ID of the scan it summarized, the recipient email address, the time it was sent, the counts it reported, and a fingerprint (hash) of what it reported. We use these records to avoid sending duplicate emails and to confirm what was sent. We also store a random unsubscribe code on your shop record so the unsubscribe link in each email works.
- Store speed report: on the Professional plan, once a week and when you click Run now (at most once a day), we ask Google PageSpeed Insights to test your storefront homepage and one product page. On the Free and Standard plans, when you click Run your free speed test, we ask Google PageSpeed Insights to test your storefront homepage only, once. If that test can't finish, you can try again, at most once a day, and we may stop offering it after several tests that could not be completed. We limit how many free tests run each day, so a free test can be paused until the next day. For this test we do not read your products or your public product list. To choose the product page, we use the Shopify Admin API if you have granted Products access; otherwise we read your store's public product list (
/products.jsonon your primary domain, the same public information any visitor can see) and pick one published product. We keep only the chosen page's address. We send Google only the public addresses (URLs) of those pages; Google's servers then load the pages the way a visitor would. Because of that, the test can appear as a visit in your store's analytics. We store a summary of each test: the speed scores and timings, page weight and request counts, and how much time and data each app or third-party service on the page used. We do not store the pages' content. If your storefront is password protected, the test cannot run and we record only that. - Subscription management — We store your current billing plan to gate features appropriately.
- App functionality — We use your shop domain and session data to authenticate requests and deliver the App within the Shopify Admin.
3. How We Process Theme and Storefront Data
Your theme files are processed as follows:
- Theme files are fetched from the Shopify API and processed in memory.
- Pattern matching detects orphaned code artifacts.
- Only the scan findings (metadata and short code snippets) are stored in our database.
- Data accessed through optional scopes is processed the same way: only findings are stored.
- Full theme file contents are not stored — they are discarded after processing.
- Your public storefront homepage is fetched directly from your store over HTTPS and processed in memory. Only two things are kept: the list of script addresses (without query strings or fragments), and, for each confirmed Liquid error, the theme file path, line number and snippet name from the error message. The page itself is not stored.
4. Data Storage and Security
- All data is stored in a PostgreSQL database hosted on Railway (United States).
- Our hosting provider encrypts all stored data at rest at the storage level, including Shopify access tokens. Access tokens are used only by our servers to call the Shopify API and are deleted when you uninstall the App.
- All connections use HTTPS/TLS encryption in transit.
- We do not sell, rent, or share your data with third parties for marketing purposes.
- We do not use your store owner's email address to send marketing emails.
5. Third-Party Services
The App uses the following third-party services to operate:
| Service | Purpose | Data shared |
|---|---|---|
| Shopify Admin API | Theme file access and authentication | Session tokens, theme queries |
| Your Shopify storefront | Reading your public homepage for script tags and Liquid errors | A standard HTTPS request from our server (our server's IP address and the User-Agent GhostCode/1.0 (+https://alpenglowsoftware.com)); no store or customer data is sent |
| Inngest | Background job scheduling | Shop ID, theme ID, scan metadata (not theme content) |
| Railway | Application and database hosting | All stored data (encrypted) |
| Google PageSpeed Insights | Store speed report (Professional plan) and the free speed test (Free and Standard plans) | The public URLs of your storefront homepage and one product page. No theme files, credentials, or personal data |
| Resend | Transactional email: notifications to the operator (feedback notifications, operational alerts) and the summary email to your store owner | For operator notifications: feedback rating and answers you submit, and your shop domain (not the feedback contact email you give us). For the summary email: your store owner's email address and the email content described in Section 2 |
No theme file or storefront page contents are transmitted to Inngest or any other external service. Theme files are fetched from the Shopify API, and your storefront homepage is fetched directly from your store. Both are processed on our application server.
6. Data Retention
- While installed — Scan results, findings, and shop data are retained for as long as the App is installed on your store.
- Page visit records: deleted after 14 days.
- In-app prompt interaction records: deleted after 90 days.
- Technical error reports: deleted after 30 days.
- Feedback: kept until your shop data is deleted.
- App removal records: kept until your shop data is deleted. A record is not deleted if the app is reinstalled; its status changes instead.
- Store speed reports, including the free speed test and when it was used: kept until your shop data is deleted.
- Summary email records and your stored store owner email address and store name: kept until your shop data is deleted.
- On uninstall: your sessions and Shopify access tokens are deleted immediately, and your shop is marked as uninstalled. The rest of your data is kept until Shopify sends a shop data erasure (
shop/redact) request, which Shopify sends 48 hours after you uninstall. If you reinstall before then, your existing data is still available. - Shop data erasure: when we receive the
shop/redactrequest, we permanently delete all data associated with your shop, including scans, findings, script domain records, feedback, usage records, app removal records, store speed reports, summary email records, and your shop record (including the stored store owner email address, store name, and unsubscribe code). - Email copies: feedback notifications and operational alerts already delivered to our inbox are not part of the App's database and are not removed by this automated deletion. Contact us to have them deleted.
- Summary emails you received: emails already delivered to your store owner's inbox are outside our control and are not removed by this automated deletion.
- Aggregate statistics: summary counts that do not identify your store (for example, total scans across all stores) may be kept after your data is deleted.
7. Your Rights
You have the right to:
- Access — View all scan data and findings through the App's dashboard.
- Deletion: uninstalling the App deletes your sessions immediately and all remaining shop data when Shopify sends the
shop/redactrequest 48 hours later (see Section 6). You can also contact us to request deletion without uninstalling. - Data portability — Contact us to request an export of your stored data.
- Correction — Contact us if you believe any stored data is inaccurate.
- Opt out of the summary email: the email is on by default for stores on the Standard and Professional plans, but we send it only after we have told you in the App that it is on, or after you turn it on yourself. Turn it off at any time in the App's Settings page, or use the one-click unsubscribe link in any summary email. Unsubscribing stops only this email. It does not change your plan or your scans.
We respond to all data requests within 30 days.
8. International Data Transfers
Your data is processed and stored on servers located in the United States. By using the App, you consent to the transfer of your data to the United States for processing.
9. Cookies and Tracking
The App does not use cookies, tracking pixels, or any third-party analytics or advertising technologies. The App records your use of its own pages on our servers to operate and improve it, as described in Section 1. It does not track your activity elsewhere in the Shopify Admin.
10. Children's Privacy
The App is designed for use by Shopify merchants (business users) and is not directed at children under 13. We do not knowingly collect data from children.
11. Changes to This Policy
We may update this Privacy Policy from time to time. If we make material changes, we will update the effective date at the top of this page. Continued use of the App after changes constitutes acceptance of the updated policy.
12. Contact Us
If you have questions about this Privacy Policy or want to exercise your data rights, contact us at: