Cartwright Privacy Policy

Last updated: 2026-10-26

Cartwright is a checkout rules app for Shopify stores. This policy explains what data the app handles, why, how long it stays, and how to have it deleted. If any part of this policy is unclear, write to us at support@getcartwright.com.


1. Who we are

Cartwright is the app. The app is made and run by Cartwright LLC, a Colorado limited liability company. In this document, "we", "us" and "our" refer to Cartwright LLC.

For the data described in this policy, we are the data controller for our own records about the merchants who install the app. For order data that reaches us from a merchant's store, the merchant is the controller and we act as their processor. We handle your store's order data on your instructions, to run the app for you. Three things we keep are for us as well as for you: a log of what the app did, which is how a failure gets found; a daily tally of installs, trials, subscriptions and failures across all stores, which has a place in the database but is empty, because the app does not fill it in yet; and a minimal record of each privacy request Shopify sends us, which lets us finish, reconcile and demonstrate the required action even after the store record has been erased. Sections 3.3 and 5 describe all three records, and section 5 states the legal basis on which we hold each one. Beyond those three records, we do not use your data for any purpose of our own. Section 12 lists what we do not do with your data.


2. The short version


3. What we collect

We collect three groups of data.

3.1 Merchant and shop data

This section covers data about your store and about you as the person who installed the app.

The app also uses Shopify's standard session record. That record has columns for the first name, last name and email address of the staff member signed in. Cartwright does not turn on Shopify's online access tokens, so we expect those columns to be empty in normal use. We list them because they exist in our database. The same record carries the rest of Shopify's standard session model, which we do not write ourselves: a Shopify user ID, whether that user is the account owner or a collaborator, whether their email address is verified, their locale, the permissions your install granted, when the token expires, a refresh token with its own expiry, the one-time value used to complete the sign-in handshake, and a flag recording whether the session is one of Shopify's online ones, which ours are not. The user columns there are expected to be empty for the same reason as the name and email ones.

3.2 Data we receive from Shopify about orders

When an order is completed in your store, Shopify sends the app a narrowed copy of that order. The copy does not carry the shopper's email address or the customer record. The copy does carry the shipping address. Shopify redacts the name, street address, postal code and phone number in that address for an app like Cartwright that has not been approved to receive them. On our development store, the whole address arrived unredacted. Section 4 sets out exactly what the app reads from the copy, the short list of values it stores, and the fields it does not read. In summary, the app does not read or store any shopper's name, email address, phone number or street address.

3.3 Data the app makes for itself

Every row in every table above also carries its own row identifier, and most carry when the row was created and when it was last changed. These bookkeeping fields hold no data about you or your shoppers.


4. Order data, exactly

This section sets out what the app receives with each order, what it reads, and what it stores.

What Shopify sends us

When an order is completed, Shopify sends the app a copy of the order narrowed to nine top-level fields, which are the only ones the app reads: the order's identifier, the time it was created, its currency, its payment gateway, its payment gateway names, its total price, its line items, its shipping address and its shipping lines. Shopify does not send us the shopper's email address, the order's contact email, the top-level phone number, the billing address, the customer record, the order note, the note attributes, the browser IP, the client and device details, or the discount codes.

The narrowed copy can still contain personal data. The app requires the shipping address, because country and province rules take their values from it. Shopify sends the shipping address as a single unit, with all of its parts together. Shopify redacts the name, street address, postal code and phone number in that address for apps that have not been approved to receive them, which describes Cartwright. On our development store, the whole address arrived unredacted, and this policy is written for that case. The app reads only the country and province codes from the address, and the address is not retained after the request ends.

The app reads the fields listed below from the copy. Of those, the app stores only the three values listed under the second heading below.

What we actually do with each field

Fields the app reads in memory and does not store:

The app reads these fields once, compares them against your rules to work out which rules matched, and does not log or store them. The fields are cleared from memory when the request ends.

Values taken from the order and stored in our database:

These three values are the complete list of values taken from an order and stored. No other part of the copy Shopify sends is stored.

Stored alongside those three values, but not taken from the order: which of your rules matched, on the match counter row and on the order-identifier ledger row. On a COD fee ledger row, the app also stores the fee amount from your own settings, whether the attempt was applied, skipped or failed, or is still marked as started because the process stopped between claiming the order and finishing with it, the reason it was not applied if it was not, and how many attempts were made. These entries record what the app did, not facts about the shopper or the order.

The order identifier is a number Shopify assigns to an order. The order identifier is not a name or an email address, and it holds no details about the person who placed the order. Given access to your Shopify admin, it can be used to look an order up, which is why we treat it as data worth protecting and worth deleting rather than as a harmless integer.

Fields the app does not read. There are two kinds: fields Shopify does not send, and fields Shopify sends that the app does not read.

Fields Shopify does not send to Cartwright: the shopper's email address and the order's contact email, the top-level phone number, the whole billing address, the customer record including its tags and lifetime order count, the order note and note attributes, the browser IP and client and device details, the discount codes, and the goods subtotal.

Fields Shopify sends that the app does not read: everything in the shipping address other than its country and province codes, which on an unredacted copy means the shopper's name, street address, company, city, postal code and phone number; and everything on a line item other than its quantity, including product identifiers.

The second group arrives in the copy because Shopify sends the shipping address and the line items as single units, and the app leaves the rest of them unread. The app previously read the customer tags and order count. The app stopped reading them because the checkout function the counts are meant to mirror cannot see them, so reading them made the counts wrong. Removing them also removed any reason to ask Shopify for permission to read customer records. The app does not request that permission. Your install screen shows the full list of permissions the app does request.

Why the order-identifier ledger exists

Shopify can occasionally send the app the same order more than once. A repeat delivery happens after a timeout or a retry, and is normal platform behavior. Without a record of which orders we have already counted, a redelivered order would add one to every matched rule's total a second time, and the number we show you would be wrong in our favor. So we keep a note of every order we have counted, and a repeat is skipped.

Shopify redelivers an order up to eight times, over about four hours. After that, a row in this ledger no longer does the job it was created for. Cartwright therefore deletes ledger rows far sooner than the 90 days in the next section: we keep each row no longer than 7 days.


5. Why we hold each type of data

The legal basis for each type of data. We process merchant and shop data because that data is necessary to perform our contract with you, which is to provide Cartwright to your store. We handle order data on your instructions, as your processor; you are the controller of your shoppers' data, and we act only on what the app is configured to do.

We hold three things for our own purposes as well as yours. The first two rest on our legitimate interest in keeping the product working and knowing whether it is. The first is the product event log: it is how a failure is found before you have to report it, and it is also the data a paid analytics feature would use if one is built. The event log carries your store's domain and, on some rows, an order identifier. The event log is subject to the same 90-day maximum in section 6 as all other data derived from your orders. The second is the daily tally of counts across all stores in section 3.3, which the app does not fill in yet. The third is the compliance-request record in section 3.3. The compliance-request record rests on our legitimate interest in finishing, reconciling and demonstrating the privacy actions Shopify requires us to carry out. The compliance-request record keeps the minimum information needed to show which request arrived and whether and when we completed the request. Section 6 explains why the record is kept after the store record is erased. You have the right to object to any of these three uses, as section 9 states; write to the address in section 1 and we will answer.

Every type of data in the table below is held for you. Product events, aggregate daily counts and the compliance-request record are also held for our own purposes.

Data Purpose
Store domain, timezone, currency, plan Resolving scheduled rules in your own local time, showing money in your own currency, and suggesting the right price tier
Access token Letting the app publish your rules to your store, and apply the cash on delivery fee if that fee runs in the future, without asking you to sign in again
Subscription and trial details Knowing whether you can publish new rules, and when your trial ends
Payment method names Warning you at save time when a rule would hide every method we can see, and counting matches against the methods we can see your store offering
Your rules The product. Without your rules, the app has no work to do
Publish history and compiled config Answering "why did my rule not fire", and counting matches against the rules that were live at the time rather than the ones live today
Match counters The number beside each rule that tells you whether the rule is having an effect
Order-identifier ledger Stopping a redelivered order from counting twice
COD fee ledger Stopping a shopper being charged the fee twice, and giving you a record of the fees applied
Product events Seeing when something failed, so it can be fixed before you have to report it. The product event log is also for us: the log is how we know whether the product is working
Aggregate daily counts Knowing how the business is doing across all stores, and being told when something looks wrong. Empty: the app does not fill it in yet
Compliance-request record Finishing, retrying and demonstrating the privacy actions Shopify requires us to carry out, including after the store record itself has been erased

6. How long we keep your data

Data derived from your orders is kept for a maximum of 90 days. That maximum covers the COD fee ledger, the order-identifier ledger, the match counters and the product event log, including any order identifier sitting in an event's properties. A deletion job removes those records before they turn 90 days old, and it deliberately cuts two days early rather than late, so a run that is a day late still deletes each record before the 90-day maximum. Each run of the deletion job writes a single line to our own event log stating what the run removed. Cartwright does not currently monitor that log automatically, so a deletion job that stopped running would appear only as a gap in the log.

There are five exceptions to the 90-day maximum:

  1. Order-identifier ledger rows are deleted far sooner than 90 days, as section 4 explains. Shopify stops redelivering an order after about four hours, so a ledger row older than that serves no purpose.
  2. Your rules, your publish history and your store record are kept for as long as the app is installed. Your rules, publish history and store record are your own configuration, not order data. Deleting that configuration after 90 days would switch off rules you rely on. We delete your rules, publish history and store record when you ask us to, or when the app has been uninstalled and Shopify asks us to erase the store. Section 7 describes that erasure.
  3. Your session and access token last as long as the install. We delete the session and the access token when Shopify tells us the app has been uninstalled.
  4. Five kinds of event rows are kept beyond 90 days. One records that you dismissed the plan-suggestion banner, so the app does not show the banner again. One is the note we write each time we check whether any compliance request is still unfinished. That note carries counts and no store name. The other three are our receipts for the compliance requests Shopify sends: a data request, a customer redaction and a store redaction. The store-redaction receipt carries a row count and no store name; the other two carry your store's domain. None of these event rows holds data from your orders.
  5. Our record of a compliance request is kept indefinitely. The record is our evidence that we did what Shopify asked, and when, so we do not delete the record on a schedule. The record holds your store's domain, the kind of request, the dates and the delivery details listed in section 3.3. The record holds no data from your orders and no data about any shopper. Section 3.3 lists each field the compliance-request record holds, and section 7 explains why the record is kept after the rest of your data is erased.

Match counters are one case where we keep more history than the app shows you. The app displays the last 30 days. We keep 90 days of match counters so that we can answer a merchant's question about the last quarter.

If you want your data deleted sooner than the periods in this section, write to us at the address in section 1. We follow a written procedure for deleting a single store on request, and we answer within one month.


7. Uninstall, and the three compliance webhooks

When you uninstall

Shopify sends us a message when you uninstall, and when it arrives we delete your session and your access token, so the app can no longer act on your store. We mark your store as uninstalled and set your subscription status to canceled.

We deliberately keep your rules. If you reinstall the app within 48 hours, your rules are still there in the app, ready to publish again. If you do not reinstall, Shopify asks us to erase the store 48 hours later, and we do.

When Shopify asks us to erase your store (shop/redact)

Shopify sends this request 48 hours after an uninstall if the store has not reinstalled. We delete your store record, and that deletion cascades to your rules, your publish history, your compiled configurations, your COD fee ledger, your match counters, your order-identifier ledger and your product events. We also delete any remaining session rows for the store.

A small number of product event rows are written without a link to the store record, for example when a webhook fails before we know which store it came from. Those rows carry your store's domain in their properties, so the cascade above cannot reach them, and the redaction step deletes them by domain explicitly. Two kinds of record remain after the erasure, and neither holds data from your orders. The first is a single row stating that the redaction was carried out and how many rows the redaction removed. That row carries no store name. The second is one or more compliance-request rows, as described in section 3.3. Each of those rows names your store, and we keep each row because the row is our evidence of which privacy request arrived and whether and when we completed the request.

When a shopper asks for their data to be erased (customers/redact)

Shopify sends this request when a shopper asks a merchant to erase their personal data. When this request arrives, we hold no data about that shopper to erase. Cartwright does not store that shopper's name, email address, phone number or street address. The shopper's email address and customer record are not sent to us. The shopper's name, street address and phone number can arrive inside the shipping address, as section 4 describes. The app does not read those fields, and those fields are not retained after the request ends. We do not hold any record keyed to a person.

In the app, the only data we hold that could relate to the shopper's order is the order identifier, in the three places described in section 4. The deletion job in section 6 removes the order identifier from each of those places without any request: from the cash on delivery fee ledger and the product event log within 90 days, and from the order-identifier ledger within 7 days. Outside the app, an order number can also be in an email a merchant has sent to support, which our support email suppliers in section 8 hold.

When a shopper asks for a copy of their data (customers/data_request)

Shopify sends this request when a shopper asks a merchant for a copy of their data. We hold no personal details about that shopper. The only records that can relate to their orders are order identifiers in the three places section 4 lists, deleted within the periods in section 6, and order numbers in emails to support, which our support email suppliers in section 8 hold. We record that the request arrived; Cartwright does not look up those order identifiers automatically. On request, we tell the merchant which of the requested order identifiers we still hold. The merchant writes to us with the shopper's orders, giving for each the number at the end of the order's page address in their Shopify admin. We check them by hand and answer in writing, because the merchant is the one who owes the shopper an answer.


8. Who else touches the data

The table below shows who outside Cartwright LLC handles the data and what each of them holds. No data is shared with an advertising network, a data broker, an analytics vendor or anyone not named in the table below.

Category Who What they hold
Application hosting Render Runs the app's server. Data passes through it in memory; Render also keeps the server's log stream for a short period, and a log line about a failed request carries the request path and the error's own text
Database Supabase Holds everything in section 3, at rest
Support email Titan Holds the emails you send to support@getcartwright.com and our replies, including anything you put in them, such as order numbers
Support email forwarding Proton Holds a forwarded copy of the emails you send to support@getcartwright.com, in the inbox where we read them, including anything you put in them, such as order numbers
The platform Shopify Sends us orders, receives our rules and, if the cash on delivery fee runs in the future, our fee edits, and handles your billing

Where the data is. The app's server and its database both run in the United States, in the Ohio region. If your store is in the United Kingdom or the European Economic Area, the merchant and order data described in sections 3 and 4 is transferred to and processed in the United States. Render and Supabase each offer standard data processing terms for that transfer: Render's DPA at https://render.com/dpa and its sub-processor and compliance pages at https://render.com/trust; Supabase's DPA at https://supabase.com/legal/dpa and its GDPR guidance at https://supabase.com/docs/guides/security/gdpr-compliance.

We also make a read-only call to Shopify's Partner API to check whether your subscription is active. That call sends our app's identifier and your store's Shopify shop identifier, and no other data. No order data and no shopper data leaves the app to anyone beyond those named in the table above.

The table above is the complete list of those outside Cartwright LLC who handle the data. If we add a supplier, we will add the supplier to the table and update the "Last updated" date at the top of this policy before the change takes effect.


9. Your rights, and how to use them

If you are a merchant, you have the following rights, and you can use them at any time:

If you are a shopper, your relationship is with the store you bought from, and your request should go to that merchant, who will pass it to us through Shopify's own process. You may also write to us directly at the address in section 1, and we will respond to your request. In most cases, our answer will be that we hold no personal details about you. Section 7 explains why, and what we can check for the merchant.

We answer requests within one month of receiving them.

If you are in the UK or the EEA, you have the right to lodge a complaint with your national data protection authority.


10. Security

The security measures below are in place today.

We do not hold a SOC 2 report, and we do not encrypt individual columns beyond the database provider's own encryption.


11. Cookies and tracking

Cartwright's own code sets no cookies. Cartwright runs no analytics, advertising pixels, session recorders or third-party trackers, either in the Shopify admin or on our own website.

Signing in and installing run through Shopify's official app library, which may set a short-lived cookie as part of that exchange. That cookie exists only to complete the sign-in, and Cartwright does not read it afterward.

Cartwright does not track merchants or shoppers across websites.


12. What we do not do


13. Changes to this policy

If we make a material change, we will describe the change on this page and update the "Last updated" date at the top before the change takes effect. A material change is a new category of data, a new supplier, a new purpose, or a longer retention period. Cartwright has no notification banner in the app and no mailing list, so this page is the notice of a change. Compare the "Last updated" date at the top of this policy with the date you last read it to see whether the policy has changed. Minor edits, such as correcting a typo or making a sentence clearer, are not described separately, but the "Last updated" date still changes.

We will not extend how long we keep any data without first updating this page and its "Last updated" date.

Changed on 2026-10-26. Section 8 now names two more suppliers: Titan, which hosts our support email, and Proton, which holds the forwarded copy of that email in the inbox where we read it.