Return and RMA form

Start a return. Ask for the order, the reason, and how to put it right.

קובץ עד 24 KB נשלח כטקסט יחד עם הפנייה. לקובץ גדול יותר עדיף קישור. Formgong לא שומר קובץ נפרד.

תצוגה מקדימה

Order

Return

Contact

Photo

Consent

קוד הטופס

HTML
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Return and RMA form</title>
<style>
  body { font-family: "Segoe UI", sans-serif; color: #12263a; margin: 0; background: #fff; }
  main { max-width: 640px; margin: 0 auto; padding: 32px 20px 64px; }
  h1 { font-size: 28px; font-weight: 650; letter-spacing: -0.02em; line-height: 1.2; }
  h2 { font-size: 18px; margin: 18px 0 0; }
  p { line-height: 1.5; }
  form { display: grid; gap: 14px; position: relative; }
  .field { display: grid; gap: 6px; }
  label span, .check span { font-size: 14px; }
  input, select, textarea { font: inherit; color: inherit; padding: 10px 12px; border: 1px solid #b4bdce; border-radius: 8px; width: 100%; box-sizing: border-box; background: #fff; }
  textarea { min-height: 96px; }
  .check { display: flex; gap: 8px; align-items: flex-start; }
  .check input { width: auto; margin-top: 4px; }
  button { background: #3c4ad8; color: #fff; border: 0; border-radius: 8px; padding: 12px 18px; font: inherit; cursor: pointer; }
  .note { background: #fff6eb; padding: 12px 14px; border-radius: 8px; }
  form [data-show-if] { display: none; }
form:has(select[name="reason"] option[value="other"]:checked) [data-show-if="reason"][data-show-equals="other"] { display: grid; }
</style>
</head>
<body>
<main>
<h1 data-i18n="title">Return and RMA form</h1>
<p data-i18n="lede">Start a return. Ask for the order, the reason, and how to put it right.</p>


<form id="fg-form" action="https://formgong.com/submit" method="POST">
<input type="hidden" name="access_key" value="fk_your_access_key">
<div aria-hidden="true" style="position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden"><label>Leave this field empty<input name="botcheck" tabindex="-1" autocomplete="off"></label></div>
<section><h2 data-i18n="section.order">Order</h2>
<div class="field"><label for="fg-order_number"><span data-i18n="order_number">Order number</span></label><input id="fg-order_number" name="order_number" type="text" required maxlength="40"></div>
<div class="field"><label for="fg-product"><span data-i18n="product">Item</span></label><input id="fg-product" name="product" type="text" required maxlength="120"></div>
<div class="field"><label for="fg-quantity"><span data-i18n="quantity">Quantity</span></label><input id="fg-quantity" name="quantity" type="number" required min="1" max="999"></div></section>
<section><h2 data-i18n="section.return">Return</h2>
<div class="field"><label for="fg-reason"><span data-i18n="reason">Reason</span></label><select id="fg-reason" name="reason" required><option value="">—</option><option value="damaged" data-i18n="reason.damaged">Arrived damaged</option><option value="wrong" data-i18n="reason.wrong">Wrong item</option><option value="changed_mind" data-i18n="reason.changed_mind">Changed my mind</option><option value="other" data-i18n="reason.other">Other</option></select></div>
<div class="field" data-show-if="reason" data-show-equals="other"><label for="fg-reason_other"><span data-i18n="reason_other">Other reason</span></label><input id="fg-reason_other" name="reason_other" type="text" maxlength="160"></div>
<div class="field"><label for="fg-opened"><span data-i18n="opened">Has the item been opened?</span></label><select id="fg-opened" name="opened" required><option value="">—</option><option value="yes" data-i18n="opened.yes">Yes</option><option value="no" data-i18n="opened.no">No</option></select></div>
<div class="field"><label for="fg-resolution"><span data-i18n="resolution">What do you want?</span></label><select id="fg-resolution" name="resolution" required><option value="">—</option><option value="refund" data-i18n="resolution.refund">Refund</option><option value="exchange" data-i18n="resolution.exchange">Exchange</option></select></div></section>
<section><h2 data-i18n="section.contact">Contact</h2>
<div class="field"><label for="fg-name"><span data-i18n="name">Name</span></label><input id="fg-name" name="name" type="text" required maxlength="80" autocomplete="name"></div>
<div class="field"><label for="fg-email"><span data-i18n="email">Email</span></label><input id="fg-email" name="email" type="email" required maxlength="120" autocomplete="email"></div>
<div class="field"><label for="fg-phone"><span data-i18n="phone">Phone</span></label><input id="fg-phone" name="phone" type="tel" maxlength="40" autocomplete="tel"></div></section>
<section><h2 data-i18n="section.evidence">Photo</h2>
<div class="field"><label for="fg-photo"><span data-i18n="photo">Photo of the item, up to 24 KB</span></label><input id="fg-photo" name="photo" type="file" accept="image/*"></div>
<div class="field"><label for="fg-photo_url"><span data-i18n="photo_url">Or a link</span></label><input id="fg-photo_url" name="photo_url" type="url" maxlength="300"></div></section>
<section><h2 data-i18n="section.consent">Consent</h2>
<div class="field"><label class="check"><input id="fg-consent_contact" name="consent_contact" type="checkbox" value="yes" required><span data-i18n="consent_contact">I agree to be contacted about this request.</span></label></div>
<div class="field"><label class="check"><input id="fg-consent_privacy" name="consent_privacy" type="checkbox" value="yes" required><span data-i18n="consent_privacy">I agree that these answers are stored so the request can be handled.</span></label></div></section>
<!-- Turnstile hook: enable Turnstile on this form in Formgong, then set your site key.
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<div class="cf-turnstile" data-sitekey="YOUR_TURNSTILE_SITE_KEY"></div>
-->
<button type="submit" data-i18n="submit">Send</button>
<p data-status role="status"></p>
</form>
</main>
<script type="application/json" id="fg-labels">{"uk":{"title":"Форма повернення товару","lede":"Початок повернення. Номер замовлення, причина і як це виправити.","submit":"Надіслати","thanks":"Надіслано. Дякуємо.","file_too_big":"Файл більший за 24 КБ. Додайте посилання.","section.order":"Замовлення","order_number":"Номер замовлення","product":"Товар","quantity":"Кількість","section.return":"Повернення","reason":"Причина","reason.damaged":"Прийшов пошкодженим","reason.wrong":"Не той товар","reason.changed_mind":"Передумав","reason.other":"Інше","reason_other":"Інша причина","opened":"Товар розпаковано?","opened.yes":"Так","opened.no":"Ні","resolution":"Що зробити?","resolution.refund":"Повернення коштів","resolution.exchange":"Заміна","section.contact":"Контакт","name":"Ім'я","email":"Електронна пошта","phone":"Телефон","section.evidence":"Фото","photo":"Фото товару, до 24 КБ","photo_url":"Або посилання","section.consent":"Згода","consent_contact":"Погоджуюсь, щоб зі мною зв'язалися щодо цієї заявки.","consent_privacy":"Погоджуюсь, що ці відповіді зберігаються, щоб заявку можна було обробити."},"en":{"title":"Return and RMA form","lede":"Start a return. Ask for the order, the reason, and how to put it right.","submit":"Send","thanks":"Sent. Thank you.","file_too_big":"That file is over 24 KB. Paste a link instead.","section.order":"Order","order_number":"Order number","product":"Item","quantity":"Quantity","section.return":"Return","reason":"Reason","reason.damaged":"Arrived damaged","reason.wrong":"Wrong item","reason.changed_mind":"Changed my mind","reason.other":"Other","reason_other":"Other reason","opened":"Has the item been opened?","opened.yes":"Yes","opened.no":"No","resolution":"What do you want?","resolution.refund":"Refund","resolution.exchange":"Exchange","section.contact":"Contact","name":"Name","email":"Email","phone":"Phone","section.evidence":"Photo","photo":"Photo of the item, up to 24 KB","photo_url":"Or a link","section.consent":"Consent","consent_contact":"I agree to be contacted about this request.","consent_privacy":"I agree that these answers are stored so the request can be handled."},"pl":{"title":"Formularz zwrotu towaru","lede":"Zwrot towaru. Numer zamówienia, powód i sposób rozliczenia.","submit":"Wyślij","thanks":"Wysłano. Dziękujemy.","file_too_big":"Plik ma ponad 24 KB. Wklej link.","section.order":"Zamówienie","order_number":"Numer zamówienia","product":"Produkt","quantity":"Ilość","section.return":"Zwrot","reason":"Powód","reason.damaged":"Dotarł uszkodzony","reason.wrong":"Niewłaściwy produkt","reason.changed_mind":"Zmiana decyzji","reason.other":"Inne","reason_other":"Inny powód","opened":"Czy produkt był otwierany?","opened.yes":"Tak","opened.no":"Nie","resolution":"Czego oczekujesz?","resolution.refund":"Zwrot pieniędzy","resolution.exchange":"Wymiana","section.contact":"Kontakt","name":"Imię","email":"E-mail","phone":"Telefon","section.evidence":"Zdjęcie","photo":"Zdjęcie produktu, do 24 KB","photo_url":"Albo link","section.consent":"Zgoda","consent_contact":"Zgadzam się na kontakt w sprawie tego zgłoszenia.","consent_privacy":"Zgadzam się, aby te odpowiedzi zostały zapisane w celu obsługi zgłoszenia."},"tr":{"title":"Ürün iade formu","lede":"İade başlatın. Sipariş numarası, neden ve nasıl çözüleceği.","submit":"Gönder","thanks":"Gönderildi. Teşekkürler.","file_too_big":"Dosya 24 KB'den büyük. Bağlantı ekleyin.","section.order":"Sipariş","order_number":"Sipariş numarası","product":"Ürün","quantity":"Adet","section.return":"İade","reason":"Neden","reason.damaged":"Hasarlı geldi","reason.wrong":"Yanlış ürün","reason.changed_mind":"Vazgeçtim","reason.other":"Diğer","reason_other":"Diğer neden","opened":"Ürün açıldı mı?","opened.yes":"Evet","opened.no":"Hayır","resolution":"Ne istiyorsunuz?","resolution.refund":"Para iadesi","resolution.exchange":"Değişim","section.contact":"İletişim","name":"Ad","email":"E-posta","phone":"Telefon","section.evidence":"Fotoğraf","photo":"Ürün fotoğrafı, en fazla 24 KB","photo_url":"Ya da bağlantı","section.consent":"Onay","consent_contact":"Bu talep hakkında benimle iletişime geçilmesini kabul ediyorum.","consent_privacy":"Bu yanıtların talebin işlenmesi için saklanmasını kabul ediyorum."}}</script>
<script>
(function () {
  var MAX = 24576;
  var form = document.getElementById("fg-form");
  var packNode = document.getElementById("fg-labels");
  if (!form || !packNode) return;
  var pack = JSON.parse(packNode.textContent);
  function code() {
    var q = new URLSearchParams(location.search).get("lang") || "";
    var raw = (q || document.documentElement.lang || (navigator.language || "en")).slice(0, 2).toLowerCase();
    return pack[raw] ? raw : "en";
  }
  function apply() {
    var dict = pack[code()];
    document.querySelectorAll("[data-i18n]").forEach(function (node) {
      var key = node.getAttribute("data-i18n");
      if (key && typeof dict[key] === "string") node.textContent = dict[key];
    });
  }
  apply();
  var status = form.querySelector("[data-status]");
  form.addEventListener("submit", function (event) {
    event.preventDefault();
    var dict = pack[code()];
    var body = {};
    var files = [];
    new FormData(form).forEach(function (value, key) {
      if (typeof File !== "undefined" && value instanceof File) {
        if (value.size) files.push([key, value]);
        return;
      }
      body[key] = String(value);
    });
    if (files.some(function (pair) { return pair[1].size > MAX; })) {
      if (status) status.textContent = dict.file_too_big;
      return;
    }
    Promise.all(files.map(function (pair) {
      return readFile(pair[1]).then(function (data) {
        body[pair[0] + "_filename"] = pair[1].name;
        body[pair[0] + "_data"] = data;
      });
    })).then(function () {
      return fetch(form.action, {
        method: "POST",
        headers: { "Content-Type": "application/json", Accept: "application/json" },
        body: JSON.stringify(body)
      });
    }).then(function (response) { return response.json(); }).then(function (result) {
      if (status) status.textContent = result && result.success ? dict.thanks : ((result && result.message) || "error");
    }).catch(function () {
      if (status) status.textContent = "error";
    });
  });
  function readFile(file) {
    return new Promise(function (resolve, reject) {
      var reader = new FileReader();
      reader.onload = function () {
        var raw = String(reader.result || "");
        var comma = raw.indexOf(",");
        resolve(comma === -1 ? raw : raw.slice(comma + 1));
      };
      reader.onerror = function () { reject(reader.error); };
      reader.readAsDataURL(file);
    });
  }
})();
</script>
</body>
</html>