# FINN.ghost für Shopify

Benutzerhandbuch zur Anbindung von SelectLine an einen Shopify-Shop: Einrichtung, Artikelpflege, Bestellabwicklung und laufender Betrieb. Quelle ist das Repository FINN.ghost unter docs/shopify – Änderungen bitte dort vornehmen, Bearbeitungen in BookStack werden beim nächsten Sync überschrieben.

# Überblick

FINN.ghost verbindet die SelectLine mit einem Shopify-Shop. Die Stammdaten bleiben in
der SelectLine, der Shop wird daraus versorgt. Bestellungen laufen den umgekehrten Weg
und werden als Beleg in der SelectLine angelegt.

Man pflegt also weiter dort, wo man es gewohnt ist: in der Artikelmaske, im
Kundenstamm, in der Belegkette. Im Shopify-Adminbereich muss nichts nachgetragen
werden.

<!-- TODO Screenshot: images/ueberblick-schema.png -->

## Was in welche Richtung übertragen wird

| Aus der SelectLine in den Shop | Aus dem Shop in die SelectLine |
| ------------------------------ | ------------------------------ |
| Artikel mit Texten und Bildern | Bestellungen als Beleg          |
| Preise, Aktionspreise, Katalogpreise | Neue Kunden aus Bestellungen |
| Bestände je Standort            | Gutschriften und Storni          |
| Artikelgruppen als Sammlungen   | Trackingnummern (optional)       |
| Sachmerkmale und Extrafelder als Metafelder |                     |
| Journaldateien als Dateianhänge |                                  |
| Kunden, bei Shopify Plus als Unternehmen |                       |
| Versandmeldung und Zahlstatus   |                                  |

Zusätzlich kann FINN.ghost **Änderungen an einem Beleg zurück in die
Shopify-Bestellung schreiben** — siehe
[Versand und Rückmeldungen](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/versand-und-ruckmeldungen).

## Wie die Übertragung ausgelöst wird

Es gibt keinen Knopf „jetzt alles übertragen", den man täglich drücken müsste. Die
Übertragung läuft nach einem Zeitplan, der pro Aufgabe eingestellt wird — Bestände zum
Beispiel häufiger als Artikeltexte.

Wer eine Änderung sofort im Shop sehen will, kann die passende Aufgabe unter
**Shopify → Zeitsteuerung** von Hand starten.

<p class="callout info">Die Aufgaben laufen nacheinander, nicht gleichzeitig. Solange ein großer Lauf arbeitet, warten die anderen. Umfangreiche Vollübertragungen gehören deshalb in die Nacht. Näheres unter <a href="sfy-zeitplan">Zeitplan der Übertragungen</a>.</p>

## Der Cache

Ein Punkt, der Shopify von anderen Anbindungen unterscheidet und den man kennen
sollte: FINN.ghost führt eine eigene Zuordnungstabelle, welche SelectLine-Nummer zu
welchem Shopify-Objekt gehört. Shopify vergibt eigene interne Nummern, und die stehen
nirgends in der SelectLine.

Diese Tabelle ist der **Cache**. Ist er veraltet, findet die Schnittstelle Artikel
nicht wieder — mit der Folge, dass Artikel doppelt entstehen oder Bestellungen nicht
importiert werden können.

<p class="callout warning">Wer im Shopify-Adminbereich Produkte löscht oder von Hand anlegt, muss den Cache erneuern. Alles dazu unter <a href="sfy-cache">Der Cache</a>.</p>

## Was ein Artikel braucht, um im Shop zu erscheinen

Die kürzeste Antwort auf die häufigste Frage: Ein Artikel geht nur in den Shop, wenn
in der Artikelmaske das dafür vereinbarte **Kennzeichen für den Shop** gesetzt ist.
Ohne dieses Kennzeichen wird der Artikel übersprungen — unabhängig davon, wie
vollständig er sonst gepflegt ist.

Welches Feld das ist, wird bei der Einrichtung festgelegt, siehe
[Artikel im Shop veröffentlichen](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/artikel-im-shop-veroffentlichen).

## Aufbau dieses Handbuchs

| Kapitel                                       | Inhalt                                                          |
| --------------------------------------------- | --------------------------------------------------------------- |
| [Einrichtung](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/shopdaten)                   | Zugang, Läger, Belegtypen, Zuordnungen, Erstinbetriebnahme        |
| [Artikel](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/artikel-im-shop-veroffentlichen)        | Freigabe, Texte, Bilder, Preise, Bestand, Gruppen, Varianten      |
| [Kunden und Bestellungen](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/kunden)          | Kundendaten, B2B, Bestellabwicklung, Rückmeldungen, Gutschriften    |
| [Laufender Betrieb](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/zeitplan-der-ubertragungen)              | Zeitplan, Cache, Fehlersuche, häufige Fragen                       |

Wer die Schnittstelle neu einrichtet, arbeitet das Kapitel *Einrichtung* von vorne
nach hinten durch und folgt dann der [Erstinbetriebnahme](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/erstinbetriebnahme).

# Einrichtung

Zugang zum Shop, Läger, Belegtypen, Zuordnungen und die Reihenfolge bei der Erstinbetriebnahme.

# Shopdaten

Unter **Shopify → Einstellungen → Shopdaten** wird der Zugang zum Shop hinterlegt.
Ohne diese Angaben bleiben alle weiteren Auswahllisten in den Einstellungen leer, weil
sie ihre Inhalte direkt aus dem Shop laden.

<!-- TODO Screenshot: images/einrichtung-shopdaten.png -->

## Zugangsdaten

### Shopname

Nur der Name, **nicht** die vollständige Adresse. FINN.ghost bildet daraus
`https://<Shopname>.myshopify.com`.

<p class="callout info">Der Shopname ist der Teil vor <code>.myshopify.com</code> in der Adresse des Adminbereichs. Er bleibt gleich, auch wenn der Shop unter einer eigenen Domain erreichbar ist.</p>

### AccessToken

Das Zugangstoken einer eigenen App im Shopify-Adminbereich. Anzulegen unter
**Einstellungen → Apps und Vertriebskanäle → Apps entwickeln → App erstellen**.

Die App braucht Lese- und Schreibrechte auf Produkte, Bestände, Bestellungen,
Entwürfe, Kunden, Unternehmen, Dateien, Übersetzungen, Preislisten, Publikationen und
Versandeinstellungen. Im Zweifel alle Bereiche freigeben, die mit Produkten,
Bestellungen und Kunden zu tun haben.

<p class="callout warning">Shopify zeigt das Token nur einmal an. Wer es nicht notiert hat, muss ein neues erzeugen.</p>

Beim Speichern prüft FINN.ghost die Verbindung sofort und meldet, wenn sie nicht
zustande kommt.

## Verbindung prüfen

Die Verbindung ist in Ordnung, wenn sich die Auswahllisten in den Einstellungen
füllen — etwa die Standorte, die Sprachen oder die Versandarten. Bleiben sie leer,
stimmt etwas am Shopnamen oder am Token nicht. Die konkrete Meldung steht im Protokoll
unter **Shopify → Zeitsteuerung**.

## Grenzen der Shopify-Schnittstelle

Shopify begrenzt, wie viele Anfragen eine App pro Sekunde stellen darf. FINN.ghost
beachtet das selbst: Nähert sich das Kontingent der Grenze, legt die Schnittstelle eine
Pause ein und arbeitet dann weiter. Bei Überlast auf Shopify-Seite wird der Aufruf
automatisch wiederholt.

<p class="callout info">Das ist der Grund, warum ein Vollexport bei vielen Artikeln lange dauert und sich nicht beliebig beschleunigen lässt. Das Tempo gibt Shopify vor, nicht die Schnittstelle.</p>

## Nächster Schritt

[Läger und Standorte](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/lager-und-standorte)

# Läger und Standorte

Shopify führt Bestände je **Standort**. FINN.ghost muss deshalb wissen, welches
SelectLine-Lager zu welchem Shopify-Standort gehört. Die Zuordnung liegt unter
**Shopify → Einstellungen → Lager**.

<!-- TODO Screenshot: images/einrichtung-lager.png -->

<p class="callout danger">Ohne mindestens eine Zuordnung wird kein Bestand übertragen. Im Protokoll erscheint dann die Meldung, dass keine Läger definiert sind.</p>

## Die Zuordnung

Links stehen die Standorte aus dem Shop, rechts wählt man das SelectLine-Lager.

### Alle Läger

Neben den einzelnen Lägern steht die Auswahl **Alle Läger** zur Verfügung. Damit wird
der Gesamtbestand über alle Läger an diesen Standort gemeldet.

Das ist die richtige Wahl für den Normalfall: ein Shopify-Standort, ein Lagerbestand.
Erst wenn der Shop tatsächlich mehrere Standorte getrennt führt — etwa Zentrallager und
Filiale —, ordnet man einzelne Läger zu.

<p class="callout info">Ist genau ein Standort mit <em>Alle Läger</em> zugeordnet, schreibt FINN.ghost beim Bestellimport kein Lager in den Beleg. Bei echter Standorttrennung wird dagegen das Lager des Fulfillments übernommen, und zusätzlich der Lagerplatz aus den SelectLine-Lagerstammdaten.</p>

## Weitere Einstellungen in diesem Bereich

### Bestand verwenden

Schaltet die Bestandsführung im Shop insgesamt ein oder aus. Ist sie aus, verkauft
Shopify unbegrenzt weiter, weil es keine Bestandsangabe kennt.

### Reservierten Bestand ignorieren

Standardmäßig wird der reservierte Bestand abgezogen, also nur der wirklich freie
Bestand gemeldet. Mit dieser Einstellung wird der volle Lagerbestand gemeldet.

### Offene Aufträge von Bestand abziehen

Zieht die noch nicht gelieferten Mengen aus offenen Aufträgen des Bestell-Belegtyps
zusätzlich ab. Sinnvoll, wenn Aufträge in der SelectLine längere Zeit offen liegen,
bevor sie geliefert werden, und der Shop diese Ware nicht mehr anbieten soll.

## Nächster Schritt

[Belege](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/belege)

# Belege

Unter **Shopify → Einstellungen → Belege** wird festgelegt, wie Bestellungen in die
SelectLine-Belegkette einlaufen und was aus der Belegkette zurück in den Shop gemeldet
wird.

<!-- TODO Screenshot: images/einrichtung-belege.png -->

## Belegtypen

Zur Auswahl stehen jeweils alle Verkaufsbelege der SelectLine.

### Bestellungen

In diesen Belegtyp wird der Warenkorb aus dem Shop übertragen.

### Vorkasse

Bestellungen mit einer Vorkasse-Zahlungsart landen stattdessen in diesem Belegtyp.
Welche Zahlungsarten als Vorkasse gelten, wird unter
[Zahlungs- und Versandarten](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/zahlungs-und-versandarten) festgelegt.

Ist der Vorkassebeleg in der SelectLine als gezahlt verbucht, markiert FINN.ghost die
Bestellung im Shop als bezahlt.

### Versand

Erreicht ein Beleg diesen Belegtyp — üblicherweise der Lieferschein —, meldet die
Schnittstelle die Bestellung im Shop als versendet und überträgt die Paketnummern aus
der Paketverwaltung.

### Rechnung

Wird für die Gutschriftverarbeitung gebraucht: Zu einer Rückerstattung im Shop entsteht
in der SelectLine eine Rechnung als Vorgänger und darauf die Gutschrift. Siehe
[Gutschriften und Storni](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/gutschriften-und-storni).

### Belegtyp Bestelländerungen

Die Gegenrichtung: Wird ein Beleg dieses Typs in der SelectLine geändert, überträgt
FINN.ghost die Änderung **zurück in die Shopify-Bestellung** — geänderte Mengen,
entfernte und hinzugefügte Positionen, angepasste Versandkosten.

<p class="callout warning">Das ist die einzige Stelle, an der die Schnittstelle die Bestellung im Shop inhaltlich verändert. Wer das nicht möchte, lässt das Feld leer. Näheres unter <a href="sfy-rueckmeldung">Versand und Rückmeldungen</a>.</p>

## Versandmeldung

### Trackingnummern importieren

Kehrt die Richtung um: Statt den Versand aus der SelectLine an Shopify zu melden,
übernimmt FINN.ghost die in Shopify erfassten Sendungen. Zu einer vollständig
versendeten Bestellung entsteht der Versandbeleg als Nachfolger, und die
Trackingnummern werden in die Paketverwaltung geschrieben.

Das ist der Weg für Shops, in denen der Versand über Shopify oder einen dort
angebundenen Dienstleister abgewickelt wird.

<p class="callout info">Beide Richtungen schließen sich aus. Ist der Import aktiv, wird kein Versand mehr an Shopify gemeldet.</p>

### Nur Lieferstatus senden, wenn Paketnummer vorhanden

Meldet den Versand erst, wenn mindestens eine Paketnummer erfasst ist. Findet sich am
Versandbeleg keine, sucht FINN.ghost zusätzlich in den Vorgängerbelegen.

### Kunde über Versand informieren

Legt fest, ob Shopify die Versandbenachrichtigung an den Kunden schickt.
Voreingestellt ist **aus** — sinnvoll, wenn die Kundenkommunikation über die SelectLine
läuft.

## Positionen

### Versandposition immer anlegen

Normalerweise entsteht eine Versandposition nur, wenn die Bestellung Versandkosten
enthält. Mit dieser Einstellung wird sie immer angelegt, auch mit Betrag 0.

### Bezeichnung vom Versandartikel aus SelectLine verwenden

Standardmäßig übernimmt die Versandposition die Bezeichnung der Versandart aus dem
Shop. Mit dieser Einstellung gilt stattdessen die Bezeichnung des Artikels aus der
SelectLine.

### Rabattpositionen aufsummieren pro Rabattcode

Ohne diese Einstellung entsteht pro rabattierter Artikelposition eine eigene
Rabattposition. Bei einem Rabattcode über den ganzen Warenkorb ergibt das viele kleine
Zeilen. Mit der Einstellung wird pro Rabattcode **eine** Position gebildet.

## Nächster Schritt

[Zahlungs- und Versandarten](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/zahlungs-und-versandarten)

# Zahlungs- und Versandarten

Damit eine Bestellung als Beleg entstehen kann, muss FINN.ghost wissen, welche
Zahlungsbedingung und welche Lieferbedingung der SelectLine zu einer Zahlungsart und
Versandart im Shop gehört.

<!-- TODO Screenshot: images/einrichtung-zahlungsbedingungen.png -->

## Zahlungsbedingungen

<p class="callout warning">Die Liste der Zahlungsarten füllt sich erst, nachdem Bestellungen importiert wurden. Shopify bietet keine Abfrage der verfügbaren Zahlungsarten an — FINN.ghost merkt sich deshalb jede Zahlungsart, die in einer Bestellung vorkommt. Nach der Einrichtung sollte man den Bereich also erneut aufrufen und die neu erschienenen Zahlungsarten zuordnen.</p>

Zu jeder Zahlungsart gibt es vier Spalten.

### SelectLine

Die Zahlungsbedingung, die in den Beleg geschrieben wird.

### Bankbezug

Die Kasse oder Bank, die als Bankbezug im Beleg gesetzt wird. Erleichtert später den
Zahlungsabgleich in der Buchhaltung.

### Import

Normalerweise werden nur Bestellungen übernommen, deren offener Betrag 0 ist — also
vollständig bezahlte. Zahlungsarten wie **Rechnung** erreichen diesen Zustand nie; für
sie wird dieser Haken gesetzt.

<p class="callout info">Bei Shopify Plus mit B2B-Bestellungen entfällt die Prüfung ohnehin, weil dort mit Zahlungsziel gearbeitet wird.</p>

### Vorkasse

Bestellungen dieser Zahlungsart gehen in den Vorkasse-Belegtyp statt in den
Bestell-Belegtyp.

### Geschenkkarten

Mit Geschenkkarten bezahlte Anteile werden nicht als Zahlungsart behandelt, sondern als
**Rabattposition** auf den Promotion-Artikel gebucht, mit dem Hinweis auf die letzten
Zeichen der Karte. Steuer 0.

Wird eine Bestellung ausschließlich mit Geschenkkarte bezahlt, gilt die Zuordnung der
Zahlungsart `gift_card`.

## Lieferbedingungen

Hier wird jeder Versandart des Shops eine Lieferbedingung der SelectLine zugeordnet.

Die Liste kommt aus den Shopify-Versandprofilen. Zusätzlich steht immer der Eintrag
**Abholung** zur Verfügung — Shopify meldet bei Abholung im Laden den Shopnamen als
Versandart, und FINN.ghost bildet das auf diesen Eintrag ab.

<p class="callout warning">Findet sich zu einer Versandart keine Zuordnung, wird die Bestellung trotzdem importiert — der Beleg bleibt dann aber ohne Lieferbedingung. Im Protokoll steht ein Hinweis. Nach dem Anlegen neuer Versandarten im Shop lohnt deshalb ein Blick in diesen Bereich.</p>

## Versanddienstleister

Unter **Shopify → Einstellungen → Versand** lassen sich die
SelectLine-Transportdienstleister auf die Bezeichnungen abbilden, die Shopify für die
Sendungsverfolgung erwartet. Ohne Zuordnung wird die SelectLine-Bezeichnung
unverändert übergeben.

<p class="callout info">Trifft Shopify den Dienstleister nicht, zeigt es dem Kunden zwar die Paketnummer, aber keinen Verfolgungslink. Die Zuordnung lohnt sich daher für die gängigen Dienstleister.</p>

## Platzhalterartikel

Nicht jede Position einer Bestellung entspricht einem Artikel aus der SelectLine.
Versandkosten und Rabatte brauchen deshalb Platzhalterartikel, die unter
**Shopify → Einstellungen → Artikel** hinterlegt werden.

### Promotion Artikel

Auf diesen Artikel werden Rabatte, Rabattcodes und Geschenkkarten gebucht.

<p class="callout danger">Ist kein Promotion-Artikel hinterlegt, werden Rabatte stillschweigend übersprungen — der Beleg in der SelectLine ist dann teurer als die Bestellung im Shop. Das ist die häufigste Ursache für Betragsabweichungen.</p>

### Versandartikel – Standard und Ermäßigt

Auf diese Artikel werden die Versandkosten gebucht. FINN.ghost ermittelt, welche
Steuersätze in der Bestellung vorkommen, und **verteilt die Versandkosten anteilig**
nach dem jeweiligen Warenwert. Steuersätze unter 16 % laufen auf den ermäßigten
Versandartikel.

<p class="callout info">Enthält eine Bestellung Ware mit 19 % und mit 7 %, entstehen dadurch zwei Versandpositionen mit dem jeweils passenden Steuersatz. Wer das nicht möchte, aktiviert <strong>Steuer vom Versandartikel aus SelectLine verwenden</strong> — dann entsteht eine Position mit dem Steuersatz des Artikels.</p>

### Konten für Rabattpositionen

Zusätzlich lässt sich je Steuersatz ein Erlöskonto für die Rabattpositionen festlegen.
Ohne diese Angabe übernimmt die Rabattposition Konto und Steuer der vorangehenden
Artikelposition — damit landet der Rabatt auf demselben Konto wie der rabattierte
Umsatz.

## Nächster Schritt

[Sprachen und Märkte](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/sprachen-und-markte)

# Sprachen und Märkte

Shopify bündelt Länder, Währungen und Sprachen in **Märkten**. Zu jedem Markt gehört
ein **Katalog** mit einer **Preisliste** und einer **Publikation**. FINN.ghost kann
diese Struktur mit Preisen aus SelectLine-Preisgruppen versorgen.

<!-- TODO Screenshot: images/einrichtung-maerkte.png -->

## Sprachzuordnung

Unter **Shopify → Einstellungen → Sprachzuordnung** wird jeder Shop-Sprache eine
SelectLine-Sprache zugeordnet.

Übersetzt werden Produkttitel und Beschreibung aus den Fremdbezeichnungen zum Artikel.
Zusätzlich schreibt der Bestellimport die Sprache der Bestellung in den Beleg, sodass
Belegformulare in der Sprache des Kunden gedruckt werden können.

<p class="callout info">Es werden nur Titel und Beschreibung übersetzt. Metafelder, Sammlungen und Merkmalsbezeichnungen bleiben einsprachig.</p>

## Märkte

Der Bereich **Märkte** zeigt die im Shop eingerichteten Märkte mit ihren Katalogen,
Preislisten und Währungen. Er dient der Übersicht — eingerichtet werden Märkte im
Shopify-Adminbereich.

## Preiszuweisung zu Katalogen

Hier entsteht die eigentliche Zuordnung: Je Katalog wird festgelegt, aus welcher
SelectLine-**Preisgruppe** und in welcher **Währung** der Preis kommt.

Die Aufgabe *Preise exportieren* schreibt daraufhin für jeden Artikel den Preis in die
Preisliste des Katalogs und veröffentlicht den Artikel in der zugehörigen Publikation.

<p class="callout warning">Findet sich für einen Artikel in der zugeordneten Preisgruppe kein Preis, wird der Katalogpreis dieses Artikels wieder <strong>entfernt</strong>. Damit fällt der Artikel im betreffenden Markt auf den Standardpreis zurück. Wer in einem Markt bewusst nur einen Teil des Sortiments anbieten will, sollte das im Shopify-Adminbereich über die Publikation steuern, nicht über fehlende Preise.</p>

## Währungen in Bestellungen

### Präsentationswährungen

Kauft ein Kunde in einer anderen Währung als der Shop-Grundwährung, liefert Shopify
beide Beträge. Standardmäßig übernimmt FINN.ghost den Betrag in der Shop-Währung.

Trägt man eine Währung in die Liste der Präsentationswährungen ein, werden für
Bestellungen in dieser Währung stattdessen die Beträge **in der Kundenwährung** in den
Beleg geschrieben, und der Beleg erhält diese Währung.

<p class="callout info">Ergänzend lässt sich je Währung ein Fibukonto festlegen, das bei neu angelegten Kunden gesetzt wird.</p>

## Nächster Schritt

[SelectLine-Makros](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/selectline-makros)

# SelectLine-Makros

An drei Stellen kann das Modul ein SelectLine-Makro ausführen. Damit lassen sich
kundenspezifische Nachbearbeitungen ohne Programmierung einhängen. Die Felder liegen
unter **Shopify → Einstellungen → Makros**.

<!-- TODO Screenshot: images/einrichtung-makros.png -->

## Bestellung angelegt

Läuft, nachdem der Beleg vollständig aufgebaut ist — nach Kopf, allen Positionen, den
Versandkosten und der Kontenzuweisung der Rabattpositionen. Übergeben werden **Belegtyp**
und **Belegnummer**.

Das ist der Platz für alles, was mit einem fertigen Shop-Beleg passieren soll:
Kommissionierung anstoßen, Zusatzfelder befüllen, Belege drucken, eigene Prüfungen
laufen lassen.

<p class="callout danger">Läuft das Makro auf einen Fehler, wird der gerade angelegte Beleg <strong>gelöscht</strong> und die Bestellung im Shop mit dem Tag <code>ImportError</code> versehen. Sie wird dann nicht erneut versucht, bis der Tag entfernt wird. Makros an dieser Stelle sollten ihre Fehler daher selbst abfangen. Siehe <a href="sfy-bestellungen">Bestellungen</a>.</p>

## Kunde angelegt

Läuft, nachdem beim Bestellimport ein neuer Kunde entstanden ist. Übergeben wird die
**Nummer** des neuen Kunden.

Bei reinen Aktualisierungen bestehender Kunden läuft kein Makro. Und auch nicht beim
Kundenexport in den Shop — nur beim Anlegen aus einer Bestellung.

## Artikel exportieren

Soll vor dem Export **jedes einzelnen** Artikels laufen und bekommt die **Nummer** des
Artikels. Gedacht für berechnete Felder, die der Shop braucht — etwa einen
zusammengesetzten Beschreibungstext.

<p class="callout danger">Dieses Feld hat derzeit <strong>keine Wirkung</strong>. Die Schnittstelle liest an dieser Stelle die entsprechende Einstellung des Moduls FINN.webshop, nicht die hier eingetragene. Wer ein Artikelmakro braucht, sollte sich an den Support wenden — bitte nichts in dieses Feld eintragen, es würde stillschweigend ignoriert.</p>

## Hinweise

- Makronamen werden ohne Prüfung übernommen. Ein Tippfehler zeigt sich erst zur Laufzeit
  als Fehler.
- Die Makros laufen unter dem API-Benutzer aus den SelectLine-Einstellungen, nicht unter
  einem interaktiven Benutzer.
- Ein Makro, das vor jedem Artikel läuft, wird bei einem Vollexport entsprechend oft
  aufgerufen. Bei 20.000 Artikeln sind das 20.000 Aufrufe — jede Sekunde Laufzeit
  multipliziert sich.

## Nächster Schritt

[Erstinbetriebnahme](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/erstinbetriebnahme)

# Erstinbetriebnahme

Die einzelnen Übertragungen bauen aufeinander auf. Bei einem leeren Shop lohnt es sich,
die Läufe **einmal in dieser Reihenfolge** von Hand anzustoßen, unter
**Shopify → Zeitsteuerung**.

<p class="callout warning">Diese Reihenfolge gilt für die Erstbefüllung. Im laufenden Betrieb spielt sie keine Rolle mehr — dann zieht die Schnittstelle fehlende Metafelder und Sammlungen selbst nach.</p>

## Reihenfolge

### 1. Sachmerkmale und Extrafelder aktualisieren

Legt im Shop die Metafeld-Definitionen an, in denen später die SelectLine-Felder
landen. Dieser Schritt muss zuerst laufen.

<p class="callout info">Ohne die Definitionen wären die Werte am Produkt vorhanden, aber im Adminbereich nicht als gepflegte Felder sichtbar. Der Artikelexport zieht fehlende Definitionen bei Bedarf selbst nach — beim Erstlauf ist der eigene Durchgang aber schneller.</p>

### 2. Artikelgruppen exportieren

Legt die Sammlungen an, in die die Artikel später einsortiert werden.

### 3. Artikel exportieren (alle)

Der große Lauf. Er legt Produkte, Varianten, Bilder, Metafelder und Sammlungszuordnungen
an und exportiert direkt danach den Bestand jeder Variante.

<p class="callout info">Für einen ersten Eindruck kann man stattdessen <strong>Artikel exportieren (alle, ohne Bilder)</strong> starten — das ist deutlich schneller. Die Bilder holt der nächste Vollauf nach.</p>

### 4. Preise exportieren

Setzt Preis und Streichpreis je Variante und füllt die Katalogpreise der Märkte.

### 5. Bestand exportieren

Korrekturlauf über alle Artikel. Setzt außerdem den Status archivierter und
freigegebener Artikel richtig.

### 6. Exportiere Kunden

Überträgt die Kunden mit gesetztem Kundenkennzeichen — bei Shopify Plus als
Unternehmen mit Kontakten.

### 7. Dateien aktualisieren

Lädt die Journaldateien der konfigurierten Kategorien hoch und hängt sie an die
Produkte.

### 8. Bestellungen importieren

Erst zum Schluss einschalten. Vorher fehlen im Shop die Artikel, auf die sich
Bestellungen beziehen würden.

<p class="callout danger">Der erste Importlauf holt alle Bestellungen, die seit dem Einschalten geändert wurden. In einem Shop, der vorher schon live war, kann das viele Altbestellungen bedeuten. Wer das nicht will, sollte den Zeitpunkt vorher mit dem Support abstimmen.</p>

## Danach

Wenn die Erstbefüllung durchgelaufen ist, werden die Aufgaben mit einem Zeitplan
versehen. Empfehlungen dazu stehen unter
[Zeitplan der Übertragungen](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/zeitplan-der-ubertragungen).

## Kontrolle

| Prüfpunkt                      | Wo                                                            |
| ------------------------------ | ------------------------------------------------------------- |
| Anzahl der Produkte im Shop     | Shopify-Adminbereich, verglichen mit den freigegebenen Artikeln  |
| Sammlungen                      | Shopify-Adminbereich unter *Produkte → Sammlungen*                |
| Preise an Stichproben           | Produkt im Shop aufrufen, Preis mit der SelectLine vergleichen    |
| Bestände an Stichproben         | Shopify-Adminbereich unter *Produkte → Bestand*                   |
| Meldungen im Protokoll          | **Shopify → Zeitsteuerung**                                       |

<p class="callout info">Das Protokoll enthält auch Hinweise auf übersprungene Artikel. Diese Meldungen sind keine Fehler, sondern zeigen fehlende Angaben — die Liste ist eine gute Arbeitsgrundlage für die Datenpflege. Näheres unter <a href="sfy-pruefen">Wenn etwas nicht im Shop ankommt</a>.</p>

# Artikel

Wie Artikel in den Shop kommen: Freigabe, Texte, Bilder, Preise, Bestand, Gruppen und Varianten.

# Artikel im Shop veröffentlichen

Ein Artikel erscheint im Shop, sobald er freigegeben ist und die nötigen Angaben
enthält. Beides wird in der Artikelmaske gepflegt, im Shopify-Adminbereich ist nichts
zu tun.

## Freigeben

Das bei der Einrichtung festgelegte **ShopAktiv-Feld** in der Artikelmaske setzen
(unter **Shopify → Einstellungen → Artikel**). Beim nächsten Lauf der Aufgabe
*Artikel exportieren (geänderte)* geht der Artikel in den Shop.

<!-- TODO Screenshot: images/artikel-kennzeichen.png -->

## Der Status im Shop

Shopify kennt keinen einfachen Aktiv-Haken, sondern einen Status. FINN.ghost setzt ihn
so:

| Status im Shop | Wann                                                          |
| -------------- | ------------------------------------------------------------- |
| Aktiv          | freigegeben und nicht inaktiv                                  |
| Archiviert     | Freigabe entfernt oder Artikel inaktiv                          |
| Entwurf        | neu angelegt, bei aktivem *Neue Artikel als Entwurf hochladen*   |
| Nicht gelistet | Kennzeichen aus *Kennzeichen Artikel als 'Nicht gelistet'* gesetzt |

<p class="callout info">Ein Artikel wird also nie gelöscht, sondern archiviert. Bestellungen behalten damit ihre Verknüpfung, und die Adresse der Produktseite bleibt gültig.</p>

### Neue Artikel als Entwurf hochladen

Neu angelegte Produkte landen als Entwurf im Shop und sind erst sichtbar, wenn sie im
Adminbereich freigegeben werden. Das gibt Gelegenheit, Texte und Bilder redaktionell zu
prüfen.

<p class="callout warning">Solange ein Produkt im Entwurfsstatus steht, überspringt die Aufgabe <em>Bestand exportieren</em> es vollständig. Der Bestand kommt erst, wenn das Produkt aus dem Entwurf geholt wurde.</p>

## Voraussetzungen

Fehlt eine dieser Angaben, wird der Artikel übersprungen und im Protokoll vermerkt:

| Voraussetzung          | Hinweis                                                          |
| ---------------------- | ---------------------------------------------------------------- |
| Bezeichnung            | darf nicht leer sein                                              |
| Verkaufspreis          | in der eingestellten Preisgruppe                                   |
| Artikelgruppe          | außer bei aktivem *Artikelgruppen ignorieren*                       |
| nicht inaktiv          | inaktive Artikel gehen nicht in den Shop                            |

<p class="callout info">Ist der Artikel bereits im Shop und fehlt später eine dieser Angaben, wird er nicht übersprungen, sondern archiviert. So verschwinden ausgelaufene Artikel zuverlässig aus der Storefront.</p>

Für Varianten gilt eine Erleichterung: Eine Variante ohne Preis wird übersprungen, der
Hauptartikel mit den übrigen Varianten aber trotzdem angelegt.

## Wann die Übertragung läuft

| Aufgabe                                      | Umfang                                                     |
| -------------------------------------------- | ---------------------------------------------------------- |
| Artikel exportieren (geänderte)               | Artikel, die seit dem letzten Lauf angelegt oder geändert wurden |
| Artikel exportieren (geänderte, ohne Bilder)  | dasselbe ohne Bildübertragung                                |
| Artikel exportieren (alle)                    | alle freigegebenen Artikel, mit Bildern                       |
| Artikel exportieren (alle, ohne Bilder)       | alle freigegebenen Artikel, ohne Bildübertragung               |

<p class="callout warning">Als geändert gilt ein Artikel, wenn sich der Artikelstamm geändert hat. Wird nur ein Preis oder eine Fremdbezeichnung angepasst, ohne den Artikel selbst anzufassen, erkennt der Änderungslauf das nicht. Deshalb gehören die nächtlichen Läufe <em>Preise exportieren</em> und <em>Artikel exportieren (alle, ohne Bilder)</em> in den Zeitplan.</p>

Wird eine Variante geändert, überträgt die Schnittstelle automatisch den
**Hauptartikel** mit allen Varianten — einzelne Varianten lassen sich in Shopify nicht
für sich exportieren.

## Bestehende Artikel schonen

### Nur neue Artikel hochladen

Bestehende Produkte werden nur noch im Status angefasst, alles andere bleibt
unverändert. Der Weg für Shops, in denen Texte und Bilder vollständig im
Shopify-Adminbereich gepflegt werden.

### Titel dennoch aktualisieren

Ergänzt die vorige Einstellung: Der Titel und die Übersetzungen werden trotzdem
nachgezogen.

## Nicht unterstützt

<p class="callout danger">Shopify erlaubt höchstens <strong>drei</strong> Merkmale je Produkt. Ein Variantenartikel mit mehr als drei Merkmalen wird mit einer Meldung abgewiesen und gar nicht angelegt.</p>

## Weiter

- [Bezeichnungen, Texte und Bilder](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/bezeichnungen-texte-und-bilder)
- [Preise](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/preise)
- [Bestand und Verfügbarkeit](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/bestand-und-verfugbarkeit)

# Bezeichnungen, Texte und Bilder

## Titel und Beschreibung

| Im Shop            | Aus der SelectLine                                   |
| ------------------ | ---------------------------------------------------- |
| Titel              | Artikelbezeichnung                                     |
| Beschreibung       | Artikeltext, HTML bevorzugt                             |
| Anbieter           | Feld aus *Anbieterfeld*, Standard: Lieferantenbezeichnung |
| Seitentitel (SEO)  | Extrafeld `_METATITLE`                                  |
| Meta-Beschreibung  | Extrafeld `_METADESCRIPTION`                            |

### Zusatz hinter Titel

Hängt den Zusatz aus der Artikelmaske mit einem Gedankenstrich an den Titel an.

### Anbieterfeld

Bestimmt, welches Artikelfeld als Anbieter in den Shop geht. Voreingestellt ist die
Bezeichnung des Standardlieferanten.

## Übersetzungen

Titel und Beschreibung werden in die Shop-Sprachen übersetzt, sofern die
Fremdbezeichnungen zum Artikel gepflegt sind und die
[Sprachzuordnung](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/sprachen-und-markte) steht.

## Tags

Über Extrafelder lassen sich Shopify-Tags setzen. Beginnt der Name eines Extrafeldes
mit `_SFYTAG`, gilt der Rest des Namens als Tag: Aus dem Kennzeichen `_SFYTAGNeuheit`
wird der Tag `Neuheit`, wenn das Kennzeichen gesetzt ist.

<p class="callout info">Die Tags werden zugefügt und entfernt, ohne andere Tags anzutasten. Im Shop von Hand gepflegte Tags bleiben also erhalten.</p>

## Bilder

Die Artikelbilder aus der SelectLine werden in den Shop geladen, in der Reihenfolge aus
der SelectLine.

<!-- TODO Screenshot: images/artikel-bilder-storefront.png -->

Bei einem Artikel **ohne** Varianten hängen die Bilder am Produkt, das erste zusätzlich
an der Variante. Bei einem **Variantenartikel** bekommt jede Variante ihr eigenes erstes
Bild — aus den Bildern der jeweiligen Variantenartikelnummer —, und die Bilder des
Hauptartikels kommen als Produktbilder dazu.

### Maximale Bildgröße

Bilder werden vor dem Hochladen auf diese Kantenlänge verkleinert, voreingestellt 1920
Pixel. Kleinere Bilder werden nicht vergrößert.

### Nur Bilder exportieren, die mit 'Export' gekennzeichnet sind

Berücksichtigt nur Bilder, die in der SelectLine das entsprechende Kennzeichen tragen.
So lässt sich steuern, welche Bilder in den Shop gehören und welche nur intern sind.

<p class="callout warning">Bei jeder Bildübertragung werden die vorhandenen Bilder des Produkts zuerst <strong>gelöscht</strong> und dann neu geladen. Bilder, die im Shopify-Adminbereich von Hand ergänzt wurden, verschwinden dabei. Und es ist der Grund, warum ein Vollexport mit Bildern deutlich länger dauert als einer ohne — deshalb gibt es die Aufgaben ohne Bildübertragung.</p>

## Dateien zum Artikel

Über die Aufgabe *Dateien aktualisieren* lassen sich Journaldateien — Datenblätter,
Anleitungen, Zertifikate — an die Produkte hängen.

### Kategorie der Journale für Dateiupload

Legt fest, aus welchen Journalkategorien die Dateien kommen. Je Kategorie entsteht am
Produkt ein eigenes Metafeld, sodass sie im Theme getrennt ausgegeben werden können.

Erkannt werden die üblichen Dateitypen — PDF, Bilder, Video, Audio, Office-Dokumente,
CSV, ZIP. Alles andere wird als allgemeine Datei hochgeladen.

<p class="callout info">Eine Datei wird über ihren Inhalt erkannt und nur einmal hochgeladen, auch wenn sie an vielen Artikeln hängt. Wird sie in der SelectLine ausgetauscht, entsteht eine neue Datei im Shop; die alte bleibt in der Dateiverwaltung liegen und kann dort aufgeräumt werden.</p>

## Weiter

- [Sachmerkmale und Extrafelder](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/sachmerkmale-und-extrafelder)
- [Preise](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/preise)

# Preise

Shopify führt je Variante einen Preis und optional einen Streichpreis. Zusätzlich kann
je Markt-Katalog ein eigener Preis hinterlegt werden. FINN.ghost füllt beides aus
SelectLine-Preisgruppen.

## Der Standardpreis

### Preisgruppe

Bestimmt, welche Preisgruppe der SelectLine als Shop-Preis erscheint. Zur Auswahl
stehen die Preise aus der Artikelmaske.

Ist in der Artikelmaske ein **Preisverweis** eingetragen, werden die Preise des
verwiesenen Artikels verwendet.

## Aktionspreise und Streichpreis

Findet FINN.ghost zum heutigen Tag einen Aktionspreis, wird dieser als Preis gesetzt
und der reguläre Preis als **Streichpreis**. Im Shop erscheint er durchgestrichen neben
dem Aktionspreis.

Läuft die Aktion aus, setzt der nächste Preislauf den regulären Preis und entfernt den
Streichpreis.

<p class="callout warning">Aktionszeiträume laufen ohne Zutun ab, ohne dass sich der Artikel ändert. Der Änderungslauf bemerkt das deshalb nicht. Die Aufgabe <em>Preise exportieren</em> muss also regelmäßig laufen, sonst bleibt ein abgelaufener Aktionspreis im Shop stehen.</p>

## Brutto oder netto

Standardmäßig wird der Preis so übertragen, dass im Shop **Bruttopreise** stehen: Ist
die Preisgruppe eine Nettopreisgruppe, rechnet FINN.ghost mit dem gültigen Steuersatz
des Artikels hoch.

### Nettopreise

Kehrt das um: Es werden Nettopreise übertragen. Der Weg für reine B2B-Shops, in denen
Shopify die Steuer selbst aufschlägt.

### Steuerpflicht

Hat der Artikel einen gültigen Steuerschlüssel, wird die Variante im Shop als
steuerpflichtig markiert. Über die Einstellung **Steuer erzwingen** lässt sich das auch
ohne Steuerschlüssel erreichen.

## Katalogpreise für Märkte

Je Markt-Katalog lassen sich Preisgruppe und Währung festlegen. Die Aufgabe *Preise
exportieren* schreibt daraufhin den Preis in die Preisliste und veröffentlicht den
Artikel im zugehörigen Vertriebskanal.

Näheres unter [Sprachen und Märkte](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/sprachen-und-markte).

## Einkaufspreis

FINN.ghost überträgt zusätzlich die Kosten je Artikel, damit Shopify die Marge
auswerten kann.

| Einstellung                | Quelle                                            |
| -------------------------- | ------------------------------------------------- |
| *Preisgruppe für Kosten*    | Preis aus der angegebenen Preisgruppe               |
| ohne diese Einstellung      | letzter Einkaufspreis aus der Kalkulation            |

## Preise beim Bestellimport

### Artikelpreise aus SelectLine verwenden

Normalerweise übernimmt der Beleg die Preise aus der Bestellung, damit Shop und Beleg
denselben Betrag zeigen. Mit dieser Einstellung rechnet stattdessen die SelectLine die
Positionspreise selbst.

<p class="callout warning">Ist die Einstellung aus, setzt der Import zusätzlich den Belegrabatt auf 0 und leert die Rabattgruppe — sonst würde die SelectLine die Shop-Preise nachrabattieren.</p>

## Artikel ohne Preis

Ein Artikel ohne Preis in der eingestellten Preisgruppe wird übersprungen; ein bereits
vorhandenes Produkt wird archiviert.

### Ausnahme über ein Artikelfeld

Über die Einstellung **Preisprüfung deaktivieren** lässt sich ein Artikelfeld
bestimmen, mit dem einzelne Artikel trotzdem — mit Preis 0,00 — in den Shop gehen. Der
Weg für Artikel auf Anfrage.

## Weiter

[Bestand und Verfügbarkeit](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/bestand-und-verfugbarkeit)

# Bestand und Verfügbarkeit

Der Bestand ist die Angabe, die sich im Tagesgeschäft am häufigsten ändert. Deshalb gibt
es dafür eigene Aufgaben, die schneller laufen als die vollständige Artikelübertragung.

| Aufgabe                            | Umfang                                                    |
| ---------------------------------- | --------------------------------------------------------- |
| Bestand exportieren (geänderten)    | Artikel mit Bestandsbewegung seit dem letzten Lauf           |
| Bestand exportieren                 | alle Artikel, zusätzlich Statuspflege                        |

Der Bestand wird je zugeordnetem Standort gemeldet — siehe
[Läger und Standorte](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/lager-und-standorte).

## Wie der Bestand ermittelt wird

Standardmäßig gilt: **Bestand abzüglich reservierter Menge**, entweder über alle Läger
oder je zugeordnetem Lager.

### Stücklisten

Bei Stücklisten ergibt sich der Bestand aus der knappsten Komponente — also aus der
Menge, die sich tatsächlich noch zusammenstellen lässt.

### Fertigungsartikel

Bei Artikeln mit Arbeitsplan wird der eigene Bestand um die Menge erhöht, die sich aus
den vorhandenen Komponenten **noch produzieren lässt**. Der Shop zeigt damit nicht nur
das fertige Lager, sondern die realistische Lieferfähigkeit.

### Eigene Bestandsermittlung

Für Sonderfälle kann eine eigene Bestandsabfrage hinterlegt werden. Das richtet der
Support gemeinsam mit Ihnen ein.

<p class="callout warning">Der Bestand wird ganzzahlig an den Shop übergeben und dabei abgeschnitten. Bei Artikeln, die in Bruchteilen geführt werden — Meter, Kilogramm —, wird aus 2,7 m ein Bestand von 2.</p>

## Bestand auf 0 erzwingen

### Feld für Bestand 0

Über ein Artikelkennzeichen lässt sich der gemeldete Bestand auf 0 setzen, ohne den
Artikel zu archivieren. Der Artikel bleibt sichtbar, ist aber nicht bestellbar.

<p class="callout info">Das Kennzeichen wirkt auch über Stücklisten: Trägt eine Komponente das Kennzeichen, wird der Bestand der Stückliste auf 0 gesetzt. Und es wirkt über Varianten: Trägt der Hauptartikel das Kennzeichen, gilt es für alle Varianten.</p>

## Weiterverkauf bei Bestand 0

### Weiterverkaufen

Über ein Artikelkennzeichen lässt sich je Artikel festlegen, dass Shopify auch ohne
Bestand weiter verkauft. Ohne das Kennzeichen lehnt Shopify die Bestellung ab, sobald
der Bestand erschöpft ist.

## Bestandsführung abschalten

### Bestand verwenden

Globale Einstellung: Ist sie aus, führt Shopify für die Artikel keinen Bestand und
verkauft unbegrenzt.

### Feld zum Abschalten der Bestandsführung

Über ein Artikelkennzeichen lässt sich die Bestandsführung je Artikel abschalten — der
Weg für Dienstleistungen und Downloads.

<p class="callout info">Zusätzlich schaltet FINN.ghost die Bestandsführung selbst ab, wenn ein Artikel kein Lagerartikel ist und keine Stückliste hat. Damit werden Dienstleistungsartikel automatisch richtig behandelt.</p>

## Statuspflege im Bestandslauf

Die Aufgabe *Bestand exportieren* prüft zusätzlich den Status: Freigegebene Artikel
werden auf aktiv gesetzt, nicht freigegebene oder inaktive archiviert.

<p class="callout warning">Produkte im Entwurfsstatus überspringt dieser Lauf vollständig — auch beim Bestand. Ein Artikel, der als Entwurf hochgeladen wurde und dort liegen bleibt, hat im Shop dauerhaft keinen Bestand.</p>

## Weiter

[Artikelgruppen](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/artikelgruppen)

# Artikelgruppen

Die Artikelgruppen der SelectLine werden zu **manuellen Sammlungen** im Shop. Jede
Gruppe wird eine eigene Sammlung, benannt nach der Bezeichnung der Artikelgruppe.

<!-- TODO Screenshot: images/artikel-sammlungen.png -->

## Was übertragen wird

| Im Shop        | Aus der SelectLine                          |
| -------------- | ------------------------------------------- |
| Titel          | Bezeichnung der Artikelgruppe                 |
| Bild           | Bild zur Artikelgruppe, auf Maximalgröße skaliert |

<p class="callout danger">Hat eine Artikelgruppe keine Bezeichnung, bricht ihr Export mit einer Meldung ab. Die übrigen Gruppen laufen weiter.</p>

## Der ganze Zweig wird zugeordnet

Ein Artikel wird nicht nur seiner eigenen Gruppe zugeordnet, sondern **allen Gruppen
seines Zweigs** bis zur Wurzel. Ein Artikel in *Werkzeug → Handwerkzeug → Zangen*
erscheint also in allen drei Sammlungen.

<p class="callout info">Das ist der Unterschied zu einer Baumnavigation: Shopify-Sammlungen sind flach. Damit ein Kunde in der Sammlung <em>Werkzeug</em> auch die Zangen findet, muss der Artikel dort ebenfalls einsortiert sein.</p>

Fehlt eine Sammlung des Zweigs noch, legt der Artikelexport sie selbst an.

## Einstellungen

### Alternative Artikelgruppen

Statt der Artikelgruppe aus der Artikelmaske werden die zusätzlichen
Gruppenzuordnungen des Artikels verwendet. Damit kann ein Artikel in mehreren
Sortimentsästen erscheinen.

### Artikelgruppen ignorieren

Sammlungen werden gar nicht angefasst und Artikel keiner Sammlung zugeordnet. Die
Sortierung übernimmt dann der Shopify-Adminbereich, etwa über automatische Sammlungen
nach Tags.

### Freigabe je Gruppe

Über ein Feld an der Artikelgruppe lässt sich steuern, welche Gruppen in den Shop
gehören. Gruppen ohne gesetztes Kennzeichen werden übersprungen.

## Die Sammlung „Ermäßigte Steuer"

FINN.ghost legt zusätzlich eine unveröffentlichte Sammlung mit dem Namen **Ermäßigte
Steuer** an und ordnet dort alle Artikel ein, deren Steuerschlüssel dem ermäßigten Satz
entspricht.

<p class="callout info">Shopify kennt keine Steuersätze je Artikel wie die SelectLine. Der übliche Weg ist eine Sammlung, auf die im Shop eine abweichende Steuerregel gelegt wird. Genau dafür ist diese Sammlung gedacht — die Steuerregel selbst wird im Shopify-Adminbereich eingerichtet.</p>

Welcher Steuerschlüssel als ermäßigt gilt, wird bei der Einrichtung festgelegt.

## Wichtig zu wissen

<p class="callout warning">Die Zuordnung eines Artikels zu einer Sammlung wird nur <strong>hinzugefügt</strong>, nie entfernt. Wechselt ein Artikel in der SelectLine die Artikelgruppe, bleibt er zusätzlich in der alten Sammlung. Solche Altzuordnungen müssen im Shopify-Adminbereich entfernt werden.</p>

Eine umbenannte Artikelgruppe wird dagegen sauber nachgezogen: Die Zuordnung läuft über
die Gruppennummer, nur der Titel der Sammlung ändert sich.

## Weiter

[Varianten](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/varianten)

# Varianten

Variantenartikel der SelectLine werden auf das Variantensystem von Shopify abgebildet:
Der Variantenartikel wird das Produkt, die einzelnen Varianten werden dessen Varianten.
Die Merkmale werden zu Shopify-Optionen.

<!-- TODO Screenshot: images/artikel-varianten-storefront.png -->

## Voraussetzungen

| Voraussetzung                    | Hinweis                                                    |
| -------------------------------- | ---------------------------------------------------------- |
| höchstens 3 Merkmale              | Grenze von Shopify                                           |
| Merkmale an der Variante gepflegt | eine Variante ohne Merkmale wird übersprungen                 |
| Variante freigegeben und aktiv    | nur freigegebene, nicht inaktive Varianten kommen mit           |
| Preis je Variante                 | eine Variante ohne Preis wird übersprungen                     |

<p class="callout danger">Bei mehr als drei Merkmalen wird der gesamte Variantenartikel abgewiesen und gar nicht angelegt. Im Protokoll steht der Hinweis, dass der Artikel mehr als 3 Merkmale hat.</p>

## Immer über den Hauptartikel

Einzelne Varianten lassen sich nicht für sich übertragen. Ändert man eine Variante,
überträgt die Schnittstelle automatisch den Hauptartikel mit **allen** Varianten neu.

<p class="callout info">Das ist eine Eigenschaft der Shopify-Schnittstelle: Ein Produkt wird mit seiner vollständigen Variantenliste geschrieben. Deshalb dauert die Übertragung eines Variantenartikels mit vielen Varianten deutlich länger als die eines Einzelartikels.</p>

## Was je Variante übertragen wird

| Im Shop                    | Aus der SelectLine                               |
| -------------------------- | ------------------------------------------------ |
| SKU                        | Artikelnummer der Variante                         |
| Barcode                    | EAN-Nummer                                        |
| Optionswerte               | Merkmalsausprägungen, nach Merkmal sortiert          |
| Preis und Streichpreis      | Preis bzw. Aktionspreis der Variante                 |
| Gewicht                    | Gewicht der Variante                                |
| Bild                       | erstes Bild der Variantenartikelnummer                |
| Metafelder                 | Extrafelder und Sachmerkmale der Variante             |
| Bestand                    | je Standort, siehe [Bestand](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/bestand-und-verfugbarkeit)      |

<p class="callout info">Die Reihenfolge der Optionswerte ergibt sich aus der alphabetischen Sortierung der Merkmalsbezeichnungen. Größen erscheinen dadurch als <code>L, M, S, XL</code> statt <code>S, M, L, XL</code>. Die gewünschte Reihenfolge lässt sich im Shopify-Adminbereich am Produkt einstellen; sie wird von der Schnittstelle nicht überschrieben.</p>

## Entfallene Varianten

Wird eine Variante in der SelectLine inaktiv gesetzt oder die Freigabe entfernt, kommt
sie beim nächsten Lauf des Hauptartikels nicht mehr mit.

<p class="callout warning">Shopify entfernt die Variante dadurch nicht automatisch aus dem Produkt. Entfallene Varianten müssen im Shopify-Adminbereich gelöscht werden — solange sie dort stehen, bleiben sie mit ihrem letzten Bestand sichtbar.</p>

## Weiter

[Sachmerkmale und Extrafelder](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/sachmerkmale-und-extrafelder)

# Sachmerkmale und Extrafelder

Nicht jede Angabe der SelectLine hat im Shop ein passendes Standardfeld. Shopify bietet
dafür **Metafelder**. FINN.ghost legt die nötigen Definitionen an und füllt sie.

Die Aufgabe dazu heißt *Sachmerkmale und Extrafelder aktualisieren*.

<!-- TODO Screenshot: images/artikel-metafelder.png -->

## Welche Metafelder entstehen

| Bereich                    | Wo im Shop                          |
| -------------------------- | ----------------------------------- |
| Extrafelder Artikel         | Produkt und Variante                  |
| Sachmerkmale                | Produkt und Variante                  |
| Extrafelder Kunde           | Kunde                                 |
| Extrafelder Unternehmen     | Unternehmen (nur Shopify Plus)         |

Zu den Extrafeldern der Artikeltabelle kommen die Standardfelder, die im Shop nützlich
sind: Zusatz, Matchcode, Freie Texte, Freie Zahlen, Freie Daten, Freie Kennzeichen,
Dimensionstext, Infotext, Bestelltext sowie die Verweise auf Zubehör, Alternativartikel
und Dateien.

<p class="callout info">Die SEO-Felder <code>_METATITLE</code> und <code>_METADESCRIPTION</code> werden bewusst ausgelassen — sie gehen in die echten SEO-Felder des Produkts, nicht in Metafelder.</p>

## Sachmerkmale

Sachmerkmale werden als Listen-Metafelder abgebildet, sowohl am Produkt als auch an der
Variante. Ein Artikel kann damit mehrere Werte je Sachmerkmal tragen.

Am Produkt werden die Sachmerkmale des Hauptartikels **und aller seiner Varianten**
gesammelt. Der Kunde findet auf der Produktseite also die vollständige Auswahl, während
an der Variante nur ihre eigenen Werte stehen.

<p class="callout info">Damit lassen sich im Shop Filter über Sachmerkmale bauen. Wie die Filter erscheinen, richtet sich nach dem Theme und wird im Shopify-Adminbereich unter den Suchfiltern eingestellt.</p>

## Feldtypen

| SelectLine        | Metafeldtyp im Shop         |
| ----------------- | --------------------------- |
| Text              | einzeiliger Text              |
| Memo              | mehrzeiliger Text              |
| Kennzeichen       | Wahrheitswert                  |
| Datum, Zeitstempel| Datum bzw. Datum mit Uhrzeit    |
| Ganzzahl          | Ganzzahl                       |
| Kommazahl         | Dezimalzahl                    |
| Dateiliste        | Liste von Dateiverweisen        |
| Artikelliste      | Liste von Produktverweisen       |

<p class="callout warning">Ein Extrafeld mit einem nicht unterstützten Datentyp wird übersprungen und im Protokoll vermerkt. Solche Felder müssen in der SelectLine auf einen unterstützten Typ geändert werden.</p>

## Felder umbenennen

Erwartet ein Theme einen bestimmten Feldnamen, kann eine Umbenennung hinterlegt werden.
Das FINN.ghost-Feld wird dann unter dem gewünschten Namen im Shop geführt. Diese
Zuordnung richtet der Support ein.

## Änderungen an den Definitionen

Die Aufgabe legt fehlende Definitionen an. Bestehende werden **nicht** verändert.

<p class="callout warning">Wird ein Sachmerkmal in der SelectLine umbenannt, behält das Metafeld im Shop seinen alten Namen — die Werte werden weiter korrekt gefüllt, weil die Zuordnung über die interne Nummer läuft. Wer den neuen Namen im Adminbereich sehen will, muss die Definition dort umbenennen.</p>

Ein in der SelectLine gelöschtes Extrafeld bleibt im Shop bestehen und behält seinen
letzten Wert. Aufräumen ist im Shopify-Adminbereich möglich.

## Weiter

[Zubehör und Alternativartikel](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/zubehor-und-alternativartikel)

# Zubehör und Alternativartikel

Zubehör- und Alternativartikel aus der SelectLine werden als **Produktverweise** in
Metafeldern hinterlegt. Das Theme kann sie als Empfehlungen auf der Produktseite
ausgeben.

<!-- TODO Screenshot: images/artikel-zubehoer-storefront.png -->

| In der SelectLine  | Metafeld am Produkt        |
| ------------------ | -------------------------- |
| Zubehörartikel      | `Zubehoer`                  |
| Alternativartikel   | `Alternativen`              |

<p class="callout info">Anders als bei anderen Shopsystemen entsteht daraus keine fertige Anzeige. Die Metafelder enthalten die Produktverweise; die Darstellung im Shop übernimmt das Theme. Die Umsetzung dort macht Ihre Agentur oder unser Team.</p>

## Voraussetzung

Aufgenommen werden nur Artikel, die selbst für den Shop freigegeben und nicht inaktiv
sind. Ein Zubehörartikel ohne Freigabekennzeichen erscheint nicht in der Empfehlung.

Ist ein freigegebener Zubehörartikel noch nicht im Shop, überträgt die Schnittstelle ihn
bei Bedarf vorher.

<p class="callout warning">Bei umfangreichen Zubehörketten kann ein Artikelexport dadurch spürbar länger dauern als erwartet — mit jedem Artikel kommen seine noch fehlenden Zubehör- und Alternativartikel mit.</p>

Zubehör wird nur berücksichtigt, wenn in der SelectLine ein Einfügemodus gesetzt ist.

## Zubehör nach Typ trennen

Führt die SelectLine am Zubehör ein Feld für den Shop-Typ, entsteht **je Typ ein eigenes
Metafeld**. Damit lassen sich im Theme getrennte Blöcke bauen — etwa „Passendes Zubehör"
und „Ersatzteile".

Zubehör ohne Typangabe landet im allgemeinen Feld `Zubehoer`.

Ob dieses Feld in Ihrer Installation eingerichtet ist, klärt der Support.

## Wechselseitige Verweise

Verweisen zwei Artikel gegenseitig als Alternative aufeinander, erkennt FINN.ghost das
und vermeidet eine Endlosschleife: Der jeweils aufrufende Artikel wird nicht erneut als
Alternative eingetragen.

## Weiter

[Kunden](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/kunden)

# Kunden und Bestellungen

Kundendaten, B2B, Bestellabwicklung, Rückmeldungen und Gutschriften.

# Kunden

Kunden können in beide Richtungen entstehen: Bestehende SelectLine-Kunden werden in den
Shop übertragen, damit sie sich dort anmelden können. Und Kunden, die im Shop bestellen,
werden in der SelectLine angelegt.

Betreibt der Shop **Shopify Plus mit B2B**, entstehen statt einzelner Kunden
Unternehmen mit Kontakten — siehe [B2B mit Shopify Plus](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/b2b-mit-shopify-plus).

## Kunden in den Shop übertragen

Die Aufgabe heißt *Exportiere Kunden*. Beim ersten Lauf werden alle Kunden mit gesetztem
Kundenkennzeichen übertragen, danach nur noch die geänderten.

### ShopAktiv-Feld

Das Kundenfeld, das bestimmt, ob der Kunde in den Shop gehört. Zu finden unter
**Shopify → Einstellungen → Kunden**.

### Shopkundennummer-Feld

In diesem SelectLine-Feld merkt sich FINN.ghost die Shopify-Kundennummer. Beim Anlegen
wird sie dort zurückgeschrieben.

<p class="callout warning">Dieses Feld ist die Verbindung zwischen beiden Systemen. Wird es geleert, verliert die Schnittstelle die Zuordnung und legt beim nächsten Lauf einen zweiten Kunden im Shop an.</p>

Zusätzlich lassen sich weitere Felder als **Suchfelder** hinterlegen. Der Bestellimport
sucht den Kunden dann auch dort — praktisch, wenn Shop-Kundennummern historisch in
verschiedenen Feldern gepflegt wurden.

## Pflichtangaben

Ein Kunde wird übersprungen, wenn keine gültige E-Mail-Adresse vorhanden ist.

<p class="callout info">Geprüft wird auf ein <code>@</code> und darauf, dass kein Leerzeichen enthalten ist. Die übersprungenen Kunden stehen im Protokoll und sind damit eine gute Arbeitsliste für die Datenpflege.</p>

## Was übertragen wird

| Im Shop                | Aus der SelectLine                     |
| ---------------------- | -------------------------------------- |
| Vor- und Nachname       | Kundenstamm                              |
| E-Mail                 | Kundenstamm                              |
| Telefon                | Telefon 1                                |
| Währung                | Währung des Kunden                        |
| Standardadresse        | Straße, PLZ, Ort, Land, Firma, Zusätze     |
| Metafelder             | Extrafelder der Hauptadresse aus dem CRM   |

### Neue Kunden zur Kontoerstellung einladen

Standardmäßig verschickt Shopify beim Anlegen keine Einladung. Mit dieser Einstellung
erhält der Kunde eine E-Mail, über die er sein Kundenkonto aktivieren kann.

## Kunden aus Bestellungen

Bestellt jemand im Shop, der in der SelectLine noch nicht existiert, wird er angelegt.
Als Vorlage dient der **Shopkunde** — dessen Vorbelegungen werden übernommen und mit den
Bestelldaten überschrieben.

Gesucht wird der bestehende Kunde in dieser Reihenfolge:

1. über das Shopkundennummer-Feld und die zusätzlichen Suchfelder
2. über die E-Mail-Adresse — im Kundenstamm und in den CRM-Adressen
3. kein Treffer: der Kunde wird neu angelegt

<p class="callout warning">Weil die E-Mail-Adresse als zweites Kriterium gilt, laufen zwei SelectLine-Kunden mit derselben E-Mail auf denselben Shop-Kunden zusammen. In Betrieben mit einer Sammeladresse für mehrere Ansprechpartner lohnt hier ein Blick.</p>

### Nummernkreis für neue Kunden

Ist ein Nummernkreis hinterlegt, erhalten neu angelegte Shop-Kunden eine Nummer daraus —
fortlaufend ab der höchsten bereits vergebenen. Damit bleiben Shop-Kunden im Kundenstamm
erkennbar.

## Sonderfälle

### Nur Bestellungen von bekannten Kunden importieren

Findet sich kein Kunde, bricht der Import dieser Bestellung mit einem Fehler ab, statt
einen Kunden anzulegen. Der Weg für Shops mit geschlossenem Kundenkreis.

### Kein Kundenkonto anlegen

Alle Bestellungen laufen auf den Shopkunden. Sinnvoll, wenn keine Kundenpflege im ERP
gewünscht ist.

### Marktplatzbestellungen als Gastbestellungen anlegen

Bestellungen, die nicht aus dem Webshop kommen — Amazon, eBay, Kaufland —, laufen auf
den Shopkunden statt auf einen eigenen Kunden.

### Kunden in SL nicht aktualisieren

Bestehende Kunden werden beim Bestellimport nicht überschrieben. Sinnvoll, wenn die
Kundendaten im ERP als führend gelten.

### Adresse des Shopkunden verwenden

Der Beleg erhält die Adresse des Shopkunden statt der Adresse aus der Bestellung. Die
Lieferadresse aus der Bestellung wird dabei trotzdem gesetzt.

### Kundenadresse aus SL in Beleg verwenden

Umgekehrt: Der Beleg erhält die im Kundenstamm gepflegte Adresse, nicht die
Rechnungsadresse aus der Bestellung.

### Kassenbestellungen

Bestellungen aus dem Shopify-Kassensystem laufen immer auf den Shopkunden und erhalten
im Beleg den Namen *POS Kunde*.

### Shopkunde je Herkunft oder Tag

Der Shopkunde lässt sich je Verkaufskanal — Web, Amazon, eBay — und je Bestell-Tag
unterschiedlich festlegen. Damit landen Marktplatzbestellungen auf eigenen Sammelkunden
und sind in der Auswertung trennbar.

## Weiter

- [B2B mit Shopify Plus](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/b2b-mit-shopify-plus)
- [Bestellungen](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/bestellungen)

# B2B mit Shopify Plus

Shopify Plus kennt neben Endkunden auch **Unternehmen** mit mehreren Ansprechpartnern,
eigenen Adressen und Zahlungszielen. Ist B2B eingeschaltet, überträgt FINN.ghost die
SelectLine-Kunden als Unternehmen statt als einzelne Kunden.

<p class="callout info">Die Umschaltung erfolgt über eine Einstellung. Sie verändert das Verhalten des Kundenexports vollständig — vorher angelegte Einzelkunden bleiben unberührt im Shop stehen.</p>

<!-- TODO Screenshot: images/b2b-unternehmen.png -->

## Was aus einem Kunden wird

| Im Shop                     | Aus der SelectLine                        |
| --------------------------- | ----------------------------------------- |
| Unternehmen                 | Kunde, Name aus Firma oder Nachname          |
| Externe ID                  | Kundennummer                                 |
| Steuernummer                | USt-IdNr.                                     |
| Rechnungsadresse            | Adresse des Kunden                            |
| Lieferadresse               | Standardlieferadresse, sonst Rechnungsadresse   |
| Kontakte                    | CRM-Adressen zur Hauptadresse des Kunden        |
| Metafelder                  | Extrafelder des Kunden                          |

### Pflichtangaben

Straße und Land sind Pflicht, außerdem Firma oder Nachname. Fehlt eines davon, bricht
der Export dieses Kunden mit einer Meldung ab.

## Kontakte und Rollen

Jede CRM-Adresse zur Hauptadresse des Kunden wird ein Firmenkontakt. Erforderlich sind
E-Mail sowie Vor- oder Nachname; andere werden übersprungen und im Protokoll vermerkt.

Die Rollen setzt FINN.ghost so:

| Rolle im Shop      | Wer                                              |
| ------------------ | ------------------------------------------------ |
| Location admin     | der Standardansprechpartner des Kunden             |
| Ordering only      | alle weiteren Kontakte                             |

Der Standardansprechpartner wird zusätzlich als Hauptansprechpartner des Unternehmens
gesetzt.

<p class="callout warning">Ist der Kunde inaktiv oder das Kundenkennzeichen nicht gesetzt, werden allen Kontakten die Rollen <strong>entzogen</strong>. Die Kontakte bleiben bestehen, können sich aber nicht mehr anmelden und nicht mehr bestellen. Das ist der Weg, einen B2B-Kunden zu sperren.</p>

## Entfallene Kontakte

Wird eine CRM-Adresse in der SelectLine gelöscht, räumt FINN.ghost im Shop auf:

- Kontakt **ohne** Bestellungen: wird gelöscht.
- Kontakt **mit** Bestellungen: behält den Datensatz, verliert aber alle Rollen.

<p class="callout info">Damit bleibt die Bestellhistorie erhalten und der Zugang ist trotzdem entzogen.</p>

## Wenn die E-Mail schon vergeben ist

Existiert im Shop bereits ein Endkunde mit derselben E-Mail-Adresse, kann kein neuer
Firmenkontakt entstehen. FINN.ghost erkennt das, sucht den bestehenden Kunden und
**verknüpft** ihn als Kontakt mit dem Unternehmen.

## Einkaufserlebnis

Drei Einstellungen bestimmen, wie B2B-Kunden im Shop bestellen:

### Bestellung als Entwurf

Der Warenkorb wird nicht direkt zur Bestellung, sondern zu einem Bestellentwurf, der erst
geprüft und freigegeben wird.

### Lieferadresse bearbeitbar

Legt fest, ob der Kunde beim Bestellen von der hinterlegten Lieferadresse abweichen darf.

### Zahlungsbedingungsvorlage

Die Shopify-Zahlungsbedingungsvorlage, die für das Unternehmen gilt — etwa
„Zahlung innerhalb 30 Tagen".

## Bestellungen von Unternehmen

Bei B2B-Bestellungen entfällt die Prüfung auf vollständige Bezahlung, weil mit
Zahlungsziel gearbeitet wird.

FINN.ghost übernimmt zusätzlich:

- die **Rechnungsadresse des Unternehmensstandorts** anstelle der Adresse aus der
  Bestellung
- die **Steuernummer** des Standorts, was die Kontengruppe für EU-Ausland beeinflusst
- den **Ansprechpartner** im Beleg, ermittelt über den Firmenkontakt der Bestellung

<p class="callout danger">Ist der Kunde in der SelectLine inaktiv oder das Kundenkennzeichen nicht gesetzt, wird die Bestellung <strong>nicht</strong> importiert. Im Protokoll steht der Hinweis, dass der Kunde inaktiv ist. Das verhindert, dass gesperrte Kunden über den Shop weiter bestellen.</p>

## Weiter

[Bestellungen](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/bestellungen)

# Bestellungen

Die Aufgabe **Bestellungen importieren** holt Bestellungen aus dem Shop und legt sie als
Beleg in der SelectLine an.

<!-- TODO Screenshot: images/bestellung-beleg.png -->

## Welche Bestellungen abgeholt werden

Geholt wird, was sich seit dem letzten Lauf **geändert** hat — unabhängig vom Status.
Anschließend prüft FINN.ghost je Bestellung, ob sie importiert werden kann.

Eine Bestellung wird übersprungen, wenn:

| Grund                                       | Hinweis                                                  |
| ------------------------------------------- | -------------------------------------------------------- |
| Tag `ImportError`                            | ein früherer Import ist gescheitert                        |
| Tag `ImportIgnore`                           | bewusst vom Import ausgenommen                             |
| offener Betrag ungleich 0                    | noch nicht bezahlt, außer bei *Import* oder B2B              |
| keine Positionen                             | leere Bestellung                                            |
| kein Kunde                                   | außer bei Kassenbestellungen                                 |
| keine Adressen                               | außer bei Kassenbestellungen                                 |
| Beleg existiert bereits                      | erkannt über die Bestellnummer im Beleg                       |

### Die Tags ImportError und ImportIgnore

<p class="callout danger">Scheitert ein Import, setzt FINN.ghost am Shopify-Auftrag den Tag <code>ImportError</code> und versucht ihn nie wieder. Das verhindert Endlosschleifen — bedeutet aber, dass die Bestellung liegen bleibt, bis jemand eingreift.</p>

Vorgehen bei `ImportError`: Ursache im Protokoll nachlesen, in der SelectLine beheben,
dann **den Tag im Shopify-Adminbereich entfernen**. Beim nächsten Lauf wird die Bestellung
erneut versucht.

Mit `ImportIgnore` lässt sich eine Bestellung dauerhaft ausnehmen — etwa eine
Testbestellung.

## Welcher Beleg entsteht

Der Belegtyp richtet sich nach der Zahlungsart: Vorkasse-Zahlarten gehen in den
Vorkasse-Belegtyp, alle anderen in den Bestell-Belegtyp.

Der Beleg trägt die Kennung `sfy_<Bestellnummer>_<interne ID>` im dafür eingestellten
Feld, üblicherweise **Ihr Auftrag**. Daran erkennt die Schnittstelle den Beleg später
wieder.

<p class="callout warning">Dieses Feld darf an Shop-Belegen nicht verändert werden. Ohne die Kennung findet die Schnittstelle den Beleg nicht mehr und meldet Versand und Zahlung nicht zurück.</p>

## Was im Belegkopf landet

| Im Beleg                  | Aus der Bestellung                                    |
| ------------------------- | ----------------------------------------------------- |
| Ihr Auftrag               | `sfy_<Bestellnummer>_<ID>`                              |
| Kunde und Rechnungsadresse | Rechnungsadresse, bei B2B die des Unternehmensstandorts   |
| Lieferadresse             | nur wenn sie von der Rechnungsadresse abweicht             |
| Währung                   | Shop-Währung oder Kundenwährung                            |
| Preistyp                  | brutto, wenn die Bestellung Steuer enthält                  |
| Zahlungsbedingung, Bankbezug | über die Zuordnung der Zahlungsarten                     |
| Lieferbedingung           | über die Zuordnung der Versandarten                         |
| Zahlungsreferenz          | Autorisierung der erfolgreichen Transaktion                  |
| Kopf- oder Fußtext        | Notiz aus der Bestellung                                     |
| Sprache                   | über die Sprachzuordnung                                     |
| Lager und Lagerplatz      | bei echter Standorttrennung aus dem Fulfillment               |
| Auftragsdatum             | Bestelldatum, auf Wunsch mit Uhrzeit                          |

Zusätzlich lassen sich E-Mail-Adresse und Telefonnummer in eigene Belegfelder schreiben,
und Shopify-Metafelder der Bestellung auf Belegfelder abbilden.

### Zu lange Adressen

Die SelectLine begrenzt die Feldlängen: Nachname und Firma 80, Vorname 40, PLZ 10,
Telefon 30 Zeichen.

<p class="callout danger">Standardmäßig <strong>bricht der Import ab</strong>, wenn eine Angabe zu lang ist. Hinterlegt man ein Feld für zu lange Adressen, wird stattdessen gekürzt und der vollständige Originalwert in dieses Belegfeld geschrieben. Das ist die empfehlenswerte Einstellung — sonst bleiben Bestellungen mit langen Firmennamen dauerhaft liegen.</p>

## Marktplatzbestellungen

Bei Bestellungen über Amazon, eBay oder Kaufland liest FINN.ghost die
Marktplatz-Bestellnummer aus den Bestellattributen und schreibt sie in ein eigenes
Belegfeld. Damit lässt sich der Beleg der Marktplatzbestellung zuordnen.

## Positionen

Jede Position der Bestellung wird zu einer Belegposition. Die Artikelnummer wird über den
[Cache](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/der-cache) zur Shopify-Variante ermittelt, im Zweifel über die SKU.

<p class="callout danger">Findet sich die Artikelnummer nicht, wird die Bestellung mit dem Tag <code>ImportError</code> versehen und übersprungen. Im Protokoll steht der Hinweis, den Cache zu erneuern. Das ist der häufigste Grund für gescheiterte Importe.</p>

### Rabatte

Rabatte werden auf den Promotion-Artikel gebucht, mit Bezeichnung und Rabattcode. Über
*Rabattpositionen aufsummieren pro Rabattcode* entsteht statt vieler kleiner Zeilen eine
Position je Code.

### Geschenkkarten

Mit Geschenkkarte bezahlte Anteile werden ebenfalls als Rabattposition gebucht, mit den
letzten Zeichen der Karte in der Bezeichnung, Steuer 0.

### Positionsbezeichnung aus dem Shop

Über eine Einstellung lässt sich die Bezeichnung aus der Bestellung als
Positionsbezeichnung übernehmen, statt der Artikelbezeichnung aus der SelectLine.

## Versandkosten

Die Versandkosten werden **anteilig nach Steuersatz verteilt** — siehe
[Zahlungs- und Versandarten](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/zahlungs-und-versandarten). Rabatte auf die Versandkosten werden
vorher abgezogen.

## Nach der Beleganlage

### Positionsprüfung

FINN.ghost vergleicht, wie viele Positionen übergeben wurden und wie viele im Beleg
angekommen sind. Bei Abweichung gilt der Import als gescheitert.

<p class="callout info">Diese Prüfung fängt den Fall, dass die SelectLine eine Position stillschweigend verwirft — etwa wegen eines gesperrten Artikels. Ohne sie hätte man einen zu günstigen Beleg, ohne es zu merken.</p>

### Konten der Rabattpositionen

Rabattpositionen erhalten das je Steuersatz eingestellte Erlöskonto. Ohne diese Angabe
übernehmen sie Konto und Steuer der vorangehenden Artikelposition.

### Fertigungsaufträge

Ist in der SelectLine eingestellt, dass beim Speichern Fertigungsaufträge entstehen,
erzeugt FINN.ghost zu Positionen mit Arbeitsplan einen Fertigungsauftrag und verknüpft
ihn mit der Belegposition.

### Makro

Nach dem Aufbau des Belegs läuft das Makro *Bestellung angelegt*, mit Belegtyp und
Belegnummer als Parameter.

## Wenn beim Import etwas schiefgeht

Jede Bestellung wird für sich verarbeitet. Läuft eine auf einen Fehler, wird der
angefangene Beleg **gelöscht**, die Bestellung mit `ImportError` markiert und die nächste
bearbeitet.

Ein Sonderfall wird eigens behandelt: Hat der Kunde eine **Belegsperre**, erscheint eine
verständliche Meldung mit Kundennummer und Name, statt eines technischen Fehlers.

## Weiter

[Versand und Rückmeldungen](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/versand-und-ruckmeldungen)

# Versand und Rückmeldungen

Nach dem Bestellimport melden drei weitere Schritte den Fortschritt zurück in den Shop.
Sie laufen am Ende derselben Aufgabe *Bestellungen importieren*.

1. Versand und Trackingnummern
2. Bestelländerungen aus der SelectLine
3. Zahlungseingang bei Vorkasse

Berücksichtigt werden nur Belege, die aus dem Shop stammen. Von Hand erfasste Belege
bleiben unberührt.

<!-- TODO Screenshot: images/rueckmeldung-kundenkonto.png -->

## Versand melden

Erreicht ein Beleg den **Belegtyp Versand** und wird gedruckt, meldet FINN.ghost die
Bestellung im Shop als versendet und übergibt Paketnummer, Transportdienstleister und
Sendungsverfolgungslink.

Erkannt wird der Versand über den Druckvorgang. Zusätzlich lösen neu erfasste
Paketnummern eine Meldung aus, auch wenn der Beleg schon vorher gedruckt wurde.

### Nur Lieferstatus senden, wenn Paketnummer vorhanden

Meldet erst, wenn eine Paketnummer vorliegt. Findet sich am Versandbeleg keine, sucht
FINN.ghost in den Vorgängerbelegen.

### Kunde über Versand informieren

Legt fest, ob Shopify die Versandbenachrichtigung verschickt. Voreingestellt ist **aus**.

<p class="callout info">Gemeldet wird gegen das erste offene Fulfillment der Bestellung. Ist keines offen — etwa weil im Shop schon manuell versendet wurde —, unterbleibt die Meldung und das Protokoll weist darauf hin.</p>

## Trackingnummern stattdessen importieren

Läuft der Versand über Shopify, kehrt die Einstellung *Trackingnummern importieren* die
Richtung um: FINN.ghost prüft die Shop-Bestellungen und erzeugt zu vollständig
versendeten Bestellungen den **Versandbeleg als Nachfolger** in der SelectLine. Die
Trackingnummern kommen in die Paketverwaltung.

Storniert der Shop eine Bestellung, entsteht der Versandbeleg ebenfalls, damit die
Belegkette schlüssig bleibt.

<p class="callout warning">Beide Richtungen schließen sich aus. Ist der Import aktiv, wird kein Versand mehr an Shopify gemeldet.</p>

## Bestelländerungen an Shopify zurückmelden

Ist ein **Belegtyp Bestelländerungen** hinterlegt, überträgt FINN.ghost Änderungen aus
der SelectLine zurück in die Shopify-Bestellung.

Abgeglichen werden:

| Änderung in der SelectLine        | Wirkung in Shopify                          |
| --------------------------------- | ------------------------------------------- |
| Menge geändert                     | Positionsmenge wird angepasst                 |
| Position entfernt                  | Menge wird auf 0 gesetzt, Ware eingebucht      |
| Position hinzugefügt               | Artikel wird zur Bestellung hinzugefügt         |
| Versandkosten geändert             | Versandposition wird ersetzt                    |

<p class="callout danger">Das ist die einzige Stelle, an der die Schnittstelle eine Bestellung im Shop inhaltlich verändert. Der Kunde sieht die geänderte Bestellung in seinem Konto, und Shopify bucht bei entfernten Mengen den Bestand zurück. Wer das nicht möchte, lässt den Belegtyp leer.</p>

Berücksichtigt werden nur Belege, die **nicht** von der Schnittstelle selbst bearbeitet
wurden — eigene Änderungen lösen also keine Rückmeldung aus. Und nur, wenn sich
tatsächlich etwas geändert hat.

<p class="callout info">Rabattpositionen bleiben außen vor. Sie entstehen aus Shopify-Rabatten und würden beim Zurückschreiben doppelt gezählt.</p>

## Zahlungseingang bei Vorkasse

Ist ein Vorkassebeleg in der SelectLine als gezahlt verbucht, markiert FINN.ghost die
Bestellung im Shop als bezahlt. Der Kunde sieht, dass seine Überweisung angekommen ist.

## Erster Lauf nach der Einrichtung

Beim allerersten Lauf wird nichts rückwirkend gemeldet. Die Schnittstelle merkt sich ab
diesem Zeitpunkt, was neu ist.

<p class="callout info">Das ist Absicht: Sonst würde die Inbetriebnahme alle historischen Belege an den Shop melden und Kunden alte Versandbestätigungen erhalten.</p>

## Weiter

[Gutschriften und Storni](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/gutschriften-und-storni)

# Gutschriften und Storni

Erstattet man im Shopify-Adminbereich einen Betrag oder storniert eine Bestellung, kann
FINN.ghost daraus in der SelectLine die passende Belegkette erzeugen: Rechnung als
Vorgänger und darauf die Gutschrift.

<p class="callout warning">Diese Verarbeitung ist standardmäßig <strong>ausgeschaltet</strong>. Sie greift tief in die Belegkette ein und erzeugt Belege ohne weitere Rückfrage. Vor dem Einschalten sollte der Ablauf mit dem Support besprochen und in einem Testmandanten geprüft werden.</p>

## Was passiert

Zu jeder Rückerstattung im Shop:

1. Existiert noch keine **Rechnung** zur Bestellung, wird sie als Nachfolger des Auftrags
   erzeugt — mit genau den erstatteten Positionen und Mengen.
2. Darauf entsteht eine **Gutschrift**, verknüpft als Nachfolger der Rechnung.
3. Die Gutschrift erhält die Shopify-Erstattungsnummer im Feld *Ihr Zeichen*, die
   Zahlungsreferenz der Erstattung und die Notiz aus dem Shop als Kopftext.

Sind damit **alle** Positionen der Rechnung gutgeschrieben, werden zusätzlich die
Versandkosten gutgeschrieben.

<p class="callout info">Über <em>Ihr Zeichen</em> erkennt FINN.ghost eine bereits verarbeitete Erstattung. Eine Erstattung wird deshalb nie doppelt gutgeschrieben, auch wenn die Bestellung mehrfach abgeholt wird.</p>

## Zwei Belegtypen für Gutschriften

| Fall                                        | Belegtyp                          |
| ------------------------------------------- | --------------------------------- |
| Ware wird zurück ins Lager gebucht           | Belegtyp Gutschrift                 |
| Ware wird nicht zurückgebucht                | Belegtyp Gutschrift ohne Einlagerung  |

Shopify unterscheidet beim Erstatten, ob die Ware wieder eingelagert wird. Ist ein
zweiter Belegtyp hinterlegt, folgt FINN.ghost dieser Unterscheidung — sonst gilt für
beide Fälle derselbe Belegtyp.

## Wann geprüft wird

Auf Erstattungen wird geprüft, wenn eine Bestellung **vollständig storniert** ist — also
alle Positionen zurückgegeben oder eingelagert wurden. Zusätzlich beim Import der
Trackingnummern, falls dieser Weg aktiv ist.

## Voraussetzungen und Grenzen

<p class="callout danger">Die erstatteten Positionen müssen im Auftrag mit ausreichender offener Menge vorhanden sein. Ist eine Position dort nicht auffindbar — etwa weil sie in der SelectLine gelöscht oder bereits vollständig verwendet wurde —, bricht die Verarbeitung mit einer Meldung ab und es entsteht keine Gutschrift.</p>

Weitere Punkte:

- Erstattungen **ohne Positionen** — etwa eine reine Betragserstattung als Kulanz — werden
  übersprungen und im Protokoll vermerkt. Solche Fälle müssen in der SelectLine von Hand
  gebucht werden.
- Serien- und Chargennummern sowie Lager und Lagerplatz werden aus dem Lagerprotokoll der
  Ursprungsposition übernommen.
- Teilerstattungen sind möglich; es wird die erstattete Menge verwendet.

## Empfehlung

Für die meisten Betriebe ist der sinnvolle Weg, Gutschriften in der SelectLine zu buchen
und im Shop nur die Zahlung zu erstatten. Die automatische Verarbeitung lohnt sich vor
allem bei hohem Retourenvolumen und sauber geführten Belegketten.

## Weiter

[Zeitplan der Übertragungen](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/zeitplan-der-ubertragungen)

# Laufender Betrieb

Zeitplan, Cache, Vorgehen bei fehlenden Daten und häufige Fragen.

# Zeitplan der Übertragungen

Unter **Shopify → Zeitsteuerung** wird festgelegt, wie oft jede Aufgabe läuft. Auf
derselben Seite stehen das Protokoll, der Zeitpunkt der letzten Ausführung und der
nächste geplante Termin.

<!-- TODO Screenshot: images/betrieb-zeitsteuerung.png -->

## Die Aufgaben

| Aufgabe                                       | Was sie tut                                             |
| --------------------------------------------- | ------------------------------------------------------- |
| Artikelgruppen exportieren                     | Sammlungen anlegen und aktualisieren                      |
| Artikel exportieren (geänderte)                | geänderte Artikel mit Bildern                              |
| Artikel exportieren (geänderte, ohne Bilder)   | dasselbe ohne Bildübertragung                              |
| Artikel exportieren (alle)                     | Vollexport mit Bildern                                     |
| Artikel exportieren (alle, ohne Bilder)        | Vollexport ohne Bilder                                      |
| Preise exportieren                             | Preis, Streichpreis und Katalogpreise                        |
| Bestand exportieren (geänderten)               | Bestände mit Bewegung seit dem letzten Lauf                   |
| Bestand exportieren                            | alle Bestände, zusätzlich Statuspflege                        |
| Bestellungen importieren                       | Bestellungen holen, Versand und Zahlung zurückmelden           |
| Sachmerkmale und Extrafelder aktualisieren      | Metafeld-Definitionen anlegen                                 |
| Exportiere Kunden                              | Kunden bzw. Unternehmen übertragen                             |
| Dateien aktualisieren                          | Journaldateien hochladen und zuordnen                          |
| Cache aktualisieren                            | Zuordnungstabelle neu aufbauen, siehe [Der Cache](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/der-cache)    |

## Die Aufgaben laufen nacheinander

Das ist der wichtigste Punkt bei der Planung: Aufgaben laufen **nicht gleichzeitig**.
Startet eine, während eine andere arbeitet, wartet sie.

<p class="callout danger">Läuft ein Vollexport aller Artikel mehrere Stunden, warten in dieser Zeit alle anderen Aufgaben — auch der Bestellimport. Vollexporte gehören daher auf eine feste Uhrzeit in der Nacht und nicht in ein Intervall.</p>

Ein Start von Hand über die Oberfläche umgeht das Warten und läuft sofort.

## Shopify gibt das Tempo vor

Shopify begrenzt die Anzahl der Anfragen. FINN.ghost pausiert selbstständig, wenn das
Kontingent knapp wird.

<p class="callout info">Deshalb lässt sich ein Vollexport nicht durch kürzere Intervalle beschleunigen — man erreicht nur, dass sich die Läufe gegenseitig blockieren. Bei großen Sortimenten ist die Nacht der richtige Ort für Vollläufe.</p>

## Empfehlung für einen mittelgroßen Shop

| Aufgabe                                      | Empfehlung          | Begründung                                          |
| -------------------------------------------- | ------------------- | --------------------------------------------------- |
| Bestellungen importieren                      | alle 5 Minuten       | Bestellungen sollen zeitnah im ERP stehen             |
| Bestand exportieren (geänderten)              | alle 5 Minuten       | häufigste Änderung im Tagesgeschäft                    |
| Artikel exportieren (geänderte, ohne Bilder)  | alle 15 Minuten      | Texte und Stammdaten zeitnah, ohne Bildlast            |
| Artikel exportieren (geänderte)               | stündlich            | zieht die Bilder nach                                  |
| Preise exportieren                            | stündlich            | erfasst ablaufende Aktionspreise                        |
| Exportiere Kunden                             | stündlich            |                                                       |
| Dateien aktualisieren                         | nachts, feste Zeit   | ändert sich selten                                     |
| Artikelgruppen exportieren                    | nachts, feste Zeit   | ändert sich selten                                     |
| Sachmerkmale und Extrafelder aktualisieren    | nachts, feste Zeit   | nur bei Strukturänderungen relevant                     |
| Bestand exportieren                           | nachts, feste Zeit   | Korrekturlauf, pflegt auch den Status                    |
| Artikel exportieren (alle, ohne Bilder)       | nachts, feste Zeit   | Korrekturlauf                                           |
| Cache aktualisieren                           | nachts, feste Zeit   | siehe [Der Cache](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/der-cache)                             |
| Artikel exportieren (alle)                    | nur von Hand         | läuft je nach Artikelzahl viele Stunden                   |

## Warum die nächtlichen Korrekturläufe wichtig sind

Der Änderungslauf erkennt Artikel daran, dass sich der Artikelstamm geändert hat. Zwei
Dinge entgehen ihm:

- **Preisänderungen und ablaufende Aktionen** — dafür gibt es *Preise exportieren*.
- **Alles, was sich nur in Nebentabellen ändert** — dafür der nächtliche Vollauf ohne
  Bilder.

<p class="callout warning">Ohne diese Läufe können Änderungen dauerhaft im Shop fehlen. Besonders auffällig bei Aktionspreisen: Eine abgelaufene Aktion bleibt im Shop stehen, bis der Preislauf sie korrigiert.</p>

## Was im Protokoll steht

Das Protokoll zeigt den Fortschritt, übersprungene Datensätze und Fehler.

<p class="callout warning">Ein Lauf gilt als erfolgreich beendet, auch wenn alle Datensätze übersprungen wurden. Der Abschluss allein ist also kein Nachweis dafür, dass alles im Shop angekommen ist — dafür muss man ins Protokoll schauen.</p>

Siehe [Wenn etwas nicht im Shop ankommt](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/wenn-etwas-nicht-im-shop-ankommt).

# Der Cache

Shopify vergibt für jedes Produkt, jede Variante, jede Sammlung und jedes Metafeld eine
eigene interne Nummer. Diese Nummern stehen nirgends in der SelectLine. FINN.ghost führt
deshalb eine eigene Zuordnungstabelle — den **Cache**.

<p class="callout info">Der Cache ist keine Kopie der Daten, sondern nur ein Verzeichnis: „SelectLine-Artikel 4711 ist im Shop das Produkt mit der Nummer 123456789". Ohne diesen Eintrag findet die Schnittstelle den Artikel im Shop nicht wieder.</p>

## Was im Cache steht

| Zuordnung                     | Wofür sie gebraucht wird                            |
| ----------------------------- | --------------------------------------------------- |
| Artikelnummer → Produkt        | Artikel wiederfinden statt doppelt anlegen             |
| Artikelnummer → Variante        | Preis und Bestand setzen                               |
| Artikelnummer → Sammlungen      | Zuordnung nicht doppelt anlegen                        |
| Artikelgruppe → Sammlung        | Sammlung wiederfinden                                  |
| Sachmerkmal → Metafeld          | Definition nicht doppelt anlegen                        |
| Extrafeld → Metafeld            | Definition nicht doppelt anlegen                        |
| Kundennummer → Unternehmen       | B2B-Unternehmen wiederfinden                            |
| CRM-Adresse → Firmenkontakt      | B2B-Kontakte wiederfinden                               |
| Zahlungsarten                    | Liste für die Zuordnung der Zahlungsbedingungen          |

## Wann er erneuert werden muss

<p class="callout danger">Immer, wenn im Shopify-Adminbereich Produkte, Varianten oder Sammlungen <strong>gelöscht oder von Hand angelegt</strong> wurden. Der Cache weiß davon nichts.</p>

Die Folgen eines veralteten Caches sind typisch und gut erkennbar:

| Symptom                                                      | Ursache                                           |
| ------------------------------------------------------------ | ------------------------------------------------- |
| Artikel entsteht im Shop doppelt                              | Produkt gelöscht, Cache zeigt noch darauf            |
| Bestellimport meldet „Artikelnummer nicht gefunden"           | Variante nicht im Cache                             |
| Preis- oder Bestandslauf meldet „VariantID nicht gefunden"     | Variante nicht im Cache                             |
| Sammlungszuordnung entsteht doppelt                            | Sammlung im Shop neu angelegt                        |

## Wie man ihn erneuert

Die Aufgabe **Cache aktualisieren** unter **Shopify → Zeitsteuerung** starten.

Sie verwirft die Tabelle und baut sie vollständig aus dem Shop neu auf: alle Sammlungen,
alle Produkte mit ihren Varianten, alle Metafeld-Definitionen und — bei Shopify Plus —
alle Unternehmen mit ihren Kontakten.

<p class="callout warning">Das ist ein vollständiger Durchlauf durch den Shop und dauert bei großen Sortimenten entsprechend lange. Während er läuft, warten alle anderen Aufgaben. Der Lauf gehört deshalb in die Nacht — und nach jedem größeren Eingriff im Shopify-Adminbereich einmal von Hand angestoßen.</p>

Die Zuordnung eines Produkts erfolgt über die SKU seiner ersten Variante. Ist das ein
Variantenartikel, wird der Hauptartikel aus der SelectLine ermittelt.

## Unbekannte Produkte archivieren

### Unbekannte Produkte archivieren

Ist diese Einstellung aktiv, archiviert der Cache-Lauf zusätzlich alle Produkte, die

- keiner SelectLine-Artikelnummer zuzuordnen sind, oder
- deren Artikel nicht mehr für den Shop freigegeben ist.

<p class="callout danger">Damit werden auch Produkte archiviert, die absichtlich nur im Shop existieren — etwa reine Shop-Artikel ohne Gegenstück in der SelectLine. Vor dem Einschalten prüfen, ob es solche Produkte gibt.</p>

## Der Cache und die Datensicherung

Der Cache liegt als Datei im Arbeitsverzeichnis des Dienstes. Er ist **kein**
schützenswerter Datenbestand: Geht er verloren, baut die Aufgabe *Cache aktualisieren*
ihn vollständig neu auf.

<p class="callout warning">Nach einem Serverumzug oder einer Neuinstallation ist der Cache leer. Bevor irgendein Artikel- oder Bestellauf startet, muss deshalb <em>Cache aktualisieren</em> durchgelaufen sein — sonst entstehen alle Produkte im Shop doppelt.</p>

## Weiter

[Wenn etwas nicht im Shop ankommt](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/wenn-etwas-nicht-im-shop-ankommt)

# Wenn etwas nicht im Shop ankommt

Die meisten Fälle lassen sich in wenigen Minuten selbst klären. Diese Seite geht die
häufigsten Situationen der Reihe nach durch.

## Ein Artikel fehlt im Shop

### 1. Ist das ShopAktiv-Feld gesetzt?

In der Artikelmaske das bei der Einrichtung vereinbarte Kennzeichen prüfen. Das ist mit
Abstand die häufigste Ursache.

### 2. Ist der Artikel inaktiv?

Inaktive Artikel gehen nicht in den Shop.

### 3. Steht das Produkt im Shop als Entwurf?

Bei aktivem *Neue Artikel als Entwurf hochladen* landet ein neuer Artikel als Entwurf und
ist nicht sichtbar, bis er im Adminbereich freigegeben wird. Solange er dort steht,
überspringt ihn auch der Bestandslauf.

### 4. Läuft die Aufgabe überhaupt?

Unter **Shopify → Zeitsteuerung** nachsehen, ob *Artikel exportieren (geänderte)* ein
Intervall hat und wann sie zuletzt gelaufen ist. Steht die Aufgabe dauerhaft auf wartend,
blockiert ein großer Lauf.

### 5. Was sagt das Protokoll?

Im Protokoll nach der Artikelnummer suchen:

| Meldung enthält                  | Bedeutung                                                  |
| -------------------------------- | ---------------------------------------------------------- |
| keine Bezeichnung                 | die Artikelbezeichnung ist leer                              |
| ist nicht ShopAktiv               | Freigabekennzeichen nicht gesetzt                             |
| ist Inaktiv                       | Artikel ist inaktiv                                           |
| hat kein Preis                    | kein Preis in der eingestellten Preisgruppe                     |
| hat keine Artikelgruppe           | keine Gruppe zugeordnet                                        |
| mehr als 3 Merkmale               | Grenze von Shopify, Variantenartikel wird abgewiesen             |
| Variante … hat keine Merkmale      | Merkmale an der Variante fehlen                                 |

## Ein Artikel ist doppelt im Shop

Fast immer ein veralteter Cache: Das Produkt wurde im Adminbereich gelöscht oder von Hand
angelegt.

Vorgehen: Das überzählige Produkt im Shopify-Adminbereich löschen, dann
*Cache aktualisieren* starten. Siehe [Der Cache](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/der-cache).

## Ein geänderter Preis kommt nicht an

Wurde nur der Preis geändert, ohne den Artikel selbst anzufassen, erkennt der
Änderungslauf das nicht. Die Aufgabe *Preise exportieren* von Hand starten oder auf den
nächsten geplanten Lauf warten.

Dasselbe gilt für **abgelaufene Aktionspreise**: Sie verschwinden erst mit dem nächsten
Preislauf aus dem Shop.

## Der Bestand stimmt nicht

| Prüfpunkt                        | Hinweis                                                     |
| -------------------------------- | ----------------------------------------------------------- |
| Standortzuordnung                 | ohne Zuordnung wird kein Bestand übertragen                    |
| Produkt im Entwurfsstatus         | wird vom Bestandslauf übersprungen                              |
| Bestandsführung abgeschaltet       | global oder über das Artikelkennzeichen                         |
| Feld für Bestand 0                | Kennzeichen am Artikel oder an einer Stücklistenkomponente        |
| Nachkommastellen                  | der Bestand wird abgeschnitten, 2,7 wird zu 2                    |
| reservierte Menge                 | wird standardmäßig abgezogen                                     |

## Eine Bestellung fehlt in der SelectLine

### 1. Hat die Bestellung den Tag ImportError?

Im Shopify-Adminbereich nachsehen. Ist der Tag gesetzt, ist ein früherer Import
gescheitert und wird **nicht wiederholt**.

Vorgehen: Ursache im Protokoll nachlesen, in der SelectLine beheben, dann den Tag
**entfernen**. Beim nächsten Lauf wird die Bestellung erneut versucht.

### 2. Hat die Bestellung den Tag ImportIgnore?

Dann ist sie bewusst ausgenommen.

### 3. Ist die Bestellung bezahlt?

Nur vollständig bezahlte Bestellungen werden importiert. Für Zahlungsarten wie Rechnung
muss der Haken *Import* bei der Zahlungsart gesetzt sein — siehe
[Zahlungs- und Versandarten](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/zahlungs-und-versandarten).

### 4. Bekannte Ursachen

| Ursache                                     | Erkennbar an                                       |
| ------------------------------------------- | -------------------------------------------------- |
| Artikelnummer nicht im Cache                 | Meldung „Bitte Cache erneuern"                       |
| Adressangabe zu lang                         | Meldung über die Feldlänge                            |
| Kunde hat Belegsperre                         | Meldung mit Kundennummer und Name                     |
| Kunde inaktiv (B2B)                           | Meldung, dass der Kunde inaktiv ist                    |
| Shopkunde nicht definiert                     | Abbruch mit entsprechendem Hinweis                     |
| Positionsanzahl stimmt nicht                  | Meldung über abweichende Positionsanzahl                |

## Der Belegbetrag weicht von der Bestellung ab

Häufigste Ursache: Es ist kein **Promotion Artikel** hinterlegt. Rabatte und
Geschenkkarten werden dann übersprungen, und der Beleg ist teurer als die Bestellung.
Siehe [Zahlungs- und Versandarten](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/zahlungs-und-versandarten).

Zweite Möglichkeit: *Artikelpreise aus SelectLine verwenden* ist aktiv. Dann rechnet die
SelectLine die Preise selbst, und Abweichungen zum Shop sind möglich.

## Der Versand wird nicht gemeldet

| Prüfpunkt                        | Hinweis                                                    |
| -------------------------------- | ---------------------------------------------------------- |
| Belegtyp Versand hinterlegt       | ohne diese Angabe wird nichts gemeldet                       |
| Beleg gedruckt                    | der Druck löst die Meldung aus                                |
| Paketnummer vorhanden             | bei aktivem *Nur Lieferstatus senden, wenn Paketnummer*        |
| Kennung im Feld *Ihr Auftrag*      | ohne `sfy_…` findet die Schnittstelle den Beleg nicht           |
| offenes Fulfillment in Shopify     | wurde im Shop schon manuell versendet, unterbleibt die Meldung  |
| Trackingnummern importieren        | ist diese Einstellung aktiv, wird nichts gemeldet                |

## Regelmäßige Kontrolle

Zwei Auswertungen, die sich im Alltag bewährt haben:

- **Bestellungen mit ImportError:** im Shopify-Adminbereich nach diesem Tag filtern. Die
  Liste sollte leer sein; jeder Eintrag ist eine Bestellung, die nicht im ERP steht.
- **Freigegebene Artikel ohne Shop-Eintrag:** die Anzahl der Artikel mit
  Freigabekennzeichen mit der Produktanzahl im Shop vergleichen. Die Differenz sind die
  Artikel mit unvollständigen Daten.

## Wenn es dabei bleibt

Wenden Sie sich an den Support und halten Sie bereit:

- die betroffene Artikel-, Kunden- oder Bestellnummer
- den Auszug aus dem Protokoll zum Zeitpunkt des Laufs
- welche Aufgabe zuletzt gelaufen ist
- ob zwischenzeitlich im Shopify-Adminbereich Produkte geändert wurden

# Häufige Fragen

## Muss ich im Shopify-Adminbereich noch etwas pflegen?

Im Normalfall nicht. Produkte, Preise, Bestände, Sammlungen, Metafelder und Kunden kommen
aus der SelectLine. Im Shop pflegt man das, was dort hingehört: Navigation, Inhaltsseiten,
Theme, Versandprofile, Zahlungsarten, Steuerregeln und Märkte.

## Was passiert, wenn ich ein Produkt im Shop von Hand ändere?

Bei der nächsten Übertragung wird die Änderung überschrieben. Das betrifft Titel,
Beschreibung, Preise, Bestand, Bilder, Metafelder und Sammlungszuordnungen.

<p class="callout info">Wer Texte oder Bilder im Shop redaktionell pflegen möchte, nutzt <strong>Nur neue Artikel hochladen</strong> — dann bleiben bestehende Produkte unangetastet.</p>

## Darf ich Produkte im Shop löschen?

Besser nicht. Nach dem Löschen zeigt der Cache auf ein Produkt, das es nicht mehr gibt,
und der Artikel entsteht doppelt.

<p class="callout warning">Wenn doch: anschließend <em>Cache aktualisieren</em> starten. Der bessere Weg ist, das Freigabekennzeichen in der SelectLine zu entfernen — dann wird das Produkt archiviert und alles bleibt konsistent.</p>

## Wie bekomme ich einen Artikel aus dem Shop heraus?

Das Freigabekennzeichen entfernen. Der Artikel wird dann archiviert, nicht gelöscht. Damit
bleiben bestehende Bestellungen und die Adresse der Produktseite gültig.

## Warum ist mein Variantenartikel nicht im Shop?

Wahrscheinlich hat er mehr als drei Merkmale — Shopify erlaubt nur drei. Der Artikel wird
dann vollständig abgewiesen. Im Protokoll steht der Hinweis.

## Warum stehen die Größen in der falschen Reihenfolge?

Die Optionswerte werden alphabetisch nach Merkmalsbezeichnung übertragen, also
`L, M, S, XL`. Die gewünschte Reihenfolge lässt sich im Shopify-Adminbereich am Produkt
einstellen und wird von der Schnittstelle nicht überschrieben.

## Ein Kunde findet einen Artikel in der Sammlung nicht, obwohl er zur Untergruppe gehört

Sollte nicht vorkommen: Ein Artikel wird allen Sammlungen seines Zweigs zugeordnet. Wenn
doch, den Artikel einmal neu exportieren.

Der umgekehrte Fall kommt häufiger vor — ein Artikel steht **zusätzlich** in einer alten
Sammlung, weil er in der SelectLine die Gruppe gewechselt hat. Altzuordnungen werden nicht
entfernt und müssen im Adminbereich aufgeräumt werden.

## Sehen B2B-Kunden ihre eigenen Preise?

Über Märkte und Kataloge, ja. Je Katalog wird eine SelectLine-Preisgruppe zugeordnet —
siehe [Sprachen und Märkte](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/sprachen-und-markte). Kundenindividuelle Preise je Kunde
kennt Shopify nicht.

## Warum steht bei einem Artikel ein Bestand von 2, obwohl 2,7 Meter da sind?

Der Bestand wird ganzzahlig an den Shop übergeben und dabei abgeschnitten. Bei Artikeln in
Bruchteilen ist das eine bewusste Sicherheitsreserve.

## Kann ich einen Zeitraum erneut übertragen?

Ja. Die Schnittstelle merkt sich zu jeder Aufgabe, bis wann sie zuletzt gelaufen ist.
Dieser Stand lässt sich zurücksetzen — das erfordert einen Eingriff in die Konfiguration
bei gestopptem Dienst, bitte über den Support.

Für Artikel, Preise und Bestände geht es einfacher: Dafür genügen die Vollläufe.

## Wie lange dauert eine Vollübertragung?

Das hängt an der Artikelanzahl, an den Bildern und am Anfragekontingent von Shopify. Als
Anhaltspunkt: Ein Vollauf ohne Bilder ist ein Vielfaches schneller als einer mit Bildern.
Beschleunigen lässt sich das nicht — das Tempo gibt Shopify vor.

## Was bedeutet die Kennung `sfy_…` im Feld „Ihr Auftrag"?

Daran erkennt die Schnittstelle Belege, die aus dem Shop stammen. Enthalten sind die
Bestellnummer und die interne Shopify-Nummer.

<p class="callout warning">Dieses Feld darf an Shop-Belegen nicht verändert werden. Ohne die Kennung findet die Schnittstelle den Beleg nicht mehr und meldet Versand und Zahlung nicht zurück.</p>

## Kann die Schnittstelle eine Bestellung im Shop ändern?

Ja, wenn ein **Belegtyp Bestelländerungen** hinterlegt ist. Dann werden Mengenänderungen,
entfernte und hinzugefügte Positionen sowie geänderte Versandkosten aus der SelectLine
zurück in die Bestellung geschrieben. Siehe
[Versand und Rückmeldungen](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/versand-und-ruckmeldungen).

Ohne diese Einstellung verändert die Schnittstelle Bestellungen nur im Status.

## Werden Retouren automatisch verarbeitet?

Nur, wenn die Gutschriftverarbeitung ausdrücklich eingeschaltet ist — standardmäßig ist
sie aus. Siehe [Gutschriften und Storni](https://wiki.dako-it.com/books/finnghost-fur-shopify/page/gutschriften-und-storni).

## Wer hat die Änderungen im Shop vorgenommen?

Die Schnittstelle arbeitet mit der eigenen App, die bei der Einrichtung im
Shopify-Adminbereich angelegt wurde. In der Änderungshistorie erscheint deshalb diese App
und nicht ein einzelner Mitarbeiter.

## Wo finde ich heraus, was gerade läuft?

**Shopify → Zeitsteuerung.** Dort steht zu jeder Aufgabe, ob sie läuft oder wartet, wann
sie zuletzt gelaufen ist und wann sie das nächste Mal fällig ist. Darunter das Protokoll.