Legal notice

Privacy policy

Salva is an app for managing expiry dates in stores. This policy explains what the Service collects, what it does not collect, and when it deletes it.

Effective 2026-11-04

This is an English translation of the Korean original. If the two differ, the Korean version prevails.

1. First of all: photos never leave your store

The camera does two things, and photos are kept differently for each.

When reading barcodes and dates, what the camera captures is turned into text on the spot, and the image is neither saved nor sent. The data we collect to improve recognition does not include a single photo, or even a fragment of one (see 2-5 below).

When you keep a photo of a product, this photo is for recognizing items in the list. It is first saved on the device, and in stores used with a team (paid stores that use sync), it is shared only within that store so that it carries over when you switch devices and team members can see the same photo.

This photo is not public. It is kept in private storage with no public link, and it is visible only to members of the same store. Other stores and other users cannot even see that it exists. Only one photo is kept per product, and when you delete it, it is deleted from the server as well.

2. What we collect

2-1. Account

ItemWhy
Email addressSign-in (6-digit code) · team invites
Display nameTo show who handled what in the team member list

There is no password, so we do not store one.

2-2. Store operation data

Store name and time zone, products (barcode, name, brand), per-store prices, batches (expiry date, quantity, and a snapshot of the price at the time they were added), history (sales, discards, and returns, and when they happened), suppliers (name, return terms, pickup days, contact details, website, notes), and notification settings.

Supplier contact details are information about “other people” that you, the owner, write down. The field is there so you can call the place you return goods to right away, and, just like prices, it never leaves your store. If you do not need it, you can leave it blank and the app works just the same.

Prices never leave your store. The same product sells at different prices in different stores, and that is a trade secret. Server permissions are isolated per store, so any attempt to look them up from another store is refused outright.

2-3. Notifications

Your device's push token and platform (iOS/Android).

Notification text includes product names, for example “Check 3 items today” followed by “Seoul Milk Plain Milk 1L (2d over) + 2 more”. This is so you can decide what to do from the lock screen without opening the app. That is why this text passes through Apple/Google push servers and your lock screen. If you do not want this, you can turn it off in the app's notification settings, and then alerts will go off only within the device.

2-4. Product name catalog (optional)

In Korea, there is practically no public database for looking up product names by barcode. So we collect the barcodes and product names that users enter and provide them to the next person. We compare entries from multiple people and use the most common spelling as the answer.

Only the barcode and product name are uploaded. Prices, quantities, and stores are not, and other users cannot see who submitted what.

When you bring in a file from another app or POS with “Import stock”, names from that file are shared the same way only for barcodes that have no shared name yet. The app tells you before you import, and you can withdraw those names in “My shared product names”.

To look up a product name, the app sends a barcode it has not seen before to our server. This happens even if you are not signed in. The server only answers at that moment and does not keep which barcodes were asked. If you report a product name without signing in, the barcode, name, and reason go to the operator the same way as feedback in 2-6 below.

2-5. Scan accuracy measurement (temporary)

To improve date recognition, we collect the following.

UploadedNot uploaded
The text the camera read (up to 500 characters)Photos (not a single one, not even a fragment)
The date the machine read / the date the user choseProduct names
BarcodePrices
Device model · OS version · app versionStore information

We record the device model because cameras differ from device to device, and so do recognition rates. If we lumped them all together, we could not tell which device needs fixing.

This data is deleted automatically after 90 days. No user, including the person who uploaded it, can read it back (the server gives users write access only); only the operator reviews it, to improve recognition. You can see what is collected in the app under Settings → Scan accuracy.

2-6. Feedback (only when you send it)

Only when you send feedback from Settings → Send feedback (or the same button on Home) does the following go to the operator's mailbox.

SentNot sent
The button you picked (Annoying · Change this · Love it) and the line you wrote (up to 300 characters)Photos · screenshots
Which screen you sent it from · when you wrote it · app version · device model · OS versionStock · prices · product names
Your role in the store (owner · manager · staff)Store name
Only if you turn on “Get a reply”, your sign-in email addressYour email address, if reply is off

You can send feedback without signing in. In that case we cannot tell who sent it, so we cannot reply. Without a connection, it is kept on the device and sent once you are online. If you send it while signed in, it is stored with your account (even with reply turned off). Deleting your account removes that link.

2-7. Usage statistics (you can turn this off)

To learn which features are used and where people get stuck, we send the items below. You can turn this off in Settings → Send usage statistics, and turning it off also deletes what is waiting on the device. Data already sent cannot be picked out and deleted, because we cannot tell whose it is. If you turn it back on, a new number is used.

What we sendWhat we never send
When you open the app · names of the screens you view · the kind of feature you use (creating a store · saving a scan · clearing items · purchase result, etc.)Product names · barcodes · prices
Numbers such as items added, items saved and time takenStore name · stock contents
A random number created on this device (unrelated to your account or phone number) · device type (iOS · Android) · app versionYour account · email address
On Android, the tag of the link you came through when you first installed (e.g. a blog post)Location · contacts · photos
The program error message when the app stops (with values such as numbers and amounts removed)Anything you typed

This is not tied to your account. Even when you are signed in, we cannot tell who sent it. It is kept on the operator's statistics server (Supabase, Seoul) and the raw data is deleted automatically after 90 days. After that, only daily totals and the list of device numbers that opened the app on each day (to count return visits) remain, with no time limit. These numbers are generated randomly on the device and are not linked to any account, name or contact details.

3. How long we keep data

DataPeriod
Account, stores, products, stock, historyUntil you delete your account. Stores you used on your own are deleted along with it; for stores where team members remain, the data stays in that store
Product photosUntil you delete them. If you delete the product or leave the store, they are deleted from that device, and if it was a store you used on your own, they are also deleted from the server when you delete your account
Scan accuracy measurement90 days (deleted automatically)
Feedback you send1 year (deleted automatically)
Usage statisticsRaw data 90 days (deleted automatically) · daily totals and the device numbers that opened the app each day are kept with no time limit
Product name catalog submissionsUntil you withdraw them
Push tokenDeleted when you sign out or turn off notifications

4. Who processes data on our behalf

ProcessorWhat they doLocation
Supabase (AWS)Data storage · authentication · product photo storage (private) · usage statistics storage (separate project)South Korea (Seoul region)
ExpoPush notification delivery · app update deliveryUnited States
Apple / GooglePush notification deliveryUnited States
hCaptcha (Intuition Machines, Inc.)Bot protection on the sign-in screenUnited States
Resend (Resend, Inc.)Delivery of sign-in verification emails · team invite emails · delivery of your feedback to the operator's mailboxUnited States
Cloudflare (Cloudflare, Inc.)Shared product photo storage and delivery · website hosting · forwarding of support and feedback email (support@salva.kr)Worldwide (storage in Asia-Pacific)
Google (Gmail)Operator's mailbox (keeps support and feedback email)United States

If you turn on push notifications, the notification text (including product names) passes through Expo and Apple/Google. If you turn notifications off, this route is not used.

When the app starts, it asks Expo whether there is a new version. At that point, your IP address, app version, and device type are sent; store data and email addresses are not. A new version that has been downloaded is applied the next time the app starts. If there is no connection, the app skips this check and starts right away with the current version, so it does not get stuck even in a stockroom with a weak signal.

The sign-in screen has bot protection (hCaptcha). It runs only at the moment you request a code, and to tell whether you are human, your IP address and device/browser signals are sent to hCaptcha. Your email address and store data are not. We have this gate because without it, anyone could flood someone else's address with sign-in code emails.

Sign-in verification emails and team invite emails are delivered through Resend. In the process, the recipient's email address and the email body (the 6-digit code or the invitation) are sent to Resend. Store data, product information, and prices are not.

Feedback you send goes through Resend and Cloudflare to the operator's Gmail. What is sent is exactly the table in 2-6 above.

The “shared product photos” you see in the product list are delivered through Cloudflare. These are default images that we prepare ourselves and show the same way to every store; when the app fetches an image, your IP address is sent to Cloudflare. Store data, product information, prices, and email addresses are not. Photos taken in your store do not use this route. They are kept private and never leave your store (Supabase in the table above). Only one store that we designated in advance can upload shared photos, and no other store sends anything through this route.

We do not provide or sell personal information to third parties for advertising or analytics.

5. Your rights

  • Access and correction: you can view and correct your data directly in the app.
  • Deletion: you can leave a store in the app, and you can request account and data deletion.
  • Opting out of notifications: you can turn them off in Settings at any time.
  • Withdrawing catalog contributions: you can withdraw product names you have submitted (through the same channel as deletion requests).
  • For any other request, contact us at the address below and we will handle it.

6. Security measures

  • All communication is encrypted with HTTPS.
  • Sign-in sessions are kept in the device's secure storage (iOS Keychain / Android Keystore).
  • The server enforces per-store isolation with row-level access control, and this boundary is verified by automated server checks with every change.
  • If you leave a team or are removed from it, that store's stock and prices are deleted from your device.

7. Children under 14

The Service is not directed at children under the age of 14, and we do not knowingly collect their information.

8. Changes

If this policy changes, we will post it on this page with an updated effective date, and we will announce significant changes in the app.

9. Contact

ServiceSalva
Privacy inquiries support@salva.kr

If an inappropriate shared product name appears, you can flag it right on the screen where you add a product in the app (a name is taken down automatically once it gets two flags), and we also accept reports at the email above.