Liquid, JavaScript, Themes
Liebe Community,
ich melde mich wieder bei euch, da ich leider nicht weiter weiß und auch der Shopify Support mir nicht helfen konnte.
Es geht um die AGB & Widerrufsbelehrung die in der Bestellbestätigungs E-Mail als PDF angehängt sein müssen.
Gebe ich eine TESTBESTELLUNG auf, werden diese PDF Dateien versendet. Sobald keine Testbestellung abgegeben wird und jemand tatsächlich in meinem Shop kauft, werden diese nicht versendet. (Ich habe den Code gecheckt und dieser sollte auch richtig sein).
Ich habe mich an den Support gewendet, diese haben eine Testbestellung durchgeführt und meinten, dass die PDF Dateien versendet werden (was ja auch so ist). Ich habe jetzt einige meiner Freunde gebeten bei mir im Shop einzukaufen um das zu beobachten, und keiner von ihnen hat diese Anhänge in der E-Mail.
Vielleicht wisst ihr ja, woran das liegen könnte. Ich muss dieses Problem unbedingt lösen, um DSVGO konform zu sein.
Ich würde mich wirklich sehr freuen, wenn mir jemand helfen könnte.
Vielen Dank & Beste Grüße
@drt2nur als Hinweis: Dieses Thema hat nichts mit der Datenschutzverordnung (DSGVO) zu tun, sondern betrifft die Gesetze aus dem BGB. Das ist aber deswegen nicht weniger wichtig. 😉
Kannst du den Code aus der Bestellbestätigungsmail hier zur Verfügung stellen?
Hallo Finer,
danke für die Info. Ich weiß nur, dass es sehr wichtig ist 🙈.
Copy-paste vom Bestellbestätigungs Code:
{% capture email_title %}Vielen Dank für deinen Einkauf! {% endcapture %}
{% capture email_body %}
{% if requires_shipping %}
{% case delivery_method %}
{% when 'pick-up' %}
Du erhältst eine E-Mail, sobald deine Bestellung zur Abholung bereit ist.
{% when 'local' %}
Hallo {{ customer.first_name }}! Wir bereiten deine Bestellung gerade für die Zustellung vor.
{% else %}
Hallo {{ customer.first_name }}! Wir bereiten deine Bestellung gerade für den Versand vor. Wir benachrichtigen dich, sobald die Bestellung verschickt wurde.
{% endcase %}
{% if delivery_instructions != blank %}
<p><b>Informationen zur Zustellung:</b> {{ delivery_instructions }}</p>
{% endif %}
{% if consolidated_estimated_delivery_time %}
<p>
Voraussichtliche Zustellung <b>{{ consolidated_estimated_delivery_time }}</b>
</p>
{% endif %}
{% endif %}
{% endcapture %}
<!DOCTYPE html>
<html lang="de">
<head>
<title>{{ email_title }}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width">
<link rel="stylesheet" type="text/css" href="/assets/notifications/styles.css">
<style>
.button__cell { background: {{ shop.email_accent_color }}; }
a, a:hover, a:active, a:visited { color: {{ shop.email_accent_color }}; }
</style>
</head>
<body>
<table class="body">
<tr>
<td>
<table class="header row">
<tr>
<td class="header__cell">
<center>
<table class="container">
<tr>
<td>
<table class="row">
<tr>
<td class="shop-name__cell">
{%- if shop.email_logo_url %}
<img src="{{shop.email_logo_url}}" alt="{{ shop.name }}" width="{{ shop.email_logo_width }}">
{%- else %}
<h1 class="shop-name__text">
<a href="{{shop.url}}">{{ shop.name }}</a>
</h1>
{%- endif %}
</td>
<td class="order-number__cell">
<span class="order-number__text">
Bestellung {{ order_name }}
</span>
</td>
</tr>
</table>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
<table class="row content">
<tr>
<td class="content__cell">
<center>
<table class="container">
<tr>
<td>
<h2>{{ email_title }}</h2>
<p>{{ email_body }}</p>
{% assign transaction_count = transactions | size %}
{% if transaction_count > 0 %}
{% for transaction in transactions %}
{% if transaction.show_buyer_pending_payment_instructions? %}
<p> {{transaction.buyer_pending_payment_notice}} </p>
<p>
<table class="row">
<tr>
{% for instruction in transaction.buyer_pending_payment_instructions %}
<td>{{ instruction.header }}</td>
{% endfor %}
<td>Betrag</td>
</tr>
<tr>
{% for instruction in transaction.buyer_pending_payment_instructions %}
<td>{{ instruction.value }}</td>
{% endfor %}
<td>{{transaction.amount | money}}</td>
</tr>
</table>
</p>
{% endif %}
{% endfor%}
{% endif %}
{% if order_status_url %}
<table class="row actions">
<tr>
<td class="empty-line"> </td>
</tr>
<tr>
<td class="actions__cell">
<table class="button main-action-cell">
<tr>
<td class="button__cell"><a href="{{ order_status_url }}" class="button__text">Bestellung ansehen</a></td>
</tr>
</table>
{% if shop.url %}
<table class="link secondary-action-cell">
<tr>
<td class="link__cell">oder <a href="{{ shop.url }}">Zu unserem Shop</a></td>
</tr>
</table>
{% endif %}
</td>
</tr>
</table>
{% else %}
{% if shop.url %}
<table class="row actions">
<tr>
<td class="actions__cell">
<table class="button main-action-cell">
<tr>
<td class="button__cell"><a href="{{ shop.url }}" class="button__text">Zu unserem Shop</a></td>
</tr>
</table>
</td>
</tr>
</table>
{% endif %}
{% endif %}
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
{% assign gift_card_line_item = line_items | where: "gift_card" %}
{% if gift_card_line_item.first %}
<table class="row section">
<tr>
<td class="section__cell">
<center>
<table class="container">
<tr>
<td>
<h3>Geschenkgutschein</h3>
</td>
</tr>
</table>
<table class="container">
<tr>
<td>
<p> Du erhältst separate Benachrichtigungen für Geschenkgutscheine.</p>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
{% endif %}
<table class="row section">
<tr>
<td class="section__cell">
<center>
<table class="container">
<tr>
<td>
<h3>Bestellübersicht</h3>
</td>
</tr>
</table>
<table class="container">
<tr>
<td>
<table class="row">
{% for line in subtotal_line_items %}
<tr class="order-list__item">
<td class="order-list__item__cell">
<table>
<td>
{% if line.image %}
<img src="{{ line | img_url: 'compact_cropped' }}" align="left" width="60" height="60" class="order-list__product-image"/>
{% endif %}
</td>
<td class="order-list__product-description-cell">
{% if line.product.title %}
{% assign line_title = line.product.title %}
{% else %}
{% assign line_title = line.title %}
{% endif %}
{% if line.quantity < line.quantity %}
{% capture line_display %} {{ line.quantity }} of {{ line.quantity }} {% endcapture %}
{% else %}
{% assign line_display = line.quantity %}
{% endif %}
<span class="order-list__item-title">{{ line_title }} × {{ line_display }}</span><br/>
{% if line.variant.title != 'Default Title' %}
<span class="order-list__item-variant">{{ line.variant.title }}</span><br/>
{% endif %}
{% if line.selling_plan_allocation %}
<span class="order-list__item-variant">{{ line.selling_plan_allocation.selling_plan.name }}</span><br/>
{% endif %}
{% if line.refunded_quantity > 0 %}
<span class="order-list__item-refunded">Zurückerstattet</span>
{% endif %}
{% if line.discount_allocations %}
{% for discount_allocation in line.discount_allocations %}
{% if discount_allocation.discount_application.target_selection != 'all' %}
<span class="order-list__item-discount-allocation">
<img src="{{ 'notifications/discounttag.png' | shopify_asset_url }}" width="18" height="18" class="discount-tag-icon" />
<span>
{{ discount_allocation.discount_application.title | upcase }}
(-{{ discount_allocation.amount | money }})
</span>
</span>
{% endif %}
{% endfor %}
{% endif %}
</td>
<td class="order-list__price-cell">
{% if line.original_line_price != line.final_line_price %}
<del class="order-list__item-original-price">{{ line.original_line_price | money }}</del>
{% endif %}
<p class="order-list__item-price">
{% if line.final_line_price > 0 %}
{{ line.final_line_price | money }}
{% if line.unit_price_measurement %}
<div class="order-list__unit-price">
{{ line.unit_price | money }}/
{%- if line.unit_price_measurement.reference_value != 1 -%}
{{- line.unit_price_measurement.reference_value -}}
{%- endif -%}
{{ line.unit_price_measurement.reference_unit }}
</div>
{% endif %}
{% else %}
Kostenlos
{% endif %}
</p>
</td>
</table>
</td>
</tr>{% endfor %}
</table>
<table class="row subtotal-lines">
<tr>
<td class="subtotal-spacer"></td>
<td>
<table class="row subtotal-table">
{% for discount_application in discount_applications %}
{% if discount_application.target_selection == 'all' %}
{% capture discount_title %}
{% if discount_application.title %}
{{ discount_application.title | upcase }}
{% else %}
Rabatt
{% endif %}
{% endcapture %}
<tr class="subtotal-line">
<td class="subtotal-line__title">
<p>
<span>Rabatt</span>
<span class="subtotal-line__discount">
<img src="{{ 'notifications/discounttag.png' | shopify_asset_url }}" width="18" height="18" class="discount-tag-icon" />
<span class="subtotal-line__discount-title">{{ discount_title }}</span>
</span>
</p>
</td>
<td class="subtotal-line__value">
<strong>-{{ discount_application.total_allocated_amount | money }}</strong>
</td>
</tr>
{% endif %}
{% endfor %}
<tr class="subtotal-line">
<td class="subtotal-line__title">
<p>
<span>Zwischensumme</span>
</p>
</td>
<td class="subtotal-line__value">
<strong>{{ subtotal_price | money }}</strong>
</td>
</tr>
{% if delivery_method == 'pick-up' %}
<tr class="subtotal-line">
<td class="subtotal-line__title">
<p>
<span>Abholungen</span>
</p>
</td>
<td class="subtotal-line__value">
<strong>{{ shipping_price | money }}</strong>
</td>
</tr>
{% else %}
<tr class="subtotal-line">
<td class="subtotal-line__title">
<p>
<span>Versand</span>
</p>
</td>
<td class="subtotal-line__value">
<strong>{{ shipping_price | money }}</strong>
</td>
</tr>
{% endif %}
{% if total_duties %}
<tr class="subtotal-line">
<td class="subtotal-line__title">
<p>
<span>Zollgebühren</span>
</p>
</td>
<td class="subtotal-line__value">
<strong>{{ total_duties | money }}</strong>
</td>
</tr>
{% endif %}
<tr class="subtotal-line">
<td class="subtotal-line__title">
<p>
<span>Steuern</span>
</p>
</td>
<td class="subtotal-line__value">
<strong>{{ tax_price | money }}</strong>
</td>
</tr>
{% if total_tip and total_tip > 0 %}
<tr class="subtotal-line">
<td class="subtotal-line__title">
<p>
<span>Tip</span>
</p>
</td>
<td class="subtotal-line__value">
<strong>{{ total_tip | money }}</strong>
</td>
</tr>
{% endif %}
</table>
{% assign transaction_size = 0 %}
{% assign transaction_amount = 0 %}
{% for transaction in transactions %}
{% if transaction.status == "success" %}
{% unless transaction.kind == "authorization" or transaction.kind == "void" %}
{% assign transaction_size = transaction_size | plus: 1 %}
{% assign transaction_amount = transaction_amount | plus: transaction.amount %}
{% endunless %}
{% endif %}
{% endfor %}
<table class="row subtotal-table subtotal-table--total">
{% if payment_terms %}
{% assign due_at_date = payment_terms.next_payment.due_at | date: "%b %d, %Y" %}
<tr class="subtotal-line">
<td class="subtotal-line__title">
<p>
<span>Gesamtbetrag heute bezahlt</span>
</p>
</td>
<td class="subtotal-line__value">
<strong>{{ transaction_amount | money_with_currency }}</strong>
</td>
</tr>
<div class="payment-terms">
<tr class="subtotal-line">
<td class="subtotal-line__title">
<p>
<span>Gesamtbetrag am {{ due_at_date }} fällig</span>
</p>
</td>
<td class="subtotal-line__value">
<strong>{{ payment_terms.next_payment.amount_due | money_with_currency }}</strong>
</td>
</tr>
</div>
{% else %}
<tr class="subtotal-line">
<td class="subtotal-line__title">
<p>
<span>Gesamt</span>
</p>
</td>
<td class="subtotal-line__value">
<strong>{{ total_price | money_with_currency }}</strong>
</td>
</tr>
{% endif %}
</table>
{% if total_discounts > 0 %}
<p class="total-discount">
Du hast <span class="total-discount--amount">{{ total_discounts | money }}</span> gespart
</p>
{% endif %}
{% unless payment_terms %}
{% if transaction_size > 1 or transaction_amount < total_price %}
<table class="row subtotal-table">
<tr><td colspan="2" class="subtotal-table__line"></td></tr>
<tr><td colspan="2" class="subtotal-table__small-space"></td></tr>
{% for transaction in transactions %}
{% if transaction.status == "success" and transaction.kind == "capture" or transaction.kind == "sale" %}
{% if transaction.payment_details.credit_card_company %}
{% capture transaction_name %}{{ transaction.payment_details.credit_card_company }} (mit den letzten Ziffern {{ transaction.payment_details.credit_card_last_four_digits }}){% endcapture %}
{% else %}
{% capture transaction_name %}{{ transaction.gateway_display_name }}{% endcapture %}
{% endif %}
<tr class="subtotal-line">
<td class="subtotal-line__title">
<p>
<span>{{transaction_name}}</span>
</p>
</td>
<td class="subtotal-line__value">
<strong>{{ transaction.amount | money }}</strong>
</td>
</tr>
{% endif %}
{% if transaction.kind == 'refund' %}
{% if transaction.payment_details.credit_card_company %}
{% assign refund_method_title = transaction.payment_details.credit_card_company %}
{% else %}
{% assign refund_method_title = transaction.gateway %}
{% endif %}
<tr class="subtotal-line">
<td class="subtotal-line__title">
<p>
<span>Zurückerstatten</span>
<br>
<small>{{ refund_method_title | capitalize }}</small>
</p>
</td>
<td class="subtotal-line__value">
<strong>- {{ transaction.amount | money }}</strong>
</td>
</tr>
{% endif %}
{% endfor %}
</table>
{% endif %}
{% endunless %}
</td>
</tr>
</table>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
<table class="row section">
<tr>
<td class="section__cell">
<center>
<table class="container">
<tr>
<td>
<h3>Kundeninformationen</h3>
</td>
</tr>
</table>
<table class="container">
<tr>
<td>
<table class="row">
<tr>
{% if requires_shipping and shipping_address %}
<td class="customer-info__item">
<h4>Lieferadresse</h4>
{{ shipping_address | format_address }}
</td>
{% endif %}
{% if billing_address %}
<td class="customer-info__item">
<h4>Rechnungsadresse</h4>
{{ billing_address | format_address }}
</td>
{% endif %}
</tr>
</table>
<table class="row">
<tr>
{% if requires_shipping and shipping_address %}
<td class="customer-info__item">
<h4>Versand</h4>
<p>{{ shipping_method.title }}</p>
</td>
{% endif %}
{% if transaction_size > 0 %}
<td class="customer-info__item">
<h4>Zahlung</h4>
{% for transaction in transactions %}
{% if transaction.status == "success" or transaction.status == "pending" %}
{% if transaction.kind == "capture" or transaction.kind == "sale" %}
{% if transaction.payment_details.credit_card_company %}
<p class="customer-info__item-content">
<img src="{{ transaction.payment_details.credit_card_company | payment_icon_png_url }}" class="customer-info__item-credit" height="24" alt="{{ transaction.payment_details.credit_card_company }}">
<span>endet mit {{ transaction.payment_details.credit_card_last_four_digits }}</span>
</p>
{% elsif transaction.gateway_display_name == "Gift card" %}
<p class="customer-info__item-content">
<img src="{{ transaction.gateway_display_name | downcase | replace: ' ', '-' | payment_type_img_url }}" class="customer-info__item-credit" height="24">
endet mit {{ transaction.payment_details.gift_card.last_four_characters | upcase }}<br />
    Geschenkgutscheinguthaben: {{ transaction.payment_details.gift_card.balance | money }}
</p>
{% else %}
<p class="customer-info__item-content">
{{ transaction.gateway_display_name }}
</p>
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
</td>
{% endif %}
</tr>
</table>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
<table class="row footer">
<tr>
<td class="footer__cell">
<center>
<table class="container">
<tr>
<td>
<p class="disclaimer__subtext">Falls du Fragen hast, antworte auf diese E-Mail oder kontaktiere uns unter <a href="mailto:{{ shop.email }}">{{ shop.email }}</a>.</p>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
<img src="{{ 'notifications/spacer.png' | shopify_asset_url }}" class="spacer" height="1" />
</td>
</tr>
</table>
</body>
</html>
{%- if shop.terms_of_service.body != blank -%}
{{ shop.terms_of_service | attach_as_pdf: "AGB" }}
{%- endif -%}
{%- if shop.refund_policy.body != blank -%}
{{ shop.refund_policy | attach_as_pdf: "Widerrufsrecht" }}
{%- endif -%}
@drt2 hast du noch einen Link zu deiner Seite?
@drt2 Danke. Von dem, was ich direkt sehe – da reicht die URL – handelt es sich um einen Shop mit Sitz in Österreich. Da die attach_as_pdf Funktion anscheinend nur für deutsche Shops freigeschaltet ist, müsstest du beim Support anfragen, ob man dir diese Funktion freischalten könnte.
Ein anderes Thema, was aber die gleichen Schritte bedarf, sind Grundeinheiten. Diese sind nur für Frankreich und Deutschland standardmäßig freigeschaltet. Nicht aber für andere EU-Länder. Ich vermute, dass es an der gleichen Thematik liegt.
@Gabe vielleicht kannst du uns hierzu mehr Infos geben?
Der Grundpreis ist in diesem Shop aktiv wie es scheint. Und der folgende Code müsste eigentlich in jeder E-Mail ziehen soweit ich weiss:
{%- if shop.terms_of_service.body != blank -%}
{{ shop.terms_of_service | attach_as_pdf: "AGB" }}
{%- endif -%}
{%- if shop.refund_policy.body != blank -%}
{{ shop.refund_policy | attach_as_pdf: "Widerrufsrecht" }}
{%- endif -%}
Das Problem ist folgendes: wären die zwei PDFs bei gar keiner E-Mail angekommen dann wäre der Sachverhalt ganz klar und der Code wäre definitiv kaputt. Da sie aber bei dir angekommen sind und bei manchen User nicht - deutet das Problem m. E. mehr auf die E-Mail Server oder Einstellungen der User selber die die zwei Anhänge nicht bekommen haben.
Haben aber die User vielleicht nicht ganz auf der Danke Seite nach unten gescrollt und somit vielleicht die zwei PDFs nicht gesehen? Gibt es Bestellungen in deinem Shop wo auch andere User doch die zwei Anhänge bekommen haben?
Der Code oben wurde von unseren Entwickler mehr Pro-Forma erstellt als Shopify vor einem
Jahr im deutschen Markt "offiziell" eingestiegen ist, und unsere Produktteams sich zusammenraufen mussten, um die Plattform auf die außergewöhnlich strengen Regulationen in Deutschland vorzubereiten, wie z. B. die Pflicht diese zwei PDFs als Anhänge in der E-Mail zu haben (obwohl es in keinem Gesetz explizit dargestellt wird). In keinem anderen P1 Land (USA, KAN, AUSTRALIEN, CHINA usw.) gibt es diese PDF-Pflicht. Und jetzt kommt noch das Hinzufügen des Widerrufsrecht-Checkbox bei digitalen Produkten dazu.
Ein paar Workarounds?
Der einfache und effektive Weg: Man kann die zwei PDFs im Dateienbereich uploaden und die CDN URLs in der Bestellbestätigung E-Mail einbetten als Download Links:
Aber aus irgendeinem Grund sind in Deutschland (Österreich auch?) keine Download Links erlaubt.
Dann kann man auch die Richtlinien Pages direkt in der Bestätigungs-E-Mail verlinken. Oder man verwendet eine Digital Downloads App wie die von Shopify selber oder Sendowl, Skypilot, oder die Wire App hier. Diese Apps hängen auch digital Files wie PDFs an die Confirmation E-Mail.
Einen weiteren Tutorial habe ich von Sufio hier gefunden und auch hier der das Problem ganz elegant loest und deinen Kunden eine verbesserte Confirmation E-Mail Experience bietet, als das native System es derzeit macht.
Hoffe das hilft! 😉
Gabe | Social Care @ Shopify
- War meine Antwort hilfreich? Klicke Like um es mich wissen zu lassen!
- Wurde deine Frage beantwortet? Markiere es als Akzeptierte Lösung
- Um mehr zu erfahren, besuche das Shopify Help Center oder den Shopify Blog
Hallo Gabe,
danke für deinen Input. Es gab bisher nur Bestellungen von Freunden deswegen weiß ich, dass keiner von meinen Freunden diese Anhänge in der E-Mail hatte. Manche haben mir sogar die E-Mail weitergeleitet und da war nichts. Ich muss dazu sagen, dass alle Bestellungen aus Österreich waren, vielleicht sieht das bei Bestellungen aus Deutschland anders aus und die Dateien werden angehängt..ich weiß es nicht.
Ist auf jeden Fall ärgerlich. Die Apps sind ja auch mit zusätzlichen Kosten verbunden.
Ich glaube ich bleibe mal bei den Download Links in der E-Mail , so wie von dir beschrieben, bis sich vielleicht eine Lösung findet. Hättest du einen Tipp, wie ich diesen Link so formatieren kann, dass das Wort "AGB" anklickbar wird?
Ich bedanke mich auf jeden Fall herzlich, ihr habt mir auf jeden Fall weiter geholfen.
Einen schönen Abend
Teil 2 - Wie die Prinzipien des UX-Designs dir dabei helfen können einen großartigen Shop ...
By Kai Sep 16, 2024Teil 1 - Wie die Prinzipien des UX-Designs dir dabei helfen können einen großartigen Shop ...
By Kai Sep 9, 2024Anpassungen des benutzerdefinierten Codes an Shopify-Themes (CSS) leicht gemachtIn diesem...
By Gabe Aug 28, 2024