Contact Information

Your information is kept strictly private and used only to process your order.

Your details have been pre-filled from your member account. Please review and confirm before continuing.
Please enter your first name.
Please enter your last name.
Please enter a valid email address.
Please enter your phone number.

Shipping Details

All orders include complimentary fully-insured express delivery.

Please enter your address.
Please enter your city.
Please enter your state.
Please enter your ZIP code.

Delivery Method

Carrier Delay Notice Estimated delivery windows are provided by the carrier at time of shipment and are not guaranteed by Watch Affinity. Once your package is tendered to the carrier with a valid tracking number, any delays caused by the carrier, weather, customs, high-volume periods, or other circumstances beyond our control are outside of our responsibility. Watch Affinity will provide tracking information promptly — any transit issues must be resolved directly with the carrier.

Payment Method

Select your preferred payment method. Full instructions will be provided after order confirmation.

Wire Transfer Recommended

Our preferred method for high-value transactions. Secure, fast, and no processing fees. Wire instructions are displayed immediately on your confirmation page.

International wires must be sent in USD. Any currency conversion shortfall is the sender's sole responsibility — the full invoiced amount in USD must be received in our account to complete the transaction.
Cryptocurrency — USDT Only

We accept USDT (Tether) only to eliminate currency fluctuation risk. Wallet address and transfer instructions provided by our team via text at (210) 983-0096 or (512) 964-6875.

Credit Card / In-Store

All major cards accepted at our San Antonio showroom or over the phone. Call (210) 983-0096 to arrange secure phone processing.

A 4% processing fee applies — covers merchant processing & chargeback protection.

Review Your Order

Please review all details carefully before placing your order. Once confirmed, our team will contact you promptly.

Selected Pieces
Contact
Shipping
Payment Method

Special Instructions (Optional)

Order Confirmed

Thank you!

Order #WA-XXXXXXXX

Wire Transfer Instructions

Bank Bank of America
Routing # 026009593
SWIFT BOFAUS3N
Beneficiary Watch Affinity LLC
Account # 488136983697
Bank Address 222 Broadway, New York NY 10038
Beneficiary Address 11808 Wurzbach Rd, San Antonio TX 78230
NO ACH — Wire Transfer Only

Please include your order number in the wire memo. Our team will confirm receipt and ship within 1 business day of cleared funds. Estimated delivery is 3–5 business days from ship date.

International Wire Disclosure All wires — domestic or international — must arrive in US Dollars (USD). If sending from a foreign currency account, your bank's conversion rate and any resulting shortfall are entirely your responsibility. Watch Affinity will not release or ship your order until the full invoiced amount in USD has cleared. Any underpayment due to conversion must be remedied before fulfillment.

Order Confirmation Email

A confirmation email is on its way to you. Please check your inbox and spam folder.

Payment Instructions

Our team will contact you within 2 business hours with payment arrangements.

Shipment & Tracking

Once payment is confirmed, your timepiece ships insured express within 1 business day. Estimated delivery is 3–5 business days from ship date. Tracking provided by text and email. Carrier delays are outside our control once the package is tendered.

Secure Card Verification Required

Your timepiece must ship to the billing address on your card. Please ensure the address entered at checkout matches your card's billing address exactly.

To protect against fraud, we require a copy of your credit card (front & back) and a government-issued photo ID before your order ships. Your documents are transmitted securely and used solely for this transaction.

Complete Card Verification →

Questions? Call or text us:

(210) 983-0096 Text Us

Available 7 days a week · San Antonio

Continue Shopping
'; } function _buildCustomerOrderEmail(order, orderNum, payMethod) { var c = order.contact || {}, items = order.items || []; var subtotal = items.reduce(function(a, w) { return a + (w.callForPrice ? 0 : (w.price || 0)); }, 0); var date = new Date(order.date || Date.now()).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); var nextStep = payMethod === 'wire' ? 'Please initiate your wire transfer using the details below and include your order number ' + orderNum + ' in the memo. We ship within 1 business day of cleared funds.' : payMethod === 'crypto' ? 'Our team will send your USDT wallet address via text shortly. Please have your USDT ready to send.' : payMethod === 'card' ? 'Our team will call the phone number you provided to process your card securely within 2 business hours.' : 'Our team will contact you within 2 business hours with pricing and payment details.'; return '
' + '' + '
11808 Wurzbach Rd · San Antonio, TX 78230 · (210) 983-0096 · info@watch-affinity.com
' + '
' + '
Order Confirmed
' + '
' + orderNum + ' · ' + date + '
' + '

Thank you, ' + (c.firstName || 'valued client') + '. We\'ve received your order and our team will be in touch shortly.

' + '
' + 'Next Step: ' + nextStep + '
' + (payMethod === 'wire' ? '
Wire Transfer Details
' + 'Bank of America
Routing #: 026009593
Account #: 488136983697
SWIFT: BOFAUS3N
' + 'Beneficiary: Watch Affinity LLC
Beneficiary Address: 11808 Wurzbach Rd, San Antonio TX 78230
' + 'Memo: ' + orderNum + '
' : '') + '
' + '
Your Order
' + _fmtItems(items) + (subtotal > 0 ? '
Total$' + (subtotal + ((order.tax && order.tax.amount) || 0)).toLocaleString('en-US', { minimumFractionDigits: 2 }) + '
' : '') + '
' + '

Questions? Reply to this email or call us at (210) 983-0096.

' + '' + '
'; } /* ── ORDER SUBMISSION ───────────────────────────────── */ window.submitOrder = function () { // Validate TOS var tos = document.getElementById('tosCheck'); var tosErr = document.getElementById('tos-err'); if (!tos || !tos.checked) { if (tosErr) tosErr.style.display = 'block'; return; } if (tosErr) tosErr.style.display = 'none'; var items = window.WA_Cart ? WA_Cart.get() : []; if (!items.length) { alert('Your cart is empty. Please add items before placing an order.'); return; } // Generate order number var ts = Date.now().toString(); var orderNum = 'WA-' + ts.slice(-8).toUpperCase(); // Populate hidden fields var fname = (document.getElementById('firstName').value || '').trim(); var lname = (document.getElementById('lastName').value || '').trim(); var email = (document.getElementById('email').value || '').trim(); var phone = (document.getElementById('phone').value || '').trim(); var addr1 = (document.getElementById('address1').value || '').trim(); var addr2 = (document.getElementById('address2').value || '').trim(); var city = (document.getElementById('city').value || '').trim(); var state = (document.getElementById('state').value || '').trim(); var zip = (document.getElementById('zip').value || '').trim(); var country = (document.getElementById('country').value || '').trim(); var shipMethod = document.querySelector('input[name="shippingMethod"]:checked'); var payMethod = (document.getElementById('selectedPayment').value || 'wire'); var notes = (document.getElementById('orderNotes').value || '').trim(); var fullAddr = addr1 + (addr2 ? ', ' + addr2 : '') + ', ' + city + ', ' + state + ' ' + zip + ', ' + country; var shipLabel = shipMethod && shipMethod.value === 'pickup' ? 'In-Store Pickup' : 'Complimentary Insured Express'; // Tax calculation var stateUpper = state.toUpperCase(); var taxAmount = (stateUpper === 'TX' && _cartSubtotal > 0) ? Math.round(_cartSubtotal * TX_TAX_RATE) : 0; var taxJurisdiction = stateUpper === 'TX' ? 'Texas (8.25%)' : (stateUpper ? 'Out-of-state — buyer liability' : ''); document.getElementById('hCartItems').value = JSON.stringify(items); document.getElementById('hContactName').value = fname + ' ' + lname; document.getElementById('hContactEmail').value = email; document.getElementById('hContactPhone').value = phone; document.getElementById('hShippingAddress').value = fullAddr; document.getElementById('hShippingMethod').value = shipLabel; document.getElementById('hPaymentMethod').value = payMethod; document.getElementById('hTaxAmount').value = taxAmount > 0 ? '$' + taxAmount.toLocaleString() : 'N/A'; document.getElementById('hTaxJurisdiction').value = taxJurisdiction; document.getElementById('hOrderNumber').value = orderNum; document.getElementById('hSubject').value = 'New Order ' + orderNum + ' — ' + fname + ' ' + lname; document.getElementById('hReplyTo').value = email; // If wire transfer, include banking details in the email notification if (payMethod === 'wire') { document.getElementById('hWireInstructions').value = 'WIRE TRANSFER INSTRUCTIONS\n' + '----------------------------\n' + 'Bank: Bank of America\n' + 'Routing #: 026009593\n' + 'SWIFT: BOFAUS3N\n' + 'Beneficiary: Watch Affinity LLC\n' + 'Account #: 488136983697\n' + 'Bank Address: 222 Broadway, New York NY 10038\n' + 'Beneficiary Address: 11808 Wurzbach Rd, San Antonio TX 78230\n' + 'NO ACH — WIRE TRANSFER ONLY'; } else { document.getElementById('hWireInstructions').value = 'N/A — ' + payMethod; } // Save to localStorage for records + store snapshot for invoice var orderRecord = { orderNumber: orderNum, date: new Date().toISOString(), contact: { firstName: fname, lastName: lname, email: email, phone: phone }, shipping: { address: fullAddr, method: shipLabel }, payment: { method: payMethod }, tax: { amount: taxAmount, jurisdiction: taxJurisdiction }, items: items, notes: notes }; confirmedOrderNum = orderNum; confirmedPayMethod = payMethod; confirmedOrderData = orderRecord; try { var orders = JSON.parse(localStorage.getItem('wa_orders') || '[]'); orders.unshift(orderRecord); localStorage.setItem('wa_orders', JSON.stringify(orders)); } catch (e) {} // Send order emails via Cloudflare Pages Function — fire and forget var SEND_URL = 'https://www.watch-affinity.com/api/send-document'; fetch(SEND_URL, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ to: 'info@watch-affinity.com', subject: 'New Order ' + orderNum + ' — ' + fname + ' ' + lname, html: _buildStaffOrderEmail(orderRecord, orderNum, payMethod), }), }).catch(function(){}); if (email) { fetch(SEND_URL, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ to: email, subject: 'Your Order ' + orderNum + ' — Watch Affinity', html: _buildCustomerOrderEmail(orderRecord, orderNum, payMethod), }), }).catch(function(){}); } showConfirmation(orderNum, fname, payMethod); }; function showConfirmation(orderNum, firstName, payMethod) { // Clear the cart if (window.WA_Cart) WA_Cart.clear(); // Update confirmation panel var nameEl = document.getElementById('confirmName'); var orderNumEl = document.getElementById('confirmOrderNum'); if (nameEl) nameEl.textContent = 'Thank you, ' + firstName + '!'; if (orderNumEl) orderNumEl.textContent = 'Order ' + orderNum; // Show wire instructions if wire transfer was chosen var wireBox = document.getElementById('wireInstructions'); if (wireBox) wireBox.classList.toggle('visible', payMethod === 'wire'); // Show card verification callout if credit card was chosen var cardVerify = document.getElementById('cardVerifyCallout'); var cardVerifyLink = document.getElementById('cardVerifyLink'); if (cardVerify) cardVerify.classList.toggle('visible', payMethod === 'card'); if (cardVerifyLink && payMethod === 'card') { var params = '?order=' + encodeURIComponent(orderNum) + '&name=' + encodeURIComponent((confirmedOrderData.contact && confirmedOrderData.contact.firstName || '') + ' ' + (confirmedOrderData.contact && confirmedOrderData.contact.lastName || '')) + '&email=' + encodeURIComponent(confirmedOrderData.contact && confirmedOrderData.contact.email || '') + '&phone=' + encodeURIComponent(confirmedOrderData.contact && confirmedOrderData.contact.phone || '') + '&address=' + encodeURIComponent(confirmedOrderData.shipping && confirmedOrderData.shipping.address || ''); cardVerifyLink.href = 'card-verification.html' + params; } // Update the payment instructions timeline text var payInstrEl = document.getElementById('payInstrDetail'); if (payInstrEl) { if (payMethod === 'wire') { payInstrEl.textContent = 'Wire transfer details are shown above. Please initiate your transfer and include your order number in the memo. We ship within 1 business day of cleared funds. Estimated delivery is 3–5 business days from ship date; carrier delays are outside our control.'; } else if (payMethod === 'crypto') { payInstrEl.textContent = 'Our team will send your USDT (Tether) wallet address via text to the number provided. Please have your USDT ready to send.'; } else if (payMethod === 'card') { payInstrEl.textContent = 'Our team will call the phone number you provided to process your card securely. We\'ll be in touch within 2 business hours.'; } else { payInstrEl.textContent = 'Our team will contact you within 2 business hours with pricing and payment details.'; } } // Show step 5 for (var i = 1; i <= 5; i++) { var panel = document.getElementById('panel' + i); if (panel) panel.classList.remove('active'); } var conf = document.getElementById('panel5'); if (conf) conf.classList.add('active'); // Hide sidebar var sidebar = document.getElementById('coSidebar'); if (sidebar) sidebar.style.display = 'none'; // Update progress updateProgress(5); window.scrollTo({ top: 0, behavior: 'smooth' }); // GA4 purchase event if (typeof gtag !== 'undefined') { gtag('event', 'purchase', { transaction_id: orderNum, currency: 'USD', value: window.WA_Cart ? 0 : 0 }); } } /* ── INVOICE PDF GENERATOR ──────────────────────────── */ window.generateInvoicePDF = function () { if (typeof window.jspdf === 'undefined') { alert('Invoice generator is still loading. Please try again in a moment.'); return; } var jsPDF = window.jspdf.jsPDF; var doc = new jsPDF({ unit: 'mm', format: 'a4' }); var order = confirmedOrderData; var contact = order.contact || {}; var ship = order.shipping || {}; var items = order.items || []; var pay = confirmedPayMethod || (order.payment && order.payment.method) || 'wire'; var oNum = confirmedOrderNum || 'WA-XXXXXXXX'; var oDate = order.date ? new Date(order.date).toLocaleDateString('en-US', { year:'numeric', month:'long', day:'numeric' }) : new Date().toLocaleDateString('en-US', { year:'numeric', month:'long', day:'numeric' }); var pw = doc.internal.pageSize.getWidth(); var m = 18; var y = 22; /* -- HEADER ---------------------------------------- */ doc.setFont('helvetica','bold'); doc.setFontSize(18); doc.setTextColor(25,25,25); doc.text('WATCH AFFINITY', m, y); doc.setFont('helvetica','normal'); doc.setFontSize(9); doc.setTextColor(160,125,40); doc.text('INVOICE', pw - m, y, { align:'right' }); y += 6; doc.setFontSize(7.5); doc.setTextColor(100,100,100); doc.text('Watch Affinity LLC | 11808 Wurzbach Rd, San Antonio TX 78230', m, y); doc.text('Order: ' + oNum, pw - m, y, { align:'right' }); y += 4.5; doc.text('(210) 983-0096 | info@watch-affinity.com', m, y); doc.text('Date: ' + oDate, pw - m, y, { align:'right' }); /* -- GOLD RULE ------------------------------------- */ y += 8; doc.setDrawColor(184,151,40); doc.setLineWidth(0.6); doc.line(m, y, pw - m, y); y += 9; /* -- BILL TO / SHIP TO ----------------------------- */ var col2 = m + 95; doc.setFont('helvetica','bold'); doc.setFontSize(6.5); doc.setTextColor(160,125,40); doc.text('BILL TO', m, y); doc.text('SHIP TO', col2, y); y += 5; doc.setFont('helvetica','normal'); doc.setFontSize(9); doc.setTextColor(25,25,25); var fullName = ((contact.firstName || '') + ' ' + (contact.lastName || '')).trim(); doc.text(fullName || '—', m, y); // Ship address — wrap if long var shipLines = doc.splitTextToSize(ship.address || '—', 80); doc.text(shipLines, col2, y); y += 5; doc.text(contact.email || '', m, y); y += 4.5; doc.text(contact.phone || '', m, y); y += Math.max(shipLines.length * 4, 4); /* -- THIN RULE ------------------------------------- */ y += 5; doc.setDrawColor(210,210,210); doc.setLineWidth(0.25); doc.line(m, y, pw - m, y); y += 8; /* -- ITEMS TABLE ----------------------------------- */ // Header row doc.setFillColor(248,245,238); doc.rect(m, y - 4.5, pw - m * 2, 8, 'F'); doc.setFont('helvetica','bold'); doc.setFontSize(6.5); doc.setTextColor(100,100,100); doc.text('BRAND & MODEL', m + 2, y); doc.text('REFERENCE', m + 95, y); doc.text('PRICE', pw - m, y, { align:'right' }); y += 7; doc.setFont('helvetica','normal'); doc.setFontSize(9); doc.setTextColor(25,25,25); var subtotal = 0; var hasPOR = false; items.forEach(function (w) { if (w.callForPrice || !w.price) { hasPOR = true; } else subtotal += (w.price || 0); var label = ((w.brand || '') + ' ' + (w.model || '')).trim(); var ref = w.ref || '—'; var price = (w.callForPrice || !w.price) ? 'Price on Request' : '$' + (w.price || 0).toLocaleString(); doc.text(label, m + 2, y); doc.text(ref, m + 95, y); doc.text(price, pw - m, y, { align:'right' }); y += 7; doc.setDrawColor(235,235,235); doc.setLineWidth(0.15); doc.line(m, y - 2, pw - m, y - 2); if (y > 250) { doc.addPage(); y = 20; } }); /* -- TOTALS ---------------------------------------- */ y += 4; doc.setDrawColor(210,210,210); doc.setLineWidth(0.25); doc.line(m, y, pw - m, y); y += 7; var tX = pw - m - 68; doc.setFont('helvetica','normal'); doc.setFontSize(8.5); doc.setTextColor(100,100,100); doc.text('Shipping', tX, y); doc.setTextColor(25,25,25); doc.text('Complimentary', pw - m, y, { align:'right' }); y += 6; // Tax line in PDF var orderTax = (order.tax && order.tax.amount) ? order.tax.amount : 0; var orderTaxJuris = (order.tax && order.tax.jurisdiction) ? order.tax.jurisdiction : ''; if (orderTax > 0) { doc.setFont('helvetica','normal'); doc.setFontSize(8.5); doc.setTextColor(100,100,100); doc.text('Sales Tax (' + orderTaxJuris + ')', tX, y); doc.setTextColor(160,125,40); doc.text('$' + orderTax.toLocaleString(), pw - m, y, { align:'right' }); y += 6; } else if (orderTaxJuris && orderTaxJuris.indexOf('Out-of-state') !== -1) { doc.setFont('helvetica','italic'); doc.setFontSize(7); doc.setTextColor(140,140,140); doc.text('Sales tax not collected — out-of-state use tax is buyer\'s responsibility.', tX, y); y += 5; } doc.setFont('helvetica','bold'); doc.setFontSize(11); doc.setTextColor(25,25,25); doc.text('TOTAL', tX, y); var grandTotal = subtotal + (orderTax || 0); var totalStr = grandTotal > 0 ? '$' + grandTotal.toLocaleString() : (hasPOR ? 'Price on Request' : '—'); doc.text(totalStr, pw - m, y, { align:'right' }); y += 6; doc.setFont('helvetica','normal'); doc.setFontSize(8); doc.setTextColor(100,100,100); doc.text('Payment Method: ' + (payLabels[pay] || pay), tX, y); y += 14; /* -- WIRE INSTRUCTIONS ----------------------------- */ if (pay === 'wire') { doc.setFillColor(253,250,243); doc.setDrawColor(184,151,40); doc.setLineWidth(0.35); doc.rect(m, y - 5, pw - m * 2, 62, 'FD'); doc.setFont('helvetica','bold'); doc.setFontSize(6.5); doc.setTextColor(140,105,20); doc.text('WIRE TRANSFER INSTRUCTIONS', m + 4, y); y += 6; var wireRows = [ ['Bank', 'Bank of America'], ['Routing #', '026009593'], ['SWIFT', 'BOFAUS3N'], ['Beneficiary', 'Watch Affinity LLC'], ['Account #', '488136983697'], ['Bank Address', '222 Broadway, New York NY 10038'], ['Beneficiary Address', '11808 Wurzbach Rd, San Antonio TX 78230'], ]; doc.setFontSize(8.5); wireRows.forEach(function (row) { doc.setFont('helvetica','normal'); doc.setTextColor(140,105,20); doc.text(row[0], m + 4, y); doc.setTextColor(25,25,25); doc.text(row[1], m + 52, y); y += 5.5; }); y += 1; doc.setFont('helvetica','bold'); doc.setFontSize(7); doc.setTextColor(180,30,30); doc.text('NO ACH — WIRE TRANSFER ONLY', m + 4, y); y += 10; } /* -- FOOTER ---------------------------------------- */ var fy = 278; doc.setDrawColor(210,210,210); doc.setLineWidth(0.25); doc.line(m, fy - 4, pw - m, fy - 4); doc.setFont('helvetica','normal'); doc.setFontSize(6.5); doc.setTextColor(140,140,140); doc.text('Returns subject to Watch Affinity Return Policy at watch-affinity.com/policies. Authenticity guaranteed on all timepieces.', m, fy); doc.text('Watch Affinity LLC | 11808 Wurzbach Rd, San Antonio TX 78230 | (210) 983-0096 | info@watch-affinity.com', m, fy + 5); doc.save('WatchAffinity-Invoice-' + oNum + '.pdf'); }; /* ── CHECK FOR POR ITEMS — show quote card ───────────── */ function checkForPOR() { var items = window.WA_Cart ? WA_Cart.get() : []; var hasPOR = items.some(function (w) { return w.callForPrice || !w.price; }); var quoteCard = document.getElementById('payCardQuote'); if (quoteCard) quoteCard.style.display = hasPOR ? '' : 'none'; } /* ── AUTOFILL FROM MEMBER SESSION ───────────────────── */ function prefillFromSession() { try { var custId = sessionStorage.getItem('wa_portal_session'); if (!custId) return; var customers = JSON.parse(localStorage.getItem('wa_customers') || '[]'); var c = customers.find(function (x) { return x.id === custId; }); if (!c) return; var nameParts = (c.name || '').trim().split(/\s+/); var firstName = nameParts[0] || ''; var lastName = nameParts.slice(1).join(' ') || ''; function setIfEmpty(id, val) { var el = document.getElementById(id); if (el && !el.value.trim() && val) { el.value = val; } } setIfEmpty('firstName', firstName); setIfEmpty('lastName', lastName); setIfEmpty('email', c.email || ''); setIfEmpty('phone', c.phone || ''); setIfEmpty('city', c.city || ''); // Show banner if we filled at least one field if (firstName || c.email) { var banner = document.getElementById('autofillBanner'); if (banner) banner.classList.add('visible'); } } catch (e) {} } /* ── INIT ───────────────────────────────────────────── */ function init() { renderSidebar(); checkForPOR(); prefillFromSession(); updateProgress(1); // Handle empty cart redirect var items = window.WA_Cart ? WA_Cart.get() : []; if (!items.length) { // Show empty message in sidebar but don't redirect — allow browsing steps } document.addEventListener('wa:cart:updated', function () { renderSidebar(); checkForPOR(); }); // Real-time tax update as customer types their state var stateField = document.getElementById('state'); if (stateField) { stateField.addEventListener('input', function () { updateTaxDisplay(this.value); }); stateField.addEventListener('change', function () { updateTaxDisplay(this.value); }); stateField.addEventListener('blur', function () { updateTaxDisplay(this.value); }); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();