🧮 Overview
The Artikelkalkulation app enables central management of purchase prices, calculation factors, and selling prices for all products in your Shopify store. The app consists of four areas accessible via the sidebar menu or the tabs at the top.
| Area | Function |
|---|---|
| 💶 Purchase Prices | View and update purchase prices (unit cost) |
| 🧮 Calculation Factors | Maintain factors centrally per vendor or category (from Premium) |
| 🏷 Article Calculation | Manage factors, calculate selling price and push to Shopify |
| 💾 Backup | Export or restore a data backup |
| ⚙ Settings | Configure autosave, price rounding, VAT, auto-backup and language |
First-Run Setup Wizard
On first launch the app shows a setup wizard that walks through 6 steps: backup settings, autosave (including delay), VAT rates, price rounding, and the disclaimer. The wizard can be skipped ahead to the disclaimer step via 'Skip' — the disclaimer must be confirmed with a checkbox before the app can be used.
💶 Purchase Prices
Shows all products and their variants with the current purchase price (unit cost) from Shopify. The cost price is stored in each variant's inventory (inventoryItem.unitCost).
Loading Data
On first opening the tab the first 25 products are loaded automatically (default). The load limit can be adjusted directly in the filter row. A progress bar shows the loading status. The tab caches loaded data – a reload only occurs when data has changed in another tab.
Load Limit
The 'Load limit' dropdown on the right side of the filter row controls how many products are loaded initially: 25 / 50 / 100 / 250 / All. Default is 25 — ideal for large catalogs. When a collection or tag filter is active, all matching products are always fetched from Shopify regardless of the limit. A hint below the filters shows whether a limit is active, a filter loaded all matches, or all products are loaded.
Sorting
A 'Sort by' dropdown to the right of the load-limit control lets you sort by Name, Vendor, Cost status, or Variant count. Once a sort option is selected, two buttons ↑ (ascending) and ↓ (descending) appear. Sorting is applied after the active filters.
Filter & Search
- Search field – filters products by name (local, only on loaded products)
- All / With cost / Without cost – quick filters for data completeness
- Collection – loads all products in the collection from Shopify (ignores load limit)
- Vendor – loads all products from the selected vendor directly from Shopify (ignores load limit)
- Tag – loads all products with the selected tag from Shopify (ignores load limit)
The ⊞ (expand all) and ⊟ (collapse all) buttons on the right side of the filter bar open or close all visible products at once.
Editing Prices
Expand a product, then change the cost price directly in the input field. Changed fields are highlighted in orange.
Status badges
Each product shows badges in its title bar indicating the status of its variants at a glance — even when the product is collapsed.
- Red – No price: At least one variant has no purchase price. The number shows how many variants are affected.
- Orange – Changed: At least one variant has been edited but not yet saved.
- No badge = all variants have a saved purchase price and no pending changes.
Saving
Save all (bar at the bottom, from the Basic plan) saves all changed unit costs in one batch. A confirmation dialog appears first. Individual products can also be saved one by one (Free plan and above). The Cancel button next to Save all discards all pending changes and restores the last saved state — available on all plans. Each saved product counts as one unit against your monthly quota.
Zero-price warning
Automatic Pre-Save Backup
The browser can automatically download a JSON file with the original values before save operations. This behaviour is configurable in Settings under 'Automatic backup' (Never / On batch save only / Always). Downloaded files can be restored via the Backup tab.
Automatic Saving (Autosave)
When autosave is active, changed cost prices are saved automatically after the configured delay — without clicking Save manually. Whether autosave is on and which delay is active can be read and changed directly in the status bar. Each automatically saved product counts as one unit against your monthly quota.
Status bar
A compact status bar is embedded in the sticky filter area, to the left of the session row. It shows whether autosave is active, the selected delay, and the current state (pending / saving / last saved HH:MM:SS). Toggle and delay can be changed directly in the bar without opening settings.
Calculation Factor at a Glance
The saved calculation factor or advanced percentage values are shown inline in the collapsed product header — e.g. Factor: 2.50 or BK: 5% · GZ: 20%. This lets you see the calculation status without expanding the product.
Work Sessions
Work sessions let you track editing progress across multiple sittings. Whenever a product is saved, the app marks it as processed in the active session. Sessions are stored in the browser and persist after the window is closed.
Creating and Using a Session
- Set a filter or collection first, then click New Session and enter a name. The name is automatically prefixed with EK_ (Purchase Prices) or VK_ (Article Calculation).
- Saving a product automatically marks it as processed in the active session.
- Use the pill buttons (All / Processed / Unprocessed) to filter products by status — only products within the session scope are counted.
- End deactivates the session for this tab only – the session and other tabs remain unaffected.
- Delete permanently removes the session from the browser. A confirmation dialog prevents accidental deletion.
Multiple sessions can exist simultaneously. The dropdown lets you switch between them. An EK session also activates automatically in the Kalk tab if no session is running there yet.
Session Scope
When a session is created, the app stores the active filter (collection, tag) and the IDs of visible products as its scope. The progress counter shows processed / scope size instead of processed / all loaded products.
Scope Banner
When switching to a tab where the active session has a different filter than currently loaded, a blue banner appears showing the scope filter and size. Clicking Load now restores the matching filter automatically. The × closes the banner without reloading.
Excel Export / Import
Two buttons in the Purchase Prices tab enable Excel-based workflows: Excel Export creates a .xlsx file with all currently visible variants. Columns A–D (Variant ID, Product, Variant, SKU) are locked and shaded grey; column E (unit cost) is editable and highlighted green.
Re-import the edited file: the app reads column E, compares each value to the currently displayed cost price, and only applies rows with actual changes. Result summary: X applied · X skipped (no change) · X errors. Rows with errors are listed in an error modal and marked with a red X in the variant list; affected products expand automatically.
📥 Price list import
Take unit costs straight from your supplier's file — Excel or CSV, whatever its layout. The “Price list” button sits next to Export and Import; on the start page the Price list import card leads to the same place and opens the file dialog right away. Available from the Premium plan. Readable formats are .xlsx, CSV and text files, as well as HTML tables that some systems export under an .xls name. The old .xls Excel format itself cannot be read — open the file in Excel and use „Save as“ to store it as .xlsx or CSV. The app detects the format from the content and tells you when this step is needed.
How to get the best results
The import can do a great deal, and almost all of it is optional. This order gets you there most reliably — above all because two things must be done before creating: the number pattern and the key table. Afterwards they cannot be added without deleting the created articles again.
- 1 · Prepare the fileThe import has the easiest time with a plain table: one header row, article rows below it, no merged cells. Save an old .xls as .xlsx in Excel via „Save as“; a table inside a PDF has to be extracted first. Only one sheet is read — the one with the most data. A cover sheet is therefore harmless, but a second price sheet is left behind.
- 2 · Set the vendorEnter the vendor before loading the file. Number patterns, EAN prefixes and the calculation factors for prefilling all hang off it. Without it the app works without that prior knowledge.
- 3 · Load the file and read the block summaryAbove the change list you see „N blocks · N data rows · N skipped“. That is your first check: does the number of data rows roughly match what is in the file? Expand the skipped rows — header rows and section headings belong there, articles do not.
- 4 · Check the columnsAbove that you see which column was detected as article number, unit cost, description and EAN, each with a sample value. If one is wrong, change it — everything else depends on it. If the list carries a running position number on the far left, check the article number with particular care.
- 5 · Review prices and EANs — this costs nothingThe change list shows old and new unit costs and proposed EANs. Read, deselect what you do not want. Nothing is written until you trigger it.
- 6 · Create the number pattern — now, not laterDescribe how the supplier builds its article numbers. The pattern decides whether five rows become one article with five variants or five separate articles. Both are fine — but it cannot be changed afterwards without deleting and recreating the articles.
- 7 · Fill in the key table, titles and product organisationFor each option segment, record what the codes mean (204 = Yellow). If you already carry the supplier, the table fills from your own catalogue at the press of a button. The second and more important table sits at the product segment: per product code you set title, product type, collections, product category and tags — once, and every article created from it carries them. The title replaces the description from the file, which translates a foreign-language list in one go. All of this only applies when creating — afterwards you would have to add it to each article by hand.
- 8 · Extend first, create secondRows belonging to an article you already carry appear as extensions in their own section. Do those first: they shrink the list of supposedly unknown rows and prevent a second article with the same product key.
- 9 · Mark the runsEvery unknown row starts on „do not create“. One click makes a row the main article, the following ones belong to it. The run ends at the next row set to „do not create“ and at a block boundary. Check the figure above the list: it says how many articles with how many variants would come into being.
- 10 · ApplyOnly here is anything written, and only here does quota apply. Everything before — reading, matching, preview — is free.
| Pattern created too late | The most common avoidable mistake. Creating first and building the pattern afterwards means: delete and start over. |
| Clicked „Create“ without marking anything | Nothing happens — by design. Everything starts on „do not create“ so that one careless click cannot produce a hundred drafts. |
| Looked for the loaded price list in the pattern editor | It is not saved. It only supplies the example numbers and lasts as long as the editor is open. |
| Expected it all in one go | You can work through the list in several goes — your stock moves along right after each write. |
How matching works
The app compares every column of the file against your SKUs and EANs and picks the column with the most hits. Headers play only a minor role — so it also works with files that have no header row or are in another language. Matching runs against your entire catalogue, not just the page currently loaded.
| Notation | Article numbers match even when written differently: with dots, hyphens, spaces or leading zeros. |
| EAN takes precedence | If the file carries an EAN and the product a barcode, that is used — an EAN is unique worldwide, an article number only within your shop. |
| What counts as an EAN | Shopify's barcode field accepts any text, and in established shops it holds home-made codes alongside real EANs: internal numbers, shelf codes, short digits. A digit sequence therefore only serves as a key from eight digits up, and an article number is read as an EAN only when its check digit holds. Otherwise a five-digit number from the price list would sooner or later hit an identical house number in a barcode field. There is deliberately no restriction to exact EAN lengths, though: anyone who took their barcodes from the same supplier file carries the same odd number as the list — those matches are correct and remain. Products that drop out of EAN matching are not lost; they are still found by their article number. |
| Ambiguity is skipped | If two of your article numbers collapse to the same value once separators are removed, the row is skipped and listed — so the wrong product is not overwritten. |
Data blocks: what counts as an article row
Price lists are rarely one continuous table. Above the data sit logo, title and year; in between are section headings per brand, repeated header rows, totals and footnotes. The app therefore classifies each row individually: a row counts as an article row when the price column holds a readable number. Adjacent article rows form a block. Above the change list you see the result — for example „3 blocks · 412 data rows · 27 skipped“. Expanded, it lists every skipped row with its row number, label and reason.
Assigning columns yourself
Above the change list you see which columns were detected, each with a sample value from your file. If something is wrong, change it there — matching is recalculated immediately. If nothing matches at all, simply pick the article number column; all rows then count as new products. If your file holds several worksheets, the one with the most data is read — so a cover sheet left behind by a conversion does no harm.
Where the import reaches its limits
Detection measures instead of guessing: it compares every column against your catalogue and goes by the numbers in the rows, not by the headings. That makes it cope with remarkably different files — but not with every one. The cases below are the ones that typically cause trouble. Nearly all of them can be solved, either in the file itself or through the column assignment.
| Old .xls | The old Excel format cannot be opened. The app detects it and tells you; save the file as .xlsx or CSV in Excel. |
| A PDF is not a table. The app reads it as text and no usable columns come out. Extract the table first (in Excel via Data → From PDF) or ask your supplier for a spreadsheet. | |
| Several price sheets | From an Excel workbook the sheet with the most data is read. If the workbook carries one price sheet per brand, save the sheets separately and load them one after another. |
| Merged cells | A cell merged across several rows carries its value only in the first row — the others end up without an article number. The same goes for headings spanning two rows. Excel can undo both in one go. |
| Several numeric columns | If the unit cost is not alone — quantity tiers, RRP, weight, stock, minimum order —, the app takes the column with a matching heading, otherwise the rightmost one. That is often right, but not always. The sample value above the change list settles it in two seconds. |
| Text in the price cell | If the price column holds no readable number („on request“, „12.50 € per 100 pieces“), the row does not count as an article row. It shows up among the skipped rows with a reason and can be pulled back in there — you then set the price yourself. |
| Three decimal places | „1,234“ is read as 1234: price lists rarely quote tenths of a cent, but they often use thousands separators. If your supplier works with three decimals, change the number format before loading. |
| Currency and unit | The app reads numbers, not currencies: a currency symbol is stripped, nothing is converted. Whether a price is per piece, per 100 or per case is not in the number either — it is taken exactly as it stands. |
| Discount lists | A list that quotes percentages instead of prices (a discount scale off the RRP) cannot be resolved by the import. Convert it into prices beforehand. |
| Ambiguous numbers | If two of your article numbers collapse into one once dots and dashes are removed, the row is deliberately left out and listed. That is not a glitch but the brake that keeps the wrong article from being overwritten. |
| Too few hits | If the best column finds one of your articles in fewer than 15 out of 100 rows, it does not count as an article number. With a list of nothing but new articles that is normal — assign the column by hand. |
| Shortened EANs without a prefix | If the list carries only the last digits of an EAN, the app needs the supplier EAN prefix you stored. Without it nothing is taken from such a column — better no EAN than a wrong one. |
| Text files without a delimiter | A text file needs a delimiter: semicolon, comma, tab or pipe. Columns that are merely aligned with spaces cannot be split reliably. |
| Unusual character sets | CSV is read as UTF-8, with ISO-8859-1 as a fallback. More exotic encodings can mangle accented characters. Matching hardly suffers from that, but the titles of newly created articles do. |
Change list
Nothing is written until you trigger it. Beforehand you see every change with its current and new value and can deselect individually or by group. Products whose unit cost already matches do not appear at all.
Prices from equally priced products
Many suppliers list a product only once when an option does not change the price — every length, say, but not every colour. So your remaining colours are not left without an update, you can mark individual parts of the article number as not price-relevant in the number pattern. The preview then shows the prices taken over that way in a section of their own and names, for each row, the product the price comes from. Those products also count as covered and no longer appear in the list of possible discontinued items; the coverage figure states how many of them were only reached indirectly.
Adding EANs
If the list carries an EAN and the product has none, it is proposed for import. If an existing EAN differs, it goes into a separate section — never preselected, and only after explicit confirmation. A differing EAN usually means the supplier refers to a different product, or one of the numbers is wrong. An existing EAN whose check digit adds up is never replaced by a code that is not itself a valid EAN, though — that could only make things worse, so such rows are not put to you at all.
Creating unknown products
Rows that match none of your products are not an error — a supplier list almost always contains products you do not carry. You can create them as drafts: invisible in your shop, with SKU, EAN and unit cost. A tag is mandatory; it lets you find the new products again as a group later, including to delete them if needed. Rows without a price are usually section headings in the price list; they stay visible and are marked „no price“, but stay on „skip“ — even when a main product stands above them. Otherwise a heading would become a variant purely because of where it sits. If you click such a row explicitly, it counts all the same. The list is sorted by article number within each section of the price list rather than by the order in the file. The sections themselves — usually one per brand — stay in file order, so the supplier's own structure is preserved. Related articles therefore sit together — and the runs pick them up instead of passing scattered rows by. Your stock also moves along right after drafts are created: the new articles count as present from then on. If the same product key turns up again later — in a second block, in another colour, say — the row is recognised as a missing variant of the article just created rather than as a second article with the same key. You can therefore work through the list in several goes. Above the list you also see how many of the marked rows match no pattern. Those become single articles carrying only the import tag — without a pattern hit there is no code a tag could belong to. An article with just one variant is not affected: as long as its number matches, it gets all the tags.
Number patterns: several rows into one product with variants
Many suppliers encode colour or size in the article number — in 204.2330.13, 204 is the colour, 2330 the product and 13 the length. Under Number patterns in the creation area you describe that structure once per supplier, either by separator or by position. Each segment gets a role: Product decides which rows belong together, Option becomes a variant axis such as colour or length, Marker tells articles apart as well without becoming a variant axis itself, Ignore is left out. Shopify allows at most three option parts per product; if more than three parts are set to option, a notice states the exact count and the surplus ones are left out when creating. There is always only one product segment: pick „Product“ for a second one and the previous one automatically becomes a marker — it keeps telling articles apart, just without silently changing the grouping. The rows then become one product with variants instead of many separate items. You can define several patterns per supplier; only those of the selected vendor apply when creating. If the same number matches more than one of your patterns, a notice shows how many numbers that affects — this usually means a split segment was intended, making one of the two patterns redundant. If two do apply, the more precise one wins: the one that pins down more characters and splits them more finely. So the order in the list does not decide, and an older, open pattern never crowds out a newer one. The same pattern can also be prepared up front in the Vendors tab — there with your own article numbers as examples, so no list needs to be loaded. When you switch between separator and positions, the segments are re-derived — roles, axis names and finished mappings are kept. The segment length is visible and editable either way; with a separator it may stay empty („any“), while a fixed value narrows the pattern and keeps several patterns of the same supplier apart. For a supplier whose articles you do not carry yet, the pattern editor offers Load price list: the file then provides the example numbers and the codes for the key table. Which column holds the article numbers is detected automatically — among the data rows the app picks the column whose values repeat least, because an article number occurs once while a blade length occurs often. If the choice is wrong, change it; the list shows every column with its first values. Stock and file keep separate hit counts, so you see whether your pattern only fits what you already carry or also what the supplier ships today. The file is not saved; it lasts as long as the editor is open. A running position number on the far left („Pos.“, „line no.“) is passed over: it is recognised by starting at 1 and rising in steps of one — the heading plays no part, and a count that restarts in every section counts just the same. If consecutive numbers are the only number column in the file, they are used anyway; they are the article numbers then. If instead every number repeats — as in a tiered price list with several price levels per item — nothing is preselected: no column is demonstrably the right one, and a wrong preselection would be worse than none. Map the columns yourself in that case. Either way the per-column preview shows the choice; switch over if it is not right. Remember to save: until then a pattern lives only in the open session. That is enough to create with, but after reloading the app the mappings and tags are gone — and the created article would carry only the import tag, with nothing to say why. Unsaved changes are flagged at the top, and the close button says so too. If a pattern does not split cleanly, that is stated in red beside it — it is saved regardless, and the button then reads „Save anyway“. So a second, half-finished pattern is never a reason why the finished first one cannot be saved; a pattern with an unfinished split simply matches nothing until it works out.
Completing shortened EANs
Some suppliers print only the trailing part of the EAN in their price list — the leading part is the same for all of their articles and usually appears as a barcode on the letterhead. When the app spots such a column it first tries to work the start out on its own: it checks the starts already remembered, and otherwise derives it from your own products — if you already carry one article from this supplier with a complete EAN, the missing start falls out exactly. Which one fits is decided by the check digit, not by the supplier's name. If it adds up, the start is proven and applied right away. Otherwise the app asks: you can type it in or have it worked out from your own products, and then see for how many rows it adds up. As long as no start is available the shortened values stay unused — they are fragments, and are neither matched to a product nor written to one. A column counts as shortened even when it is properly titled “EAN”; what matters is the content, not the heading. Once applied, the start can be remembered per vendor. You can also store the start up front in the Vendors tab, and several per supplier there — necessary when a dealer carries other brands, since the start belongs to the brand owner.
Several EAN starts within one file
An EAN start belongs to the brand owner, not to your supplier. Buy from a wholesaler and one price list will carry several starts side by side — one per manufacturer. The app applies them all at once, and what matters is the count rather than the share of the file: every start that explains at least five rows counts as proven, and any number of them count alongside each other. Five rows resolving with the same start is no longer coincidence, and the size of the file makes no difference to that. The decision is then taken row by row, not once for the whole file.
What you see afterwards
You see which start explained how many rows, and how many rows were left open. That makes the message checkable rather than merely reassuring: if a striking number of rows stay open, a manufacturer is missing — add its start under the Suppliers tab and load the list again. Open rows are not errors; they simply get no EAN and are still matched by their article number.
Inferring the supplier
The app infers the supplier from a recognised start only when all starts found belong to the same profile. With a wholesaler a start identifies the manufacturer — it says nothing about the supplier, and nothing is guessed here.
Already correct
Rows that match one of your products but change nothing sit in their own collapsed section. They used to just disappear — leaving it open whether a product had been checked or had fallen through the matching. Nothing to do there.
Discontinued products: what the list does not name
The question the other way round: which of your products do not appear in the list? On its own that would say nothing — a list for a single product group would otherwise declare half your assortment discontinued. What counts is the coverage: how many of your products from this supplier does the file name at all? At 43 % it is an extract and says nothing about the rest; at 97 % the missing 3 % are an indication. The rate is always shown, even when it does not support a conclusion — the app says so explicitly rather than staying silent. You do not need to confirm that a list is complete: the numbers show it.
Time counts too. Per supplier the app remembers which products were missing from recent lists — only the missing ones, which are few. If the same product is missing for the third time in a row, that is given as the reason, along with the date it was last included. On a supplier's first import this hint naturally does not exist yet; it becomes useful from the second time onwards.
Runs: grouping with one click
All unknown rows start as skip (red) — so nothing is created without your action. In the Run column a click makes a row the main product; that activates it, and every row below belongs to it until the next main product — one click per group instead of one per row. Further clicks step on: single product (created, but not grouped) and, below a main product, back to red. There is no separate tick box for selecting any more — it would have been a second list for the same question and would inevitably drift apart. Create groups turns the marks into real groups that you can refine below. If no belonging row follows a main product, no group is formed — the row becomes a single product. That is not an error, and the list says so: the marker then reads “stays single” instead of “Main product”. With two main products directly in a row this necessarily applies to the first. A run ends in three places: at the next main article, at a row set to do not create — everything below follows suit — and at a block boundary. To carry on below, set a new main article there. Removing a single row from the middle while keeping the rest is no longer possible; in exchange it no longer costs dozens of clicks when you only want the first rows of a section.
Suggestions
The app searches the list for runs itself, using the description. If consecutive rows share a long common beginning they belong together, and what remains is the option value: “Kochmesser 20 cm” and “Kochmesser 24 cm” become the product “Kochmesser” with the values “20 cm” and “24 cm”. A shared article-number beginning alone is never enough — “12345-01 Kochmesser” and “12345-02 Bratengabel” share one but are two products.
Existing options from your shop
Axis names and values that already exist in your shop are offered in the fields, so “Farbe” and “Color” do not end up side by side. If a derived value matches an existing one apart from spelling, a button with the existing version appears next to it: “20cm” and “20 cm” are the same value, and without that hint every size grows a spelling variant beside it in your shop. Taking it is an offer, not a requirement.
New supplier: nothing in the shop yet
Normally the app spots the article number column by how many values match your own products. With a supplier you do not stock yet there is nothing to measure against — the list used to come up empty and you had to assign the column by hand. If you prepared the supplier in the Vendors tab, that is no longer needed: first the supplier is identified from the stored EAN start — proven by the check digit, not guessed — and then their number pattern finds the article number column. No product in the shop is required. Both only take effect when the result is unambiguous; otherwise you assign the columns yourself, as before.
Adding variants to existing products
If you have defined a number pattern, the app also checks whether an unknown row belongs to a product you already carry — one where only this single variant is missing. The detection is exact: the article numbers already in your shop are read through the same pattern, and if the product key comes out the same, it is the same product. Such rows appear in their own section and are not created as new drafts. As soon as you have applied variants, the list rebuilds at once: the created variants count towards your stock from then on and are not suggested again. Nor do they remain among the unknown rows — they now count as assigned.
Extending products that have no variants
If you already carry the product but without variants — the most common case — it has to be converted to variants first. The app offers this, but confirmed individually per product, with an extra prompt before anything is written. You see beforehand which option axes will be created and which values the existing variant will receive: those from its own article number, read with the same pattern. It keeps its price and article number. Afterwards the app checks what the product actually looks like — if the result does not match what was expected, it stops for that product rather than writing variants onto the wrong axis.
Grouping rows by hand
Not every article number follows a scheme. In that case simply select the rows that belong together and press Group selected. You give the product a name, name the option axis — size, for example — and enter a value for each row. If a field is left empty the article number takes its place, so the variants always differ. Groups made by hand take precedence over a pattern, and above the table you can see at any time how many products your selection will produce. When building, rows set to „on its own“ stay marked and are created along with the rest — a group needs at least two rows, but a single article is a valid outcome and must not be lost along the way. The message states both figures.
Pre-filling new drafts
If a preset exists for the given vendor in the Calculation factors tab, new drafts are bound to it right away — calculation mode vendor-based — and the selling price is calculated from the unit cost, either via the simple factor or via the advanced calculation including VAT and your configured rounding. Without a preset the drafts are created with no selling price and no binding: a price without a basis would be guesswork, and a binding without a preset would be broken from the start.
Unfinished assignments are not lost
Your decisions about a price list — marks, manual row decisions, groups you built by hand, selected rows and your selection in the change list — are saved continuously in your browser. If the app restarts or you leave the window, simply import the same file again: a notice appears at the top with the date and the number of decisions. Nothing is restored until you click — and „Discard“ deletes the record straight away. If you worked on a number pattern in between without saving it, that is part of the record too; the notice says so explicitly, because a pattern can change how the whole list is matched. On restore it is merged with what is in the shop, not written over it.
Use of save operations
Reading, matching and the preview cost nothing. Only writing counts: one save operation per product whose unit cost or EAN changes, and one per draft created — regardless of how many variants it has.
🧮 Calculation Factors
Define your calculation factors once per vendor or category instead of maintaining them in every single product. Products pointing at such a preset pull their factors from it automatically. Available from the Premium plan.
Creating and maintaining presets
The Calculation Factors tab holds two tables: one for vendors, one for categories. Pick an entry from the list below and enter the values directly in the table. Only vendors and categories without a preset are offered.
Calculation mode per product
Each product is calculated in exactly one way. There are no mixed forms. You choose the mode in the expanded product:
| M — Manual | The factors stored in the product apply. |
| V — By vendor | The factors of the preset for the product's vendor apply. |
| C — By category | The factors of the preset for a selected category of the product apply. |
On the collapsed row a badge to the left of the product name shows the chosen mode, so you can see how every product is calculated while scrolling.
If a product belongs to several categories with a preset, you choose in the product which one applies. With only one matching category it is preselected.
Switching many products at once
Bulk editing sets the calculation mode for all visible products at once — made for setting up large catalogues. Filter by the vendor or category first, then choose the Calculation mode field and the target mode. Products that cannot take it are skipped.
When a preset changes
When you change or delete a preset, an assistant shows every affected product with its current and new price. You have three options:
| Decide later | The preset is saved, the products keep their binding and are marked as Preset outdated. You work through the list later. Nothing is written. |
| Switch to manual | The products you exclude keep their price. The previously valid preset values are stored as their manual factors and overwrite the values held there before. |
| Cancel | Nothing happens, the preset stays unchanged too. |
Filters for preset products
Two additional quick filters appear in Product Calculation as soon as matching products exist: Preset outdated for products still saved with older preset values, and Binding broken for products whose preset was deleted or whose vendor was renamed.
Repairing broken bindings
If a vendor is renamed in Shopify, its products no longer find the preset. They continue to calculate with their own manual factors and are marked orange — so nothing is ever silently miscalculated. To repair it, switch the vendor in the preset row to the new name. The products are bound again immediately, without a single product having to be saved.
Use of save operations
Creating or changing presets uses no save operations. Only what is actually written into a product counts — prices, factors and switching the calculation mode. Searching for affected products in the assistant is free as well.
🏭 Vendors
Whatever holds true for a supplier in the long run goes here — up front, without a file. The start of their EANs and the structure of their article numbers belong to the supplier, not to a single price list. Entered here, the price list import finds them by itself. Available from the Premium plan.
Vendor list
Listed is every vendor set on at least one of your products — vendor is a standard Shopify field. Next to it you see the stored EAN starts and the number of number patterns. Open loads that supplier's products and opens their profile.
EAN starts
Some suppliers print only the trailing part of the EAN in their price list. You enter the leading part here — once, instead of with every new list.
Several starts per supplier are explicitly supported and often necessary: the start belongs to the brand owner, not the supplier. Anyone carrying other brands therefore has several. On import each start is checked against the check digit — one start too many costs nothing, it simply never adds up.
Suggest from your catalogue
If you already carry products from this supplier with barcodes, the app counts which EAN starts occur among them and offers each as its own group — with the number of products beside it, so you can see what the suggestion rests on. A start is offered once three products carry it. With a wholesaler you will therefore see several groups side by side: the start belongs to the brand owner, not to your supplier.
If barcodes exist but no group emerges, the app says so explicitly instead of leaving the field empty. Enter the start by hand in that case — it is usually printed as a barcode on the price list letterhead.
Sample EAN
One complete EAN from a product of this supplier. It serves as proof: next to every start you entered, you see immediately whether it fits that EAN — without waiting for the next price list. The app also checks the sample's own check digit.
Preparing number patterns
The same pattern editor as in the price list import. If you already carry products from this supplier, their article numbers serve as examples; otherwise you load the supplier price list here instead. That lets you prepare a pattern and check it against real numbers before the supplier's first list arrives.
Splitting a section
If a section carries two things at once — say, a marker letter in front of the actual number — split it into two parts with "Split". The "yields" column shows immediately what each part produces from the sample. The app blocks two situations: two parts without a character count (the boundary would be guesswork), and fixed character counts that together exceed the shortest section seen in the samples. Until that is fixed, Save stays disabled and a red message explains what to do. After a split, only the parts' character counts count — the one on the whole section has no effect any more, even if it was pre-filled from the sample when the pattern was created. Use "Merge" to undo the split.
Price relevance
Every row of the table has a “Price-relevant” tick. It is set unless you change it and means: this part of the number affects the unit cost. Untick it to tell the app that products may differ here without the price being different — typically the colour, when the price list shows each product in one colour only. When a price list is read in, the remaining products then get the same price as the product that is listed. On the product section the tick is set and locked: a product code always affects the price, otherwise a product could inherit the price of a completely different one. As long as no tick is removed, nothing about the import changes.
Saving
Starts and the sample EAN are stored in your shop with Save profile. Number patterns are saved in the pattern editor itself. While something is unsaved, a note appears next to the button — switching vendors would otherwise discard the entries.
🏷 Article Calculation
Calculates a new selling price from cost and factor and writes it directly to Shopify. The factor and a saved reference price are also stored as metafields.
Entering a Factor
- Expand a product – enter the factor directly in the number field
- − / + buttons change the value in 0.01 increments
Derived Factor
If no factor is saved for a variant but both cost and selling price exist, the factor is calculated automatically (selling price ÷ cost). A yellow banner offers to adopt this derived factor.
Cost-Change Detection
Price Calculation
New price = cost × factor, rounded to the step configured in Settings (default: €0.05). Example: cost €12.00 × factor 2.30 = €27.60 → rounded to €27.60. The factor can be adjusted directly with the input field or the −/+ buttons.
Product Status
| Ready | Cost and factor present, price matches calculation |
| Cost changed | Cost price has changed – price must be recalculated |
| ⚠ Price | Current Shopify price differs from the calculated price |
| No factor | No calculation factor set |
| No cost | No purchase price available |
| Saved | Price has been calculated and saved as reference |
Status Filters
Use the filter buttons to narrow down products by status:
| All | Show all products |
| Ready | Products where unit cost and factor are correct |
| Conflict | Products with a changed unit cost or a deviating price – action needed |
| No factor | Products without a calculation factor |
| Preset outdated | Products still saved with older preset values (only appears when such products exist) |
| Binding broken | Products whose preset was deleted or whose vendor was renamed (only appears when such products exist) |
In addition to the status filter, dropdowns for collection, vendor and tag are available. All three trigger a server-side reload and fetch all matching products directly from Shopify — regardless of the configured load limit.
The 'Expand all' and 'Collapse all' buttons on the right of the filter area open or close all visible products at once.
Load Limit
The dropdown on the right of the filter row limits how many products are loaded initially (25 / 50 / 100 / 250 / All). The limit is ignored when a collection or tag filter is active.
Sorting
A 'Sort by' dropdown to the right of the load-limit control lets you sort by Name, Vendor, Status, or Calculation factor. Once a sort option is selected, ↑ (ascending) and ↓ (descending) buttons appear. Sorting is applied after the active filters.
Factor Display in the Product Header
The effective factor (simple mode: Factor: 2.50, advanced mode: BK: 5% · HK: 3% · GZ: 20%) is shown on a single line in the collapsed product header. With vendor-based or category-based calculation these are the values from the preset.
Advanced Calculation
In advanced mode (from the Premium plan) the simple factor is replaced by a formula chain: cost → landed cost (+ procurement %) → bar price (+ handling %) → + markup % → net price (÷ discount buffer %) → gross price (+ VAT %). Each percentage is entered directly in the formula header row of the expanded product table. The VAT setting (standard / reduced) is saved per product.
Work Sessions
Work sessions let you track editing progress across multiple sittings. Whenever a product is saved, the app marks it as processed in the active session. Sessions are stored in the browser and persist after the window is closed.
Creating and Using a Session
- Set a filter or collection first, then click New Session and enter a name. The name is automatically prefixed with EK_ (Purchase Prices) or VK_ (Article Calculation).
- Saving a product automatically marks it as processed in the active session.
- Use the pill buttons (All / Processed / Unprocessed) to filter products by status — only products within the session scope are counted.
- End deactivates the session for this tab only – the session and other tabs remain unaffected.
- Delete permanently removes the session from the browser. A confirmation dialog prevents accidental deletion.
Multiple sessions can exist simultaneously. The dropdown lets you switch between them. An EK session also activates automatically in the Kalk tab if no session is running there yet.
Session Scope
When a session is created, the app stores the active filter (collection, tag) and the IDs of visible products as its scope. The progress counter shows processed / scope size instead of processed / all loaded products.
Scope Banner
When switching to a tab where the active session has a different filter than currently loaded, a blue banner appears showing the scope filter and size. Clicking Load now restores the matching filter automatically. The × closes the banner without reloading.
Saving
Three levels are available: Per variant – Save button in the variant row (all plans). Per product – Save button in the product header (all plans). Saves factor, reference price and selling price. Save all – via the bottom bar (from the Basic plan).
Bulk edit
Bulk editing is available above the product list. Choose a field from the dropdown (calculation factor, VAT; in advanced mode also procurement costs, handling costs, profit margin and buffer; from Premium also the calculation mode), enter a value and click 'Apply to visible'. The factor fields only affect manually calculated products – for vendor-based and category-based ones the values come from the preset. A note below the controls states how many products are affected and how many are skipped. The change is staged and only applied when you save.
Save all
Save all in the bottom bar saves all products with pending changes at once. Available from the Basic plan; usage is counted per saved product. The Cancel button next to it discards all local changes and restores the last saved state — no server call, available on all plans.
Autosave
When autosave is active, changes to calculation factors and advanced fields are saved automatically after the configured delay — no manual save needed. Each automatically saved product counts as one unit against your monthly quota.
Conspicuous calculations
The app compares each product's margin against the typical value for its vendor — or its category as a fallback — and reports outliers. Typos in the unit cost, forgotten factors or doubled markups surface before they cost you money for months. The check runs on already loaded data and uses no save operations. Available from the Basic plan.
| below cost | The net price is below the unit cost. Always reported, regardless of vendor or catalogue. |
| margin deviates | The margin is well above or below what is usual for this vendor. The note states the comparison value and how many products it is based on. |
| no unit cost | No unit cost is stored for the product, so a margin cannot be calculated. |
Invalid barcodes
Every EAN carries a check digit at the end, derived from the other digits. The app recomputes it for your articles’ barcodes. If it does not add up, the code is wrong — usually a transposed digit during entry. Such articles are marked „EAN invalid“ and can be listed together via their own filter. Only codes of a usual length are checked (8, 12, 13 or 14 digits); your own internal numbers in the barcode field are left alone, and a missing barcode is not a case here. The check costs nothing, since it involves no save.
Status bar
A compact autosave bar sits in the top status row, to the right of the editing counters. It shows the autosave status and allows quick toggling as well as choosing the delay (2 sec / 10 sec / tab switch) directly in the tab.
💾 Backup
Allows export and import of all relevant price data as a JSON file. Before every major change a Full Backup should be created.
Exporting
Four export types are available:
- Full Backup – cost, selling price and factor for all variants (recommended)
- Purchase Prices – unit cost only
- Selling Prices – Shopify prices only
- Calculation Factors – factors only
Full Backup is available from the Basic plan. Selective backups (purchase prices, selling prices, factors) require the Premium plan. Restoring requires the Basic plan.
Restoring
- Select backup file (JSON)
- App compares the file with current Shopify data
- All differences are shown in a table
- Individual changes can be selected or deselected via checkbox
- "OK – Apply changes" writes only the selected values back
Restore is available from the Basic plan. Without an eligible plan, clicking the button shows an upgrade prompt. A restore is not counted against your monthly quota and always completes in full, regardless of how many products are affected.
What the backup covers — and what it does not
The backup contains prices and calculation values, not items. For each variant the file holds the identifier, the SKU, product and variant name and – depending on the export type – cost price, selling price and backup price; for each product the calculation values. Not included are description, images, tags, inventory, options, collections and all other item details.
It follows that a deleted item cannot be restored. Values are written back using the item's Shopify identifier — once it is deleted, that identifier no longer exists. Such entries are listed separately when the file is read, so that no one is left with the impression that everything was restored. If you recreate a deleted item in Shopify, Shopify assigns a new identifier and the old backup no longer matches it.
Backing up settings
Number patterns, supplier profiles and calculation templates belong to the shop, not to a single product — which is why the backups above do not contain them. The Back up settings section at the bottom of the tab puts them into a file of their own. What gets saved is what you set up:
- Number patterns with their mappings — structure, roles, lookup tables, tags and titles. This is usually the bulk of the work.
- Supplier profiles — EAN beginnings, sample EAN and the runs stored per supplier.
- Calculation templates — the per-vendor and per-category presets from the Calculation factors tab.
- Tick what should go into the file. Each area states how many entries it holds; an area without entries is greyed out and cannot be picked.
- Back up settings downloads a JSON file. Date and time are part of the file name.
- To restore, use Read a backup and pick the file. Before anything is written, each area states what would happen: how many entries the file holds, how many of them the shop does not know, how many it knows differently and how many are unchanged.
- Deselect the areas you do not want back, then press Restore. Writing happens against the state of that moment — if someone works in a second window at the same time, their work is not lost.
Backing up settings is part of the price list import and works from the Premium plan. The file holds your setup only — no prices, no catalogue data.
⚙ Settings
The Settings & Subscription tab configures global options for the app and provides access to subscription management. Settings apply to all tabs and are stored in your browser (localStorage).
Autosave
Two separate toggles enable autosave for the purchase prices tab and the article calculation tab independently. Below each toggle, choose the delay: 2 s and 10 s start a timer after the last input; 'Tab switch' saves all pending changes when leaving the tab. Toggle and delay are also accessible directly in the status bar of each tab.
Automatic backup
Before save operations, the browser can automatically download a JSON backup file. Configurable separately for purchase prices and article calculation: 'No automatic backup', 'On batch save only', or 'Always'. Default: Always. Switching to 'No automatic backup' shows a warning dialog highlighting the risk.
VAT rates
Sets the standard and reduced VAT rates used in article calculation. The rate is selected per product and applied to gross price calculations.
Price Rounding
Sets which step the calculated selling price is rounded to. Available steps: €1.00 · €0.50 · €0.10 · €0.05 · No rounding.
Rounding is applied in Article Calculation on every save: new price = cost × factor, rounded to the chosen step. A live preview shows the result for each rounding step directly in the selection.
Product load limit
The number of products loaded initially is set directly in the filter row of the Purchase Prices and Article Calculation tabs (25 / 50 / 100 / 250 / All). The setting is saved and applies to both tabs.
Language
The app language can be switched to German or English. The setting is stored per shop and applies to all users of the same shop.
Remove PriceCalc Pro
The way out sits at the bottom of the Settings tab. Removing deletes the app from your store: prices, tags and metafields stay in Shopify unchanged, and the app stops accessing them. Shopify ends a running subscription with the uninstall. A confirmation comes before the removal.
💳 Subscription
Subscription management is part of the Settings & Subscription tab (below the settings section). It shows your active plan, monthly usage, and all available plans.
Choosing a plan
Use the toggle above the plan cards to switch between monthly and annual billing. The annual rate is cheaper -- the savings percentage is shown directly on each plan card. Click the desired plan to be taken to Shopify's payment page. Your plan is updated automatically after checkout.
Usage & Status
Your current plan, monthly usage, and the next reset date are shown in the status area. A progress bar visualises usage. A warning appears when usage exceeds 80%. Everything written into a product counts: purchase price, article calculation, switching the calculation mode, and every automatic save – individually or via 'Save all'. Settings and calculation factor presets do not count, nor does discarding changes, searching for affected products, or restoring a backup.
Cancellation
Your subscription can be cancelled directly in the app without leaving to Shopify. Click 'Cancel subscription', confirm the dialog -- the cancellation takes effect immediately. You retain access to all features until the end of the current billing period. After that, the app automatically switches to the Free plan.
💬 Feedback & Contact
The tile on the home page opens a page with two separate routes: a form for wishes and hints, and a direct line to support. Both are voluntary, and nobody asks you for a rating here.
Send a wish or a hint
Pick the category – a feature is missing, something is not working, something is cumbersome, kind words or something else – and write your message. Write as often as you like. A reply is not part of it: if you need one, use the route below.
We store your message, the category, your shop address and your plan – no names and no email address. The form is not always there: it only shows up while we are collecting feedback. The route to support stays visible either way.
When we come back to you
If we act on a wish, you hear about it inside the app: a small message bubble appears in the bottom right with two sentences and, where it fits, a button to the relevant place. It blocks nothing and does not expire — it stays until you dismiss it. We use the same corner for short announcements that concern everyone. If several are waiting you still see only one; the next arrives once this one is closed. No discounts, no advertising and no review requests appear there. None of this promises you a reply — if you need one, use the support route.
Reaching support
The button opens your mail app with a prepared subject addressed to support@jrmedia.software – shop address and plan are already in it, so we do not have to ask. We reply within 24 hours on business days.
💡 Tips & Notes
Recommended Workflow
- Create a backup (full backup)
- Update purchase prices
- Check / adjust calculation factors
- Open Article Calculation – review cost-changed products
- Save new prices
Plans & Action Limits
The app uses an action system. In the Purchase Prices tab, one action equals one click on Save. In the Article Calculation tab, 'Save all' counts one action per saved product.
| Plan | Limit | Features |
|---|---|---|
| Free | 20 actions / month | Single save, unit costs & Shopify prices |
| Basic | 150 actions / month | Save all, 5-step calculation, price rounding, full backup & restore |
| Premium | 500 actions / month | Autosave, selective backup, Excel export/import |
| Unlimited | Unlimited | Work sessions |
Your current plan and usage can be found under Subscription in the sidebar.
Frequently Asked Questions
Artikelkalkulation · Independent Shopify App · Not officially by Shopify