PairCart Privacy Policy
Effective date: [Effective date]
PairCart ("the app", "we") is a Shopify app that shows product offers in the cart of an online store. It is operated by [Company name], [Company address]. Contact: [Contact email].
This policy explains what data the app reads, stores and shares, for merchants who install it and for shoppers who use their stores. It covers the app and the cart it adds to your storefront.
1. Summary
- We do not collect shoppers' names, email addresses, phone numbers, addresses or payment details. The app does not request them from Shopify.
- We read your products, recent orders (product lines only, no customer fields), shipping rates, automatic discounts and theme settings to build offers and reports.
- We store a small amount of data: your store's access token, the state of the offer map, copies of your pair edits, and daily counters of cart activity.
- One optional processor receives product type names and example product titles: OpenAI. The app works without it.
- We do not sell data. We do not use it for advertising.
- When you uninstall, we delete your store's data, except a copy of your pair edits that we keep so a reinstall can restore them. Shopify's
shop/redactrequest deletes that copy too.
2. Data about the merchant's store
2.1 What the app reads through the Shopify Admin API
| Data | Used for |
|---|---|
Products: title, handle, product type, category, vendor, tags, images, prices, variants and options, inventory and availability, publication status, subscription-only status; the Search & Discovery complementary products list; product rating metafields reviews.rating and reviews.rating_count when they exist | Choosing offers, showing them in the cart and in the admin, upgrades, stars on offers |
Orders of the last 60 days (Shopify gives apps no more without extra access): creation time, cancelled and test flags, and for each line the product, quantity, price after discounts and the line properties _ca_upsell and _ca_upgrade. Also the cart attribute _ca_cart where used | "Bought together" signals, "Sales through PairCart", Analytics, the upgrade result |
| Shipping rates (delivery profiles) and automatic discounts | The free shipping bar threshold; telling whether our pair discount can combine with other discounts |
Published theme files config/settings_data.json and templates/product*.json, and theme colors | Warning when another cart app is on; checking our product block is placed; matching cart colors in the preview |
| Store name, currency, money format, billing country, plan type (development store or not) | Showing prices, the preview, test-order handling |
| Webhooks: products created, updated, deleted; discounts updated, deleted; app uninstalled; scopes updated; the three mandatory privacy requests | Keeping offers current; deleting data |
Orders: exactly what we read. Our order queries select: creation time, cancelled flag, test flag, and per line item the product id (and title for the report), quantity, price after all discounts and line properties. They do not select customer, billing or shipping address, email, phone, name, payment, or note fields. Order data is processed in memory to compute counts and totals and is not saved in our database.
Line properties. Shopify returns the properties of an order line (the "line item properties" a theme or another app puts on it, for example an engraving text a shopper typed). We read them in memory only to find PairCart's own markers (_ca_upsell and _ca_upgrade; for the upgrade marker also its value, the id of the variant that was replaced). Every other property, key or value, is discarded at once: we never save it, never write it to a log and never send it anywhere.
2.2 What we write to your store
Through Shopify we write app-owned metafields (readable only by the app and by the storefront code of the app): the offer map, settings, shipping threshold, discount settings, the "why" notes for each offer, kind cache, rules, onboarding progress and the subscription on/off status. They contain product ids, handles, prices and your settings. Shopify removes app-owned metafields when the app is uninstalled. We also create one automatic discount ("PairCart kit discounts") running our Shopify Function when you save a pair discount, and register a Web Pixel (see 3.2). We delete the discount when the last pair discount is removed.
2.3 What is in our database
| Table | Content | Kept |
|---|---|---|
| Session | Store domain, the app's access token for the store, granted scopes, and session fields from the Shopify template. The app uses store-level (offline) tokens; it does not save staff names or emails [verify on production before publishing] | Until uninstall |
| MapState | Store domain, time of the last offer map build, "products changed" flag | Until uninstall |
| ShopBackup | Store domain and copies of your pair edits, kind rules and pair discount settings (product ids, discount id), plus a one-time "restored" notice | After uninstall (to restore on reinstall) until Shopify's shop/redact request or until we delete it on request |
| FunnelDay, FunnelPairDay | Store domain, UTC day, counts: cart opens; per pair (product ids): offers shown, offers added | 400 days, then deleted. Deleted at uninstall |
Our server's temporary memory caches product data and the offer inputs for up to 30 minutes. Server logs contain store domains and technical errors, not shopper data [hosting provider's standard request logs may include IP addresses, see 6].
2.4 Staff accounts
We do not store the names or email addresses of your staff. Billing and plan are handled by Shopify.
2.5 Subscription status
We ask Shopify's Partner API whether the store has an active subscription or trial. The request contains the app id and the store's numeric id. We receive the status only.
3. Data about shoppers
3.1 The cart on your storefront
The cart script runs in the shopper's browser. It reads the cart and product data from your own store (/cart.js, /cart/*.js, /products/*.js) and shows offers. It does not send data to our servers.
- It adds to the cart or order the properties
_ca_upsell(a line added from an offer),_ca_upgrade(the id of the variant a line replaced) and the cart attribute_ca_cart. They appear in your orders and are used for your sales numbers. - It stores product data in the browser's
sessionStoragefor 5 minutes and, if you turn on the terms checkbox, whether the box was ticked in that tab. It sets no cookies of its own. - It uses the shopper's country from Shopify Liquid to show the right prices and free shipping text. This stays in the browser.
3.2 Funnel counters (Web Pixel)
We register a Web Pixel in your store. It runs only for shoppers who have allowed analytics where consent is required (the pixel declares analytics only; marketing, preferences and sale of data are off). It counts three events: cart opened, offer shown, offer added. It sends batches of counts to our server: the store domain, a random batch id, counts per pair of product ids. It does not send or store a client id, cookie, name, email, IP address or user agent. Our server may see the shopper's IP address in transit; it is used only for rate limiting in memory and is not stored or logged. The counters are kept 400 days. Because of consent rules the funnel numbers can be lower than real activity; sales numbers come from orders.
4. Processors and recipients
| Who | What they get | Why | Where |
|---|---|---|---|
| Shopify | All data above flows through its platform | Hosting the store and app APIs | See Shopify's policy |
| OpenAI | Product types and categories ("kinds") of your catalog, with up to 3 example product titles for each kind. No customer, order, price, or merchant identity data. Sent only when new kinds appear, at most 5 times a day and 30 times a month per store. Optional: the app works without it | Deciding which kinds go with which | United States. [Add the OpenAI API data terms link after checking] |
| [Hosting provider: Render] | All data in section 2.3, and server request logs | Running the app and its database | [Hosting region] |
| [Database provider, if not Render] | Section 2.3 data | Database | [Region] |
| [Email/support provider] | Messages you send to support | Support | [Region] |
We do not sell personal data, share it for advertising or use third-party analytics or advertising trackers in the app. We may disclose data if the law requires it.
5. How long we keep data
- Store data in our database: until you uninstall; the pair-edit copy (ShopBackup): until Shopify sends
shop/redact(about 48 hours after uninstall, per Shopify) or you ask us to delete it. - Funnel counters: 400 days.
- Metafields in your store: removed by Shopify at uninstall.
- Server logs: [log retention period set by hosting provider].
6. Security and location
Data is sent over HTTPS. Access tokens are stored in the database [with encryption at rest by the hosting provider]. Secrets are held in environment variables, not in the code. The cart sends no data to us. Our hosting is in [Hosting region]. If your store is in the EU or UK and our hosting or OpenAI is outside it, we rely on [Standard Contractual Clauses / other transfer mechanism]. The hosting provider may keep standard infrastructure logs that include IP addresses for [period].
7. Your rights
Depending on where you live (for example under the GDPR or the CCPA), you can ask us to access, correct or delete your data, or to stop processing it. We hold no personal data about individual shoppers. For shoppers' requests, Shopify passes customers/data_request and customers/redact requests to us; we answer them and confirm we hold no data about the customer. shop/redact deletes all of a store's data including the copy of pair edits. For merchants: uninstalling deletes your data as described in section 5; you can also email [Contact email] and we will delete the rest within 30 days. California residents: we do not sell or share personal information.
8. Shopify privacy requests
The app handles the three mandatory webhooks: customers/data_request, customers/redact and shop/redact, verified with Shopify's signature. It also handles app/uninstalled.
9. Children
The app is for merchants. It does not knowingly collect data from children.
10. Changes
We will post changes here and change the effective date. Material changes will be shown in the app.
11. Contact
[Company name], [Company address], [Contact email]