# Steuern für wiederkehrende Zahlungen erheben So erheben und erklären Sie Steuern für wiederkehrende Zahlungen. Mit Stripe Tax können Sie den Steuerbetrag auf Ihre wiederkehrenden Zahlungen berechnen, wenn Sie Stripe Billing verwenden. Verwenden Sie die Standortdaten Ihrer Kundinnen und Kunden, um eine Vorschau des Steuerbetrags zu erhalten, bevor Sie ein Abonnement erstellen, und erstellen Sie es dann mit aktiviertem Stripe Tax, wenn Ihr Kunde/Ihre Kundin bereit ist, zu zahlen. Stripe Tax ist in Stripe Billing integriert und verarbeitet automatisch Steuerberechnungen mit Ihrem [Preismodell](https://docs.stripe.com/products-prices/pricing-models.md), [anteilmäßigen Verrechnungen](https://docs.stripe.com/billing/subscriptions/prorations.md), [Rabatten](https://docs.stripe.com/billing/subscriptions/coupons.md), [Testversionen](https://docs.stripe.com/billing/subscriptions/trials.md) usw. #### Customer v1 Ein Diagramm, das eine allgemeine Übersicht über eine Integration von Stripe Tax und Billing mit Customer v1 bietet. (See full diagram at https://docs.stripe.com/tax/subscriptions) In diesem Leitfaden wird davon ausgegangen, dass Sie Stripe Tax und Billing zum ersten Mal einrichten. Erfahren Sie, wie Sie [bestehende Abonnements aktualisieren](https://docs.stripe.com/tax/subscriptions/update.md). Wenn Sie Stripe Checkout verwenden, um neue Abonnements zu erstellen, informieren Sie sich darüber, wie Sie [automatisch Steuern für Checkout-Sitzungen einziehen](https://docs.stripe.com/tax/checkout.md), oder sehen Sie sich das kurze Video unten an: [Watch on YouTube](https://www.youtube.com/watch?v=3QBRs4IfDNo) ## Steuern und Gesamtsumme schätzen [Serverseitig] #### Vor der Adresserfassung Wenn Kundinnen/Kunden zum ersten Mal Ihren Bezahlvorgang durchlaufen, liegen Ihnen möglicherweise noch keine Adressdaten vor. [Erstellen Sie in diesem Fall eine Rechnung](https://docs.stripe.com/api/invoices/create_preview.md) und legen Sie [customer_details.tax.ip_address](https://docs.stripe.com/api/invoices/create_preview.md#create_create_preview-customer_details-tax-ip_address) fest, damit Stripe sie anhand ihrer IP-Adresse ermitteln kann. > In den meisten Fällen kann Stripe eine IP-Adresse in einen physischen Bereich auflösen, aber die Genauigkeit variiert und spiegelt möglicherweise nicht den tatsächlichen Standort Ihres Kunden/Ihrer Kundin wider. Wir empfehlen, sich nicht auf die IP-Adresse eines Kunden/einer Kundin zu verlassen, um seine/ihre Adresse über eine anfängliche Schätzung hinaus zu bestimmen. ```curl curl https://api.stripe.com/v1/invoices/create_preview \ -u "<>:" \ -d "automatic_tax[enabled]=true" \ -d "customer_details[tax][ip_address]={{IP_ADDRESS}}" \ -d "subscription_details[items][0][price]={{PRICE_ID}}" ``` #### Nach der Adresserfassung Wenn Ihr Kunde/Ihre Kundin seine/ihre Adressdaten eingibt, legen Sie auch [customer_details.address](https://docs.stripe.com/api/invoices/create_preview.md#create_create_preview-customer_details-address) fest. Verwenden Sie [customer_details.shipping](https://docs.stripe.com/api/invoices/create_preview.md#create_create_preview-customer_details-shipping), wenn Sie Versandadressen erfassen. ```curl curl https://api.stripe.com/v1/invoices/create_preview \ -u "<>:" \ -d "automatic_tax[enabled]=true" \ -d "customer_details[address][line1]={{LINE1}}" \ -d "customer_details[address][line2]={{LINE2}}" \ -d "customer_details[address][city]={{CITY}}" \ -d "customer_details[address][state]={{STATE}}" \ -d "customer_details[address][postal_code]={{POSTAL_CODE}}" \ -d "customer_details[address][country]={{COUNTRY}}" \ -d "customer_details[tax][ip_address]={{IP_ADDRESS}}" \ -d "subscription_details[items][0][price]={{PRICE_ID}}" ``` Überprüfen Sie den [automatic_tax.status](https://docs.stripe.com/api/invoices/object.md#invoice_object-automatic_tax-status) der Rechnung. Wenn der Status `requires_location_inputs` ist, bedeutet dies, dass die Adressdaten ungültig oder unzureichend sind. Fordern Sie Ihre Kundinnen/Kunden in diesem Fall auf, ihre Adressdaten erneut einzugeben oder genaue Adressdaten anzugeben. Die [Rechnungssumme](https://docs.stripe.com/api/invoices/object.md#invoice_object-total) gibt an, wie viel Ihr Kunde/Ihre Kundin zahlt, und die [Steuer](https://docs.stripe.com/api/invoices/object.md#invoice_object-tax) ist die Summe aller Steuerbeträge auf der Rechnung. Eine Aufschlüsselung der Steuern finden Sie unter [total_tax_amounts](https://docs.stripe.com/api/invoices/object.md#invoice_object-total_tax_amounts). Alle Beträge sind in Cent angegeben. > #### Keine Steuern > > Wenn der Wert für `tax` Null ist, stellen Sie sicher, dass Sie am Standort Ihres Kunden/Ihrer Kundin steuerlich registriert sind. Erfahren Sie, [wie Sie sich für Sales Tax, Umsatzsteuer und GST](https://docs.stripe.com/tax/registering.md) registrieren, und erfahren Sie mehr über [steuerfreie Beträge und die Umkehrung der Steuerschuldnerschaft](https://docs.stripe.com/tax/zero-tax.md). ## Erfassung der Kundendaten [Clientseitig] Nachdem Sie eine Schätzung der Steuern und der Gesamtsumme erhalten haben, beginnen Sie mit der Erfassung von Kundeninformationen, einschließlich der Versandadresse (falls zutreffend), der Rechnungsadresse und der Zahlungsdaten. Beachten Sie, dass Sie bei der Verwendung von Stripe Tax Zahlungsdetails ohne Intent erfassen. Im ersten Schritt [erstellen Sie ein Elements-Objekt ohne Intent](https://docs.stripe.com/js/elements_object/create_without_intent): ```javascript const stripe = Stripe("<>"); const elements = stripe.elements({ mode: 'subscription', currency: '{{CURRENCY}}', amount: {{TOTAL}}, // Dies ist die Gesamtsumme der Rechnung. }); ``` Erstellen Sie als Nächstes ein [Address Element](https://docs.stripe.com/js/elements_object/create_address_element) und ein [Payment Element](https://docs.stripe.com/js/elements_object/create_payment_element) und [verbinden](https://docs.stripe.com/js/element/mount) Sie beide: ```javascript const addressElement = elements.create('address', { mode: 'billing' // or 'shipping', if you are shipping goods }); addressElement.mount('#address-element'); const paymentElementOptions = { layout: 'accordion'}; const paymentElement = elements.create('payment', paymentElementOptions); paymentElement.mount('#payment-element'); ``` Anschließend können Sie das Address Element auf [Änderungsereignisse](https://docs.stripe.com/js/element/events/on_change?type=paymentElement#element_on_change-event) überwachen. Wenn sich die Adresse ändert, [schätzen](https://docs.stripe.com/tax/subscriptions.md?estimate=after#estimate-taxes-total) Sie die Steuern und die Gesamtsumme neu. ```javascript addressElement.on('change', async function(event) { // Throttle your requests to avoid overloading your server or hitting // Stripe's rate limits. const { tax, total } = await updateEstimate(event.value.address); elements.update({ amount: total }); // Update your page to display the new tax and total to the user... }); ``` > Wenn Ihr Kunde/Ihre Kundin seine/ihre Adresse eingibt, löst das Adresselement für jeden Tastenanschlag ein `change`-Ereignis aus. Um eine Überlastung Ihres Servers und das Erreichen der [Ratenbegrenzungen](https://docs.stripe.com/rate-limits.md) von Stripe zu vermeiden, warten Sie einige Zeit nach dem letzten `change`-Ereignis, bevor Sie die Steuern und die Summe neu schätzen. ## Übermittlung handhaben [Clientseitig] Wenn Ihre Kundinnen/Kunden das Formular absenden, rufen Sie [elements.submit()](https://docs.stripe.com/js/elements/submit) auf, um die Formularfelder zu validieren und alle für Wallets erforderlichen Daten zu erfassen. Sie müssen warten, bis das Promise dieser Funktion aufgelöst wurde, bevor Sie weitere Vorgänge ausführen. ```javascript document.querySelector("#form").addEventListener("submit", async function(event) { // We don't want to let default form submission happen here, // which would refresh the page. event.preventDefault(); const { error: submitError } = await elements.submit(); if (submitError) { // Handle error... return; } const { value: customerDetails } = await addressElement.getValue(); // See the "Save customer details" section below to implement this // server-side. await saveCustomerDetails(customerDetails); // Fordert Ihren Server auf, die Kundendaten zu speichern. // See the "Create subscription" section below to implement this server-side. const { clientSecret } = await createSubscription(); // latest_invoice.confirmation_secret.client_secret des neuen Abonnements. // Stellt eine Anfrage an Ihren Server, um ein Abonnement zu erstellen. const { error: confirmError } = await stripe.confirmPayment({ elements, clientSecret, confirmParams: { return_url: {{RETURN_URL}}, // Die URL, an die Stripe Ihre Kundinnen und Kunden weiterleitet, nachdem sie die Zahlung abgeschlossen haben. }, }); if (confirmError) { // Handle error... return; } // Upon a successful confirmation, your user will be redirected to the // return_url you provide before the Promise ever resolves. }); ``` ## Kundendaten speichern [Serverseitig] #### Customer v1 [Aktualisieren](https://docs.stripe.com/api/customers/update.md) Sie Ihr `Customer`-Objekt anhand der Angaben, die Sie von Ihren Kundinnen/Kunden erfasst haben, damit Stripe Tax den genauen Standort des Kunden/der Kundin bestimmen kann und genaue Ergebnisse erhält. > Wenn sich Ihr/e Kund/in in den USA befindet, geben Sie nach Möglichkeit eine vollständige Adresse an. Mit dem Begriff „dachgenau“ meinen wir, dass wir den Standort Ihres Kunden/Ihrer Kundin einem bestimmten Haus oder Gebäude zuordnen können. Dies bietet eine höhere Genauigkeit, wenn zwei nebeneinander liegende Häuser in derselben Straße aufgrund komplexer Zuständigkeitsgrenzen unterschiedlichen Steuersätzen unterliegen können. Wenn Sie noch kein `Customer`-Objekt erstellt haben (zum Beispiel bei der ersten Anmeldung Ihres Kunden/Ihrer Kundin auf Ihrer Website), können Sie jetzt eines [erstellen](https://docs.stripe.com/api/customers/create.md). #### Kunden/Kundin aktualisieren ```curl curl https://api.stripe.com/v1/customers/{{CUSTOMER_ID}} \ -u "<>:" \ -d "address[line1]={{LINE1}}" \ -d "address[line2]={{LINE2}}" \ -d "address[city]={{CITY}}" \ -d "address[state]={{STATE}}" \ -d "address[postal_code]={{POSTAL_CODE}}" \ -d "address[country]={{COUNTRY}}" \ -d "tax[validate_location]=immediately" ``` > Falls Ihr Kunde/Ihre Kundin bereits andere Abonnements mit aktivierten automatischen Steuern hat und Sie seine/ihre Adressdaten aktualisieren, können sich die Steuern und die Gesamtbeträge auf ihren zukünftigen Rechnungen unterscheiden. Dies liegt daran, dass die Steuersätze je nach Kundenstandort variieren. #### Kunden/Kundin erstellen ```curl curl https://api.stripe.com/v1/customers \ -u "<>:" \ -d "address[line1]={{LINE1}}" \ -d "address[line2]={{LINE2}}" \ -d "address[city]={{CITY}}" \ -d "address[state]={{STATE}}" \ -d "address[postal_code]={{POSTAL_CODE}}" \ -d "address[country]={{COUNTRY}}" \ -d "tax[validate_location]=immediately" ``` Ihr Kunde/Ihre Kundin muss über einen gültigen Steuerstandort verfügen, um die automatische Steuer für sein/ihr Abo zu aktivieren. Legen Sie für [tax.validate_location](https://docs.stripe.com/api/customers/update.md#update_customer-tax-validate_location) `immediately` fest, um den Steuerstandort des Kunden/der Kundin zu validieren. Schlägt die Validierung fehl, sorgt Stripe dafür, dass Ihre Anfrage mit dem Fehlercode [customer_tax_location_invalid](https://docs.stripe.com/error-codes.md#customer-tax-location-invalid) fehlschlägt. Durch Überprüfen von [automatic_tax.status](https://docs.stripe.com/api/invoices/object.md#invoice_object-automatic_tax-status) für Ihre Rechnungsvorschau können Sie diesen Fehler vermeiden. ## Abonnement erstellen [Serverseitig] [Erstellen](https://docs.stripe.com/api/subscriptions/create.md) Sie ein Abonnement mit aktivierten automatischen Steuern #### Customer v1 ```curl curl https://api.stripe.com/v1/subscriptions \ -u "<>:" \ -d "automatic_tax[enabled]=true" \ -d "customer={{CUSTOMER_ID}}" \ -d "items[0][price]={{PRICE_ID}}" \ -d "payment_settings[save_default_payment_method]=on_subscription" \ -d "expand[0]=latest_invoice.confirmation_secret" ``` Das [latest_invoice.confirmation_secret.client_secret](https://docs.stripe.com/api/invoices/object.md#invoice_object-confirmation_secret-client_secrett) ist das *Client-Geheimnis* (The client secret is a unique key returned from Stripe as part of a PaymentIntent. This key lets the client access important fields from the PaymentIntent (status, amount, currency) while hiding sensitive ones (metadata, customer)) des *Payment Intent* (API object that represents your intent to collect payment from a customer, tracking charge attempts and payment state changes throughout the process) der ersten (und der letzten) Rechnung des neuen Abonnements. Sie müssen das Client-Geheimnis an Ihr Frontend übergeben, um den Payment Intent *bestätigen* (Confirming a PaymentIntent indicates that the customer intends to pay with the current or provided payment method. Upon confirmation, the PaymentIntent attempts to initiate a payment) zu können. > Sie dürfen das Client-Geheimnis weder speichern, noch protokollieren oder Personen außer dem Kunden/der Kundin selbst zugänglich machen. Vergewissern Sie sich, dass auf jeder Seite, die das Client-Geheimnis enthält, TLS aktiviert ist. Wenn Ihr Kunde/Ihre Kundin über eine Standardzahlungsmethode verfügt, wird die erste Rechnung des Abonnements automatisch bezahlt. Sie können dies mit dem [latest_invoice.status](https://docs.stripe.com/api/invoices/object.md#invoice_object-status) des Abonnements bestätigen. Wenn Sie die neuen Zahlungsdetails, die Sie von Ihrem Kunden/Ihrer Kundin erfasst haben in Ihrem Bezahlvorgang verwenden möchten, müssen Sie sicherstellen, dass die erste Rechnung nicht automatisch bezahlt wird. Übergeben Sie `default_incomplete` für das [payment_behavior](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-payment_behavior), wenn Sie Ihr Abonnement erstellen, und bestätigen Sie den Payment Intent mit [stripe.confirmPayment()](https://docs.stripe.com/js/payment_intents/confirm_payment), wie dargestellt. Weitere Informationen finden Sie unter [Billing-Einzugsmethoden](https://docs.stripe.com/billing/collection-method.md). ## Optional: Produkte und Preise aktualisieren Stripe Tax verwendet Informationen, die zu *Produkten* (Products represent what your business sells—whether that's a good or a service) und *Preisen* (Prices define how much and how often to charge for products. This includes how much the product costs, what currency to use, and the interval if the price is for subscriptions) gespeichert sind, um Steuern zu berechnen, wie z. B. *Steuercode* (A tax code is the category of your product for tax purposes) und *Steuerverhalten* (Tax behavior determines whether you want to include taxes in the price ("inclusive") or add them on top ("exclusive")). Wenn Sie diese Konfigurationen nicht explizit angeben, verwendet Stripe Tax den in den [Steuereinstellungen](https://dashboard.stripe.com/settings/tax) ausgewählten Standard-Steuercode. Weitere Informationen finden Sie unter [Produkt-Steuerkennzeichen und Steuerverhalten festlegen](https://docs.stripe.com/tax/products-prices-tax-codes-tax-behavior.md). ## Optional: Abwicklung von Rückerstattungen [Serverseitig] Wenn Sie eine Rückerstattung für eine Rechnungszahlung erstellen, reduziert Stripe Tax automatisch Ihre Steuerpflicht. Alternativ können Sie [Stornorechnungen](https://docs.stripe.com/api/credit_notes/object.md) ausstellen, um die Verringerung der Steuerpflicht nachzuverfolgen und Ihren Kundinnen/Kunden Aufzeichnungen zur Verfügung zu stellen. #### Rechnungsbetrag zurückerstatten Um einen mit einer Rechnungssumme verknüpften Betrag zurückzuerstatten, erstellen Sie eine Stornorechnung und eine Rückerstattung. #### Stornorechnung mit automatischer Rückerstattung Erstellen Sie eine Stornorechnung und eine [Rückerstattung](https://docs.stripe.com/api/refunds/object.md) gemeinsam, indem Sie [create Credit Note](https://docs.stripe.com/api/credit_notes/create.md) aufrufen und einen `refund_amount`-Wert angeben. ```curl curl https://api.stripe.com/v1/credit_notes \ -u "<>:" \ -d "invoice={{INVOICE_ID}}" \ -d refund_amount=1000 ``` #### Stornorechnung mit manueller Rückerstattung [Erstellen Sie eine Rückerstattung](https://docs.stripe.com/api/refunds/create.md) und geben Sie deren ID an, wenn Sie eine [Stornorechnung](https://docs.stripe.com/api/credit_notes/object.md) erstellen. Geben Sie in diesem Fall keinen `refund_amount`-Wert an. ```curl curl https://api.stripe.com/v1/credit_notes \ -u "<>:" \ -d "invoice={{INVOICE_ID}}" \ -d "refunds[0][refund]={{REFUND_ID}}" \ -d "refunds[0][amount_refunded]=1000" ``` Stripe Tax verteilt den gesamten Erstattungsbetrag automatisch zwischen den Steuern und dem Nettobetrag. #### Rechnungspostenbetrag zurückerstatten Wenn Sie einen mit einem Rechnungsposten verknüpften Betrag zurückerstatten möchten, berechnen Sie zuerst die [Summe](https://docs.stripe.com/api/credit_notes/object.md#credit_note_object-total) und die [total_excluding_tax](https://docs.stripe.com/api/credit_notes/object.md#credit_note_object-total_excluding_tax)-Beträge, indem Sie [preview Credit Note](https://docs.stripe.com/api/credit_notes/preview.md) aufrufen. ```curl curl -G https://api.stripe.com/v1/credit_notes/preview \ -u "<>:" \ -d "invoice={{INVOICE_ID}}" \ -d "lines[0][type]=invoice_line_item" \ --data-urlencode "lines[0][invoice_line_item]={{line item id from invoice}}" \ -d "lines[0][amount]=1000" ``` Erstellen Sie dann eine [Stornorechnung](https://docs.stripe.com/api/credit_notes/object.md) und eine [Rückerstattung](https://docs.stripe.com/api/refunds/object.md). #### Stornorechnung mit automatischer Rückerstattung Erstellen Sie eine Stornorechnung und eine [Rückerstattung](https://docs.stripe.com/api/refunds/object.md) gemeinsam, indem Sie [create Credit Note](https://docs.stripe.com/api/credit_notes/create.md) aufrufen und einen `refund_amount`-Wert angeben. ```curl curl https://api.stripe.com/v1/credit_notes \ -u "<>:" \ -d "invoice={{INVOICE_ID}}" \ -d refund_amount=1000 \ -d "lines[0][type]=invoice_line_item" \ -d "lines[0][invoice_line_item]={{line item id from invoice}}" \ -d "lines[0][amount]=1000" ``` #### Stornorechnung mit manueller Rückerstattung [Erstellen Sie eine Rückerstattung](https://docs.stripe.com/api/refunds/create.md) mithilfe der in der Vorschau der Stornorechnung berechneten `total` und geben Sie deren ID an, wenn Sie eine [Stornorechnung](https://docs.stripe.com/api/credit_notes/object.md) erstellen. Geben Sie in diesem Fall keinen `refund_amount`-Wert an. ```curl curl https://api.stripe.com/v1/credit_notes \ -u "<>:" \ -d "invoice={{INVOICE_ID}}" \ -d "refunds[0][refund]={{REFUND_ID}}" \ -d "refunds[0][amount_refunded]=1000" \ -d "lines[0][type]=invoice_line_item" \ -d "lines[0][invoice_line_item]={{line item id from invoice}}" \ -d "lines[0][amount]=1000" ``` ## Webhooks verwenden Wir empfehlen, Abonnement-Ereignisse mit *Webhooks* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) zu überwachen, da die meisten Abonnementaktivitäten asynchron erfolgen. Wenn Sie mit der Verwendung von Stripe Tax beginnen, überwachen Sie unbedingt die [invoice.finalization_failed](https://docs.stripe.com/api/events/types.md#event_types-invoice.finalization_failed)-Ereignisse. Wenn der [automatic_tax.status](https://docs.stripe.com/api/invoices/object.md#invoice_object-automatic_tax-status) der Rechnung `requires_location_inputs` ist, bedeutet dies, dass die Adressdetails Ihres Kunden/Ihrer Kundin ungültig oder unzureichend sind. In diesem Fall kann Stripe die Steuern nicht berechnen, die Rechnung nicht finalisieren und die Zahlung nicht einziehen. Bitten Sie Ihren Kunden/Ihre Kundin, die Adressdetails erneut einzugeben oder eine genaue Adresse anzugeben. Weitere Informationen finden Sie unter [Verwenden von Webhooks mit Abonnements](https://docs.stripe.com/billing/subscriptions/webhooks.md). ## See also - [Bestehende Abonnements aktualisieren](https://docs.stripe.com/tax/subscriptions/update.md) - [Stripe Tax mit Connect verwenden](https://docs.stripe.com/tax/connect.md) - [Steuer in Ihrem nutzerdefinierten Bezahlvorgang berechnen](https://docs.stripe.com/tax/custom.md)