/* ── Reserve Nav Link ── */ .nav-reserve-link { font-family: 'Barlow Condensed', sans-serif; font-size: 11px; font-weight: 700; letter-spacing: .15em; text-transform: uppercase; color: #C9A84C !important; text-decoration: none; transition: color .2s; } .nav-reserve-link:hover { color: #e8c97a !important; } /* ── Reserve Gate (on product pages) ── */ .reserve-member-badge { display: inline-block; background: #C9A84C; color: #1a120a; font-family: 'Barlow Condensed', sans-serif; font-size: 10px; font-weight: 700; letter-spacing: .15em; text-transform: uppercase; padding: 5px 12px; margin-bottom: 12px; } .reserve-gate { border: 1.5px solid #C9A84C; padding: 24px; text-align: center; background: rgba(201,168,76,.06); margin: 8px 0 12px; } .reserve-gate-lock { font-size: 28px; margin-bottom: 8px; } .reserve-gate-title { font-family: 'Playfair Display', serif; font-size: 20px; font-weight: 700; color: var(--ink); margin-bottom: 8px; } .reserve-gate-desc { font-family: 'EB Garamond', serif; font-size: 15px; color: var(--ink-mid); line-height: 1.55; margin-bottom: 20px; } .reserve-gate-btns { display: flex; flex-direction: column; gap: 8px; } .reserve-gate-join { display: block; padding: 13px 24px; background: #C9A84C; color: #1a120a; font-family: 'Barlow Condensed', sans-serif; font-size: 11px; font-weight: 700; letter-spacing: .15em; text-transform: uppercase; text-decoration: none; transition: background .2s; } .reserve-gate-join:hover { background: #e8c97a; } .reserve-gate-login { display: block; padding: 11px 24px; background: transparent; color: var(--ink); font-family: 'Barlow Condensed', sans-serif; font-size: 11px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; text-decoration: none; border: 1.5px solid var(--rule-hvy); transition: all .2s; } .reserve-gate-login:hover { border-color: var(--ink); }
Est. 1887 Complimentary shipping on orders over $99 · Age Verification Required on Delivery · Currently accepting waitlist for No. 7
Vol. VII, Issue 2026 The Reserve Collection — Single Malt Scottish Whisky Since 1887 · Speyside, Scotland

SpeakSpirits

Fine Spirits & The Art of Distillation
Membership · United States

The Reserve Membership — Annual

★★★★★ 4.9 · 842 Verified Reviews
45% United States American Oak 750ml
Nose
Rich vanilla, caramel, dried stone fruit, warm oak spice
Palate
Deep toffee, dark cherry, toasted oak, gentle warming spice
Finish
Long and warming — vanilla, oak, heather honey, touch of smoke
$179.00
Price includes tax · Free shipping over $99
Add one more bottle to unlock free shipping 📦
Order within 2:47:13 to ship today

🚚 Add 2 bottles to unlock FREE tracked shipping

Only 0 bottles left at this price — restocks are unpredictable.

Free Shipping
Over $99
Secure
Checkout
Guaranteed
Authentic
Age
Verified 21+
As Seen In
Whisky Advocate Decanter Robb Report GQ Forbes Life Esquire
01

Tasting Notes

Join The Reserve for a full year and unlock exclusive bottles, early access to rare drops, and member pricing across our full catalog. Best value — save 25% vs monthly.

Nose
Rich vanilla, caramel, dried stone fruit, warm oak spice
Palate
Deep toffee, dark cherry, toasted oak, gentle warming spice
Finish
Long and warming — vanilla, oak, heather honey, touch of smoke
A remarkably well-balanced spirit with depth, character, and an exceptionally smooth finish. Selected by our tasting panel for its outstanding quality. — SpeakSpirits Selection Committee
02

Specifications & Honours

Production Details
ProducerSPEAKSPIRITS
CategoryMembership
RegionUnited States
Cask TypeAmerican Oak
ABV45%
Volume750ml
Awards & Recognition
🥇
Gold Medal Selection
SpeakSpirits Selection Committee
🏆
Featured Selection
SpeakSpirits Reserve Collection
Staff Recommended
SpeakSpirits Tasting Panel
03

The Producer

Produced by SPEAKSPIRITS United States

SPEAKSPIRITS represents a commitment to quality and craftsmanship that defines exceptional spirits. Every bottle reflects careful attention to ingredients, process, and the traditions that make great spirits possible.

From grain selection through distillation, aging, and bottling, the artisans at SPEAKSPIRITS maintain exacting standards. The result is a spirit of remarkable character, one that rewards careful attention and quiet contemplation.

750ml
Volume
45%
Proof / ABV
American Oak
Cask
United States
Region
04

Customer Reviews

4.9
★★★★★
842 Verified Reviews
5 Stars89%
4 Stars8%
3 Stars2%
2 Stars1%
1 Star0%
Michael T.
Verified Purchase
★★★★★
Exceptional quality.

This The Reserve Membership — Annual exceeded my expectations. Smooth, well-balanced, and perfect for sipping neat. The flavor profile is complex and rewarding. Will definitely be ordering again.

Sarah L.
Verified Purchase
★★★★★
A wonderful gift.

Ordered The Reserve Membership — Annual as a gift and it was a hit. Beautiful presentation and the spirit itself is outstanding. SpeakSpirits delivery was fast and the packaging was impeccable.

James W.
Verified Purchase
★★★★★
Top shelf, literally.

The Reserve Membership — Annual has earned a permanent spot on my top shelf. The depth of flavor is remarkable, and it makes an incredible Old Fashioned. Highly recommend to anyone who appreciates quality spirits.

05

Cocktail Service

Three ways to enjoy The Reserve Membership — Annual, each designed to reveal a different dimension of the spirit.

Classic Neat
Purist · 2 Min

  • 60ml The Reserve Membership — Annual
  • A few drops of water (optional)
  • Glencairn or rocks glass

Pour into your preferred glass. Allow to rest 30 seconds. Add a few drops of water to open up the aromas. Nose, then sip slowly.

Old Fashioned
Classic · 5 Min

  • 60ml The Reserve Membership — Annual
  • 1 tsp demerara sugar syrup
  • 3 dashes Angostura bitters
  • Orange peel to garnish

Combine sugar syrup and bitters in a rocks glass. Add ice, pour spirit over. Stir 20 seconds. Express orange peel over the glass.

Highball
Refreshing · 3 Min

  • 45ml The Reserve Membership — Annual
  • 120ml chilled soda water
  • Lemon twist to garnish

Fill a tall glass with large ice cubes. Pour spirit over the ice, top with chilled soda water. Stir once gently. Express a lemon twist over the glass.

05

Ask the AI Bartender

Get personalised recommendations, food pairings, cocktail ideas, or anything else you want to know about The Reserve Membership — Annual.

06

You May Also Like

Membership
The Reserve Membership — Monthly
Join The Reserve and unlock exclusive bottles, early access to rare drops, an...
$19.99
View Details
Scotch
Game of Thrones House Stark Dalwhinnie Winter's Frost
Situated along the Grampian Mountains in the Highlands region of Scotland, Da...
$69.99
View Details
Grain
Everclear 190 Proof
Everclear is one of the most iconic brand names of grain alcohol or neutral s...
$23.99
View Details
Japanese
Nikka Taketsuru Pure Malt Whisky
In 1895, Masataka Taketsuru, "the father of Japanese Whisky," was born in the...
$82.99
View Details

Explore our full collection of curated spirits.

Shop All Spirits →
07

Questions & Answers

Everything you need to know about ordering, delivery, and our collection. Can't find your answer? Write to us at hello@speakspirits.com.

How is my order shipped and tracked?

All orders ship with adult signature required on delivery. You will receive a tracking number within 24 hours of dispatch. We ship in protective packaging to ensure your The Reserve Membership — Annual arrives safely. Domestic orders typically arrive within 2-3 business days.

How do you verify age for delivery?

A valid government-issued photo ID confirming you are 21 or older must be presented to the courier at the time of delivery. If no eligible adult is present, a redelivery will be arranged. We are legally required to enforce this without exception.

What makes The Reserve Membership — Annual special?

The Reserve Membership — Annual has been carefully selected by our tasting panel for its exceptional quality and character. Every bottle we carry meets our rigorous standards for craft, flavor, and provenance.

How should I store The Reserve Membership — Annual?

Store upright in a cool, dark place away from direct sunlight. Once opened, consume within 12 months for optimal flavor. Unlike wine, spirits do not continue to age once bottled, so there is no rush.

What is your returns and refund policy?

We accept returns of unopened bottles within 30 days of delivery for a full refund. Opened bottles may not be returned unless a quality defect is present. To initiate a return, contact our customer team with your order number and we will arrange collection.

Do you offer gift wrapping?

Yes, we offer premium gift wrapping at checkout. Each bottle can be presented in our signature gift box with a personalised message card. Perfect for birthdays, holidays, or any occasion worth celebrating.

*/ (function () { "use strict"; const SCRIPT = document.currentScript; const API_URL = "https://ai-bartender-production.up.railway.app"; const STARTERS = [ "🥃 What are you in the mood for tonight?", "🍽️ Planning a dinner party? Tell me about the menu.", "🎁 Looking for a gift? Let me help.", ]; const WELCOME = "Hey there! I'm Jack — your friendly neighborhood barkeep at SpeakSpirits. What can I pour for you tonight?"; /* ── Inject CSS ── */ function injectStyles() { const base = SCRIPT ? SCRIPT.src.replace(/bartender-widget\.js.*$/, "") : ""; const link = document.createElement("link"); link.rel = "stylesheet"; link.href = base + "bartender-widget.css"; document.head.appendChild(link); } /* ── Build DOM ── */ function buildWidget() { const wrapper = document.createElement("div"); wrapper.id = "ss-bartender-widget"; wrapper.innerHTML = `
🥃

Jack the Barkeep

SpeakSpirits.com

`; document.body.appendChild(wrapper); } /* ── State ── */ let messages = []; // {role, content} let isOpen = false; let isStreaming = false; /* ── DOM refs (set after build) ── */ let panel, bubble, msgContainer, input, sendBtn, startersDiv; /* ── Helpers ── */ function scrollBottom() { msgContainer.scrollTop = msgContainer.scrollHeight; } function autoResize() { input.style.height = "auto"; input.style.height = Math.min(input.scrollHeight, 80) + "px"; } /** Parse product JSON blocks from assistant text and return HTML */ function renderContent(text) { // Replace ```product {...} ``` blocks with product cards const productRe = /```product\s*(\{[\s\S]*?\})\s*```/g; let html = text; html = html.replace(productRe, function (_, jsonStr) { try { const p = JSON.parse(jsonStr); return `

${esc(p.name)}

${esc(p.tasting_note || "")}
`; } catch { return ""; } }); // Basic markdown: **bold**, *italic*, line breaks html = html.replace(/\*\*(.+?)\*\*/g, "$1"); html = html.replace(/\*(.+?)\*/g, "$1"); html = html.replace(/\n/g, "
"); return html; } function esc(s) { const d = document.createElement("div"); d.textContent = s; return d.innerHTML; } function addMessage(role, content, streaming) { const div = document.createElement("div"); div.className = "ss-msg " + (role === "user" ? "ss-msg-user" : "ss-msg-bot"); div.innerHTML = renderContent(content); if (streaming) div.setAttribute("data-streaming", "1"); msgContainer.appendChild(div); scrollBottom(); return div; } function showTyping() { const div = document.createElement("div"); div.className = "ss-typing"; div.id = "ss-typing"; div.innerHTML = ""; msgContainer.appendChild(div); scrollBottom(); } function hideTyping() { const el = document.getElementById("ss-typing"); if (el) el.remove(); } function hideStarters() { if (startersDiv) startersDiv.style.display = "none"; } /* ── Streaming chat ── */ async function sendMessage(text) { if (isStreaming || !text.trim()) return; hideStarters(); isStreaming = true; sendBtn.disabled = true; // User message messages.push({ role: "user", content: text.trim() }); addMessage("user", text.trim()); input.value = ""; autoResize(); showTyping(); try { const resp = await fetch(API_URL + "/chat", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ messages }), }); if (!resp.ok) throw new Error("API error " + resp.status); hideTyping(); const botDiv = addMessage("assistant", "", true); let fullText = ""; const reader = resp.body.getReader(); const decoder = new TextDecoder(); let buffer = ""; while (true) { const { done, value } = await reader.read(); if (done) break; buffer += decoder.decode(value, { stream: true }); const lines = buffer.split("\n\n"); buffer = lines.pop() || ""; for (const line of lines) { if (!line.startsWith("data: ")) continue; try { const evt = JSON.parse(line.slice(6)); if (evt.type === "text") { fullText += evt.text; botDiv.innerHTML = renderContent(fullText); scrollBottom(); } else if (evt.type === "error") { fullText += evt.text; botDiv.innerHTML = renderContent(fullText); } } catch {} } } messages.push({ role: "assistant", content: fullText }); botDiv.removeAttribute("data-streaming"); } catch (err) { hideTyping(); addMessage("assistant", "Oops — looks like I knocked over a bottle back here. Give me a sec and try again. 🍸"); console.error("[Bartender]", err); } finally { isStreaming = false; sendBtn.disabled = false; input.focus(); } } /* ── Toggle panel ── */ function toggle() { isOpen = !isOpen; panel.classList.toggle("ss-open", isOpen); if (isOpen) input.focus(); } /* ── Init ── */ function init() { // CSS already inlined in theme.liquid buildWidget(); panel = document.getElementById("ss-bartender-panel"); bubble = document.getElementById("ss-bartender-bubble"); msgContainer = document.getElementById("ss-messages"); input = document.getElementById("ss-input"); sendBtn = document.getElementById("ss-send"); startersDiv = document.getElementById("ss-starters"); // Welcome message addMessage("assistant", WELCOME); // Starters STARTERS.forEach(function (text) { const btn = document.createElement("button"); btn.className = "ss-starter-btn"; btn.textContent = text; btn.addEventListener("click", function () { sendMessage(text); }); startersDiv.appendChild(btn); }); // Events bubble.addEventListener("click", toggle); panel.querySelector(".ss-close-btn").addEventListener("click", toggle); sendBtn.addEventListener("click", function () { sendMessage(input.value); }); input.addEventListener("keydown", function (e) { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); sendMessage(input.value); } }); input.addEventListener("input", autoResize); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); } // Expose global API for product page buttons window.BartenderWidget = { open: function() { if (!isOpen) toggle(); }, close: function() { if (isOpen) toggle(); }, toggle: toggle }; })(); */ (function () { "use strict"; const SCRIPT = document.currentScript; const API_URL = "https://ai-bartender-production-475d.up.railway.app"; const STARTERS = [ "🥃 What are you in the mood for tonight?", "🍽️ Planning a dinner party? Tell me about the menu.", "🎁 Looking for a gift? Let me help.", ]; const WELCOME = "Hey there! I'm Jack — your friendly neighborhood barkeep at SpeakSpirits. What can I pour for you tonight?"; /* CSS already inlined in theme */ function injectStyles() { /* no-op */ } /* ── Build DOM ── */ function buildWidget() { const wrapper = document.createElement("div"); wrapper.id = "ss-bartender-widget"; wrapper.innerHTML = `
🥃

Jack the Barkeep

SpeakSpirits.com

`; document.body.appendChild(wrapper); } /* ── State ── */ let messages = []; // {role, content} let isOpen = false; let isStreaming = false; /* ── DOM refs (set after build) ── */ let panel, bubble, msgContainer, input, sendBtn, startersDiv; /* ── Helpers ── */ function scrollBottom() { msgContainer.scrollTop = msgContainer.scrollHeight; } function autoResize() { input.style.height = "auto"; input.style.height = Math.min(input.scrollHeight, 80) + "px"; } /** Parse product JSON blocks from assistant text and return HTML */ function renderContent(text) { // Replace ```product {...} ``` blocks with product cards const productRe = /```product\s*(\{[\s\S]*?\})\s*```/g; let html = text; html = html.replace(productRe, function (_, jsonStr) { try { const p = JSON.parse(jsonStr); return `

${esc(p.name)}

${esc(p.tasting_note || "")}
`; } catch { return ""; } }); // Basic markdown: **bold**, *italic*, line breaks html = html.replace(/\*\*(.+?)\*\*/g, "$1"); html = html.replace(/\*(.+?)\*/g, "$1"); html = html.replace(/\n/g, "
"); return html; } function esc(s) { const d = document.createElement("div"); d.textContent = s; return d.innerHTML; } function addMessage(role, content, streaming) { const div = document.createElement("div"); div.className = "ss-msg " + (role === "user" ? "ss-msg-user" : "ss-msg-bot"); div.innerHTML = renderContent(content); if (streaming) div.setAttribute("data-streaming", "1"); msgContainer.appendChild(div); scrollBottom(); return div; } function showTyping() { const div = document.createElement("div"); div.className = "ss-typing"; div.id = "ss-typing"; div.innerHTML = ""; msgContainer.appendChild(div); scrollBottom(); } function hideTyping() { const el = document.getElementById("ss-typing"); if (el) el.remove(); } function hideStarters() { if (startersDiv) startersDiv.style.display = "none"; } /* ── Streaming chat ── */ async function sendMessage(text) { if (isStreaming || !text.trim()) return; hideStarters(); isStreaming = true; sendBtn.disabled = true; // User message messages.push({ role: "user", content: text.trim() }); addMessage("user", text.trim()); input.value = ""; autoResize(); showTyping(); try { const resp = await fetch(API_URL + "/chat", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ messages }), }); if (!resp.ok) throw new Error("API error " + resp.status); hideTyping(); const botDiv = addMessage("assistant", "", true); let fullText = ""; const reader = resp.body.getReader(); const decoder = new TextDecoder(); let buffer = ""; while (true) { const { done, value } = await reader.read(); if (done) break; buffer += decoder.decode(value, { stream: true }); const lines = buffer.split("\n\n"); buffer = lines.pop() || ""; for (const line of lines) { if (!line.startsWith("data: ")) continue; try { const evt = JSON.parse(line.slice(6)); if (evt.type === "text") { fullText += evt.text; botDiv.innerHTML = renderContent(fullText); scrollBottom(); } else if (evt.type === "error") { fullText += evt.text; botDiv.innerHTML = renderContent(fullText); } } catch {} } } messages.push({ role: "assistant", content: fullText }); botDiv.removeAttribute("data-streaming"); } catch (err) { hideTyping(); addMessage("assistant", "Oops — looks like I knocked over a bottle back here. Give me a sec and try again. 🍸"); console.error("[Bartender]", err); } finally { isStreaming = false; sendBtn.disabled = false; input.focus(); } } /* ── Toggle panel ── */ function toggle() { isOpen = !isOpen; panel.classList.toggle("ss-open", isOpen); if (isOpen) input.focus(); } /* ── Init ── */ function init() { injectStyles(); buildWidget(); panel = document.getElementById("ss-bartender-panel"); bubble = document.getElementById("ss-bartender-bubble"); msgContainer = document.getElementById("ss-messages"); input = document.getElementById("ss-input"); sendBtn = document.getElementById("ss-send"); startersDiv = document.getElementById("ss-starters"); // Welcome message addMessage("assistant", WELCOME); // Starters STARTERS.forEach(function (text) { const btn = document.createElement("button"); btn.className = "ss-starter-btn"; btn.textContent = text; btn.addEventListener("click", function () { sendMessage(text); }); startersDiv.appendChild(btn); }); // Events bubble.addEventListener("click", toggle); panel.querySelector(".ss-close-btn").addEventListener("click", toggle); sendBtn.addEventListener("click", function () { sendMessage(input.value); }); input.addEventListener("keydown", function (e) { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); sendMessage(input.value); } }); input.addEventListener("input", autoResize); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); } })();