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
| Item | Why |
|---|---|
| Email address | Sign-in (6-digit code) · team invites |
| Display name | To 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.
| Uploaded | Not 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 chose | Product names |
| Barcode | Prices |
| Device model · OS version · app version | Store 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.
| Sent | Not 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 version | Stock · 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 address | Your 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 send | What 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 taken | Store name · stock contents |
| A random number created on this device (unrelated to your account or phone number) · device type (iOS · Android) · app version | Your 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
| Data | Period |
|---|---|
| Account, stores, products, stock, history | Until 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 photos | Until 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 measurement | 90 days (deleted automatically) |
| Feedback you send | 1 year (deleted automatically) |
| Usage statistics | Raw 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 submissions | Until you withdraw them |
| Push token | Deleted when you sign out or turn off notifications |
4. Who processes data on our behalf
| Processor | What they do | Location |
|---|---|---|
| Supabase (AWS) | Data storage · authentication · product photo storage (private) · usage statistics storage (separate project) | South Korea (Seoul region) |
| Expo | Push notification delivery · app update delivery | United States |
| Apple / Google | Push notification delivery | United States |
| hCaptcha (Intuition Machines, Inc.) | Bot protection on the sign-in screen | United States |
| Resend (Resend, Inc.) | Delivery of sign-in verification emails · team invite emails · delivery of your feedback to the operator's mailbox | United 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
| Service | Salva |
| 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.