MONDAY SALE! β€’ EXTRA 10% OFF + FREE SHIPPING DEAL | CODE:MONDAY10

0

Your Cart is Empty

Shipping and Returns

πŸ“¦ Shipping Policy

πŸ›  Made to Order

All our items are made to order and hand-assembled with care. Once your product is ready, we’ll send you a tracking number and keep you updated on the shipment progress.

⏱ Production Time

  • Canvas Prints: Shipped within 5–7 business days of placing your order.

🚚 Delivery Estimates

  • Single-panel artworks: Delivered within 3–5 business days after shipment.
  • Multi-panel artworks: Delivered within 10–15 business days after shipment.

🌍 Shipping Carriers

We primarily ship via UPS, USPS, or FedEx. In some cases, we may use other carriers based on your location.

🌐 Free Shipping

Free shipping is available on all orders shipped to:

  • United States (USA)
  • Canada (CA)
  • Australia (AUS)

🌏 Where We Ship From

  • Single-panel prints: Shipped from our facility in the USA.
  • Multi-panel artworks: Shipped from our China facility (we're working on expanding to the US/EU for faster delivery).

πŸ“¬ Tracking Information

  • Tracking details are usually emailed within 1–2 business days of shipment.
  • In rare cases, it may take up to 8–10 business days.
  • If you haven’t received tracking info after 14 business days, contact us at support@tiaracle.com.

πŸ” Return Policy

βœ… Easy Returns

We stand by the quality of our work! If you're not satisfied, you can return your item within 30 days of purchase.

πŸ’΅ Refund & Return Details

  • No restocking fees.
  • Return shipping costs are the customer's responsibility unless noted below.
  • Refunds are processed once we receive and inspect the returned item.
  • Items must be returned in new condition and packaged as received.

To start a return, email support@tiaracle.com with your order number for instructions.

⚠️ Important Return Notes

  • No refunds for damaged items – we’ll send a free replacement instead.
  • Free return shipping is only available for:
    • Items not on sale or discounted.
    • Items under 40" in height.
  • Unauthorized returns may not be accepted or refunded.

πŸ“¦ Undelivered or Returned Packages

Returned to Sender

If your package is returned to us, we will contact you to confirm the address before re-shipping.

You may be responsible for re-shipping costs if:

  • The address provided at checkout was incorrect or incomplete.
  • The package was unclaimed, even if the address was correct.
  • You request the package to be sent to a new address.

πŸ“¦ Re-shipping Fee

Re-shipping costs are 20% of the product price. This helps us cover original free shipping and production costs.

Refunds for Returned Packages

  • If you choose not to have your item re-shipped, a 20% deduction will be applied to your refund.
  • If a package is lost due to an incorrect address and cannot be returned, we are unable to issue a refund or replacement.
  • If tracking shows "Delivered" at the correct address, we cannot issue a refund or replacement.

πŸ“© Need Help?

Have questions about your order or return? Contact our support team at support@tiaracle.com. We're here to help!

) */ (function () { var PARAM_KEYS = ["gclid", "wbraid", "gbraid"]; var STORAGE_KEY = "ad_click_ids"; var MAX_AGE_DAYS = 90; function now() { return Date.now(); } function days(ms) { return ms / (24 * 60 * 60 * 1000); } function getParam(name) { var s = window.location.search; if (!s) return ""; var params = new URLSearchParams(s); // Make param lookup case-insensitive var lower = name.toLowerCase(); for (const [k, v] of params.entries()) { if (k.toLowerCase() === lower) return v || ""; } return ""; } function loadStored() { try { var raw = localStorage.getItem(STORAGE_KEY); if (!raw) return {}; var obj = JSON.parse(raw); // prune old records if (obj._ts && days(now() - obj._ts) > MAX_AGE_DAYS) return {}; return obj || {}; } catch (e) { return {}; } } function saveStored(obj) { try { obj._ts = now(); localStorage.setItem(STORAGE_KEY, JSON.stringify(obj)); } catch (e) {} } function sanitize(val) { if (typeof val !== "string") val = String(val || ""); // keep it small & clean val = val.trim().slice(0, 200); return val; } function collectIdsFromUrl() { var out = {}; PARAM_KEYS.forEach(function (k) { var v = getParam(k); if (v) out[k] = sanitize(v); }); return out; } function merge(a, b) { var out = Object.assign({}, a || {}); Object.keys(b || {}).forEach(function (k) { if (b[k]) out[k] = b[k]; }); return out; } async function getCartAttributes() { try { const res = await fetch("/cart.js", { credentials: "same-origin" }); if (!res.ok) return {}; const cart = await res.json(); return cart && cart.attributes ? cart.attributes : {}; } catch (e) { return {}; } } async function updateCartAttributes(attrs) { // Only send non-empty attributes var payload = { attributes: {} }; Object.keys(attrs).forEach(function (k) { if (attrs[k]) payload.attributes[k] = attrs[k]; }); if (!Object.keys(payload.attributes).length) return; try { await fetch("/cart/update.js", { method: "POST", credentials: "same-origin", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); } catch (e) { // swallow; we don't want to break the page } } async function sync() { // 1) read existing stored ids var stored = loadStored(); // 2) collect any fresh ids from URL and merge var fromUrl = collectIdsFromUrl(); var merged = merge(stored, fromUrl); // 3) persist if changed var changed = JSON.stringify(stored) !== JSON.stringify(merged); if (changed) saveStored(merged); // 4) push into cart attributes if anything is new/not present var cartAttrs = await getCartAttributes(); var toPush = {}; ["gclid", "wbraid", "gbraid"].forEach(function (k) { if (merged[k] && cartAttrs[k] !== merged[k]) { toPush[k] = merged[k]; } }); // add a simple provenance flag (optional) if (Object.keys(toPush).length) { toPush["_ad_ids_source"] = "theme_script"; await updateCartAttributes(toPush); } } // Run after DOM is ready but no need to wait for onload if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", sync); } else { sync(); } })();