Google Shopping Ads Management - River Stone *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { scroll-behavior: smooth; } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #fff; color: #0a0a0a; -webkit-font-smoothing: antialiased; overflow-x: hidden; } a { text-decoration: none; color: inherit; } img { display: block; max-width: 100%; } /* ── TOKENS ── */ :root { --blue: #0623ED; --blue-deep: #000986; --blue-mid: #1961FE; --cyan: #4DD8F2; --white: #ffffff; --gray-50: #f8fafc; --gray-100: #f1f5f9; --gray-200: #e2e8f0; --gray-400: #94a3b8; --gray-600: #475569; --gray-800: #1e293b; --black: #0a0a0a; --max: 1160px; --pad: 0 40px; } /* ── LAYOUT ── */ .wrap { max-width: var(--max); margin: 0 auto; padding: var(--pad); } /* ── HERO ── */ .rs-hero { background-image: url("https://riverstonemarketingsolutions.com/wp-content/uploads/2026/01/header-bg.webp"); background-size: cover; background-position: center top; background-repeat: no-repeat; background-color: #030DB8; min-height: 100vh; display: flex; flex-direction: column; justify-content: center; position: relative; overflow: hidden; padding: 140px 40px 80px; margin-top: -80px; } .rs-hero::before { content: ""; position: absolute; inset: 0; background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ffffff' fill-opacity='0.03'%3E%3Cpath d='M36 34v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zm0-30V0h-2v4h-4v2h4v4h2V6h4V4h-4zM6 34v-4H4v4H0v2h4v4h2v-4h4v-2H6zM6 4V0H4v4H0v2h4v4h2V6h4V4H6z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); } .rs-hero::after { content: ""; position: absolute; top: -200px; right: -200px; width: 800px; height: 800px; background: radial-gradient(circle, rgba(77,216,242,0.15) 0%, transparent 65%); pointer-events: none; } .rs-hero-inner { max-width: var(--max); margin: 0 auto; display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; position: relative; z-index: 1; width: 100%; padding: 0 8px; } .rs-hero-tag { display: inline-flex; align-items: center; gap: 8px; font-size: 11px; font-weight: 700; letter-spacing: 2px; color: var(--cyan); text-transform: uppercase; margin-bottom: 20px; } .rs-hero-tag::before { content: ""; width: 28px; height: 1px; background: var(--cyan); } .rs-hero h1 { font-size: clamp(36px, 5vw, 58px); font-weight: 700; line-height: 1.08; letter-spacing: -0.03em; color: #fff; margin-bottom: 20px; } .rs-hero h1 em { font-style: normal; color: var(--cyan); } .rs-hero-sub { font-size: 17px; line-height: 1.6; color: rgba(255,255,255,0.75); margin-bottom: 12px; max-width: 500px; } .rs-hero-note { font-size: 15px; font-style: italic; color: rgba(255,255,255,0.5); margin-bottom: 36px; } .rs-hero-btns { display: flex; gap: 12px; flex-wrap: wrap; } .rs-btn { display: inline-flex; align-items: center; gap: 8px; font-size: 15px; font-weight: 600; padding: 13px 26px; border-radius: 8px; transition: all 0.2s; border: 1.5px solid transparent; } .rs-btn svg { width: 14px; height: 14px; flex-shrink: 0; transition: transform 0.2s; } .rs-btn:hover svg { transform: translateX(3px); } .rs-btn-white { background: #fff; color: var(--blue); } .rs-btn-white:hover { background: var(--cyan); color: var(--blue-deep); } .rs-btn-ghost { background: transparent; color: #fff; border-color: rgba(255,255,255,0.35); } .rs-btn-ghost:hover { background: rgba(255,255,255,0.1); border-color: rgba(255,255,255,0.6); } .rs-btn-blue { background: var(--blue-mid); color: #fff; } .rs-btn-blue:hover { background: var(--blue); transform: translateY(-1px); box-shadow: 0 8px 24px -8px rgba(25,97,254,0.5); } .rs-hero-micro { font-size: 12px; color: rgba(255,255,255,0.4); margin-top: 14px; } /* Hero right - abstract visual */ .rs-hero-visual { position: relative; } .rs-hero-graphic { background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12); border-radius: 20px; padding: 32px; backdrop-filter: blur(8px); } .rs-hero-graphic-title { font-size: 11px; font-weight: 700; letter-spacing: 1.5px; text-transform: uppercase; color: rgba(255,255,255,0.5); margin-bottom: 24px; } .rs-metric-row { display: flex; justify-content: space-between; align-items: center; padding: 14px 0; border-bottom: 1px solid rgba(255,255,255,0.06); } .rs-metric-row:last-of-type { border-bottom: none; } .rs-metric-label { font-size: 14px; color: rgba(255,255,255,0.7); display: flex; align-items: center; gap: 10px; } .rs-metric-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; } .rs-metric-dot.green { background: #22c55e; } .rs-metric-dot.red { background: #ef4444; } .rs-metric-dot.amber { background: #f59e0b; } .rs-metric-dot.blue { background: var(--cyan); } .rs-metric-val { font-size: 15px; font-weight: 700; } .rs-metric-val.good { color: #4ade80; } .rs-metric-val.bad { color: #f87171; } .rs-metric-val.neutral { color: rgba(255,255,255,0.9); } .rs-metric-tag { font-size: 10px; font-weight: 600; padding: 3px 8px; border-radius: 4px; text-transform: uppercase; letter-spacing: 0.5px; } .rs-metric-tag.scale { background: rgba(34,197,94,0.15); color: #4ade80; } .rs-metric-tag.drain { background: rgba(239,68,68,0.15); color: #f87171; } .rs-metric-tag.hold { background: rgba(245,158,11,0.15); color: #fbbf24; } .rs-hero-graphic-foot { margin-top: 20px; padding-top: 16px; border-top: 1px solid rgba(255,255,255,0.08); display: flex; justify-content: space-between; align-items: center; } .rs-hero-graphic-foot-label { font-size: 12px; color: rgba(255,255,255,0.4); } .rs-hero-graphic-foot-val { font-size: 13px; font-weight: 700; color: var(--cyan); } .rs-hero-float { position: absolute; bottom: -16px; left: -20px; background: var(--cyan); color: var(--blue-deep); padding: 12px 16px; border-radius: 10px; font-size: 12px; font-weight: 600; line-height: 1.4; max-width: 200px; box-shadow: 0 8px 24px rgba(77,216,242,0.3); transform: rotate(-1.5deg); } .rs-hero-float strong { display: block; font-size: 11px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; opacity: 0.6; margin-bottom: 4px; } /* ── TRUST BAR ── */ .rs-trust { background: var(--gray-50); border-top: 1px solid var(--gray-200); border-bottom: 1px solid var(--gray-200); padding: 20px 40px; } .rs-trust-inner { max-width: var(--max); margin: 0 auto; display: flex; align-items: center; justify-content: space-between; gap: 24px; flex-wrap: wrap; } .rs-trust-item { display: flex; align-items: center; gap: 10px; font-size: 13px; color: var(--gray-600); } .rs-trust-item svg { width: 16px; height: 16px; color: var(--blue-mid); flex-shrink: 0; } .rs-trust-item strong { color: var(--gray-800); font-weight: 600; } .rs-trust-divider { width: 1px; height: 20px; background: var(--gray-200); } /* ── SECTION WRAPPER ── */ .rs-section { padding: 64px 40px; } .rs-section--gray { background: var(--gray-50); } .rs-section--dark { background: #EEF2FF; } .rs-section--blue { background: linear-gradient(135deg, #0211C4 0%, #000986 100%); } .rs-section-inner { max-width: var(--max); margin: 0 auto; } /* ── LABELS ── */ .rs-label { display: inline-block; font-size: 11px; font-weight: 700; letter-spacing: 2px; text-transform: uppercase; color: var(--blue-mid); margin-bottom: 12px; } .rs-label--white { color: var(--cyan); } .rs-label--gray { color: var(--gray-400); } /* ── HEADINGS ── */ .rs-h2 { font-size: clamp(26px, 3.5vw, 40px); font-weight: 700; line-height: 1.15; letter-spacing: -0.02em; color: var(--black); margin-bottom: 16px; } .rs-h2--white { color: #fff; } .rs-h2 em { font-style: normal; color: var(--blue-mid); } .rs-intro { font-size: 17px; line-height: 1.65; color: var(--gray-600); max-width: 640px; margin-bottom: 40px; } .rs-intro--white { color: rgba(255,255,255,0.75); } /* ── TWO COL ── */ .rs-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; } .rs-2col--flip > *:first-child { order: 2; } .rs-2col--flip > *:last-child { order: 1; } /* ── CHECKLIST ── */ .rs-checks { list-style: none; margin: 20px 0 28px; } .rs-checks li { display: flex; align-items: flex-start; gap: 12px; font-size: 15px; line-height: 1.55; color: var(--gray-800); padding: 8px 0; border-bottom: 1px solid var(--gray-100); } .rs-checks li:last-child { border-bottom: none; } .rs-checks li::before { content: ""; width: 18px; height: 18px; flex-shrink: 0; margin-top: 2px; background: var(--blue-mid); border-radius: 50%; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 18 18' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 9l3 3 5-5' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' fill='none'/%3E%3C/svg%3E"); background-size: cover; } .rs-checks li strong { color: var(--black); font-weight: 600; } /* ── STATS ROW ── */ .rs-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; background: var(--gray-200); border: 1px solid var(--gray-200); border-radius: 16px; overflow: hidden; margin: 48px 0; } .rs-stat { background: #fff; padding: 28px 24px; text-align: center; } .rs-stat-num { font-size: 38px; font-weight: 800; color: var(--blue-mid); letter-spacing: -0.03em; line-height: 1; margin-bottom: 6px; } .rs-stat-label { font-size: 13px; font-weight: 600; color: var(--gray-800); margin-bottom: 4px; } .rs-stat-sub { font-size: 12px; color: var(--gray-400); } /* ── PROBLEM ROWS ── */ .rs-problems { display: flex; flex-direction: column; gap: 10px; } .rs-problem { background: #fff; border: 1px solid #fee2e2; border-left: 3px solid #ef4444; border-radius: 10px; padding: 16px 20px; display: flex; justify-content: space-between; align-items: center; gap: 16px; } .rs-problem-text { font-size: 14px; color: #7f1d1d; font-weight: 500; } .rs-problem-metric { font-size: 13px; font-weight: 700; color: #dc2626; white-space: nowrap; } /* ── 4-COL GRID ── */ .rs-4col { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; } .rs-card { background: #fff; border: 1px solid var(--gray-200); border-radius: 14px; padding: 28px 24px; position: relative; overflow: hidden; transition: transform 0.3s cubic-bezier(0.16,1,0.3,1), box-shadow 0.3s, border-color 0.3s; } .rs-card::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, var(--blue), var(--cyan)); transform: scaleX(0); transform-origin: left; transition: transform 0.4s cubic-bezier(0.16,1,0.3,1); } .rs-card:hover { transform: translateY(-4px); box-shadow: 0 16px 40px -16px rgba(10,38,244,0.2); border-color: transparent; } .rs-card:hover::before { transform: scaleX(1); } .rs-card-icon { width: 48px; height: 48px; background: var(--blue-mid); border-radius: 12px; display: flex; align-items: center; justify-content: center; margin-bottom: 16px; transition: transform 0.3s; } .rs-card:hover .rs-card-icon { transform: scale(1.05) rotate(-3deg); } .rs-card-icon svg { width: 24px; height: 24px; stroke: #fff; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; } .rs-card h3 { font-size: 16px; font-weight: 700; color: var(--black); margin-bottom: 10px; line-height: 1.3; } .rs-card p { font-size: 13px; color: var(--gray-600); line-height: 1.6; margin-bottom: 12px; } .rs-card ul { list-style: none; } .rs-card ul li { font-size: 12px; color: var(--gray-600); padding: 4px 0; padding-left: 14px; position: relative; line-height: 1.4; } .rs-card ul li::before { content: "›"; position: absolute; left: 0; color: var(--blue-mid); font-weight: 700; } /* ── 3-COL GRID ── */ .rs-3col { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; } .rs-card--dark { background: #ffffff; border-color: #e0e7ff; } .rs-card--dark:hover { border-color: #1961FE; box-shadow: 0 16px 40px -16px rgba(25,97,254,0.2); } .rs-card--dark h3 { color: #0a0a0a; } .rs-card--dark p { color: #475569; } .rs-card--dark ul li { color: #64748b; } .rs-card--dark .rs-card-icon { background: #0A26F4; } .rs-card--dark .rs-card-icon svg { stroke: #ffffff; } /* ── STEPS ── */ .rs-steps { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; position: relative; } .rs-steps::before { content: ""; position: absolute; top: 28px; left: 10%; right: 10%; height: 1px; background: linear-gradient(90deg, transparent, var(--gray-200) 20%, var(--gray-200) 80%, transparent); } .rs-step { padding: 0 16px 0; text-align: center; position: relative; } .rs-step-dot { width: 56px; height: 56px; border-radius: 50%; background: var(--blue-mid); color: #fff; font-size: 18px; font-weight: 800; display: flex; align-items: center; justify-content: center; margin: 0 auto 20px; position: relative; z-index: 1; border: 3px solid #fff; box-shadow: 0 0 0 1px var(--blue-mid); transition: transform 0.3s, background 0.3s; } .rs-step:hover .rs-step-dot { transform: scale(1.1); background: var(--blue); } .rs-step h4 { font-size: 16px; font-weight: 700; color: var(--black); margin-bottom: 8px; } .rs-step p { font-size: 13px; color: var(--gray-600); line-height: 1.55; } /* ── BEFORE/AFTER ── */ .rs-ba { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; } .rs-ba-col { border-radius: 14px; padding: 28px; } .rs-ba-col.before { background: #fef2f2; border: 1px solid #fecaca; } .rs-ba-col.after { background: #f0fdf4; border: 1px solid #bbf7d0; } .rs-ba-tag { display: inline-block; font-size: 10px; font-weight: 700; letter-spacing: 1.5px; text-transform: uppercase; padding: 4px 10px; border-radius: 4px; margin-bottom: 16px; } .before .rs-ba-tag { background: #dc2626; color: #fff; } .after .rs-ba-tag { background: #16a34a; color: #fff; } .rs-ba-list { list-style: none; } .rs-ba-list li { display: flex; align-items: flex-start; gap: 10px; font-size: 14px; padding: 10px 0; border-bottom: 1px solid rgba(0,0,0,0.05); line-height: 1.45; } .rs-ba-list li:last-child { border-bottom: none; } .before .rs-ba-list li { color: #7f1d1d; } .after .rs-ba-list li { color: #14532d; font-weight: 500; } .rs-ba-list li svg { flex-shrink: 0; margin-top: 2px; } /* ── WHO IT'S FOR ── */ .rs-audience { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; } .rs-audience-item { background: #fff; border: 1px solid var(--gray-200); border-radius: 12px; padding: 22px 20px; display: flex; align-items: flex-start; gap: 14px; transition: all 0.25s; } .rs-audience-item:hover { border-color: var(--blue-mid); box-shadow: 0 8px 24px -8px rgba(25,97,254,0.15); } .rs-audience-num { font-size: 28px; font-weight: 800; color: var(--gray-100); line-height: 1; flex-shrink: 0; letter-spacing: -0.02em; } .rs-audience-text h4 { font-size: 14px; font-weight: 700; color: var(--black); margin-bottom: 4px; } .rs-audience-text p { font-size: 12px; color: var(--gray-600); line-height: 1.5; } /* ── CTA BOX ── */ .rs-cta-box { border-radius: 20px; padding: 56px 48px; position: relative; overflow: hidden; } .rs-cta-box--blue { background: linear-gradient(135deg, #0211C4 0%, #000986 100%); } .rs-cta-box::before { content: ""; position: absolute; top: -100px; right: -100px; width: 500px; height: 500px; background: radial-gradient(circle, rgba(77,216,242,0.18) 0%, transparent 65%); pointer-events: none; animation: glowPulse 6s ease-in-out infinite; } @keyframes glowPulse { 0%,100% { opacity:.6; } 50% { opacity:1; } } .rs-cta-box-inner { position: relative; z-index: 1; max-width: 680px; } .rs-cta-box h2 { font-size: clamp(24px,3vw,36px); font-weight: 700; color: #fff; margin-bottom: 12px; letter-spacing: -0.02em; line-height: 1.2; } .rs-cta-box p { font-size: 16px; color: rgba(255,255,255,0.7); margin-bottom: 20px; line-height: 1.6; } .rs-cta-checks { list-style: none; margin-bottom: 28px; } .rs-cta-checks li { display: flex; align-items: flex-start; gap: 10px; font-size: 15px; color: #fff; padding: 6px 0; } .rs-cta-checks li svg { flex-shrink: 0; margin-top: 3px; width: 16px; height: 16px; } .rs-cta-italic { font-style: italic; color: rgba(255,255,255,0.5); font-size: 14px; margin-bottom: 28px; } /* ── FAQ ── */ .rs-faq { max-width: 760px; margin: 0 auto; } .rs-faq details { border: 1px solid var(--gray-200); border-radius: 10px; margin-bottom: 10px; transition: border-color 0.2s, box-shadow 0.2s; overflow: hidden; } .rs-faq details:hover { border-color: #c7d8ff; } .rs-faq details[open] { border-color: var(--blue-mid); box-shadow: 0 4px 20px -8px rgba(25,97,254,0.15); } .rs-faq summary { list-style: none; padding: 18px 22px; font-size: 16px; font-weight: 600; color: var(--black); cursor: pointer; display: flex; justify-content: space-between; align-items: center; gap: 16px; } .rs-faq summary::-webkit-details-marker { display: none; } .rs-faq-icon { width: 20px; height: 20px; flex-shrink: 0; color: var(--blue-mid); transition: transform 0.3s cubic-bezier(0.16,1,0.3,1); } .rs-faq details[open] .rs-faq-icon { transform: rotate(45deg); } .rs-faq-body { padding: 0 22px 18px; font-size: 14px; color: var(--gray-600); line-height: 1.7; } /* ── CALENDLY ── */ .rs-calendly-grid { display: grid; grid-template-columns: 1fr 1.2fr; gap: 56px; align-items: start; } .rs-calendly-left h2 { font-size: clamp(24px,3vw,36px); font-weight: 700; color: var(--black); margin-bottom: 12px; letter-spacing: -0.02em; } .rs-calendly-left h2 em { font-style: normal; color: var(--blue-mid); } .rs-calendly-left p { font-size: 15px; color: var(--gray-600); line-height: 1.65; margin-bottom: 20px; } .rs-calendly-trust { border: 1px solid var(--gray-200); border-radius: 12px; padding: 20px; background: #fff; } .rs-calendly-trust-head { display: flex; align-items: center; gap: 8px; font-size: 11px; font-weight: 700; letter-spacing: 1.5px; text-transform: uppercase; color: var(--blue-mid); margin-bottom: 14px; } .rs-live-dot { width: 6px; height: 6px; background: #22c55e; border-radius: 50%; animation: livePulse 2s ease-in-out infinite; box-shadow: 0 0 0 0 rgba(34,197,94,0.4); } @keyframes livePulse { 0%,100% { box-shadow:0 0 0 0 rgba(34,197,94,0.4); } 50% { box-shadow:0 0 0 6px rgba(34,197,94,0); } } .rs-calendly-trust ul { list-style: none; } .rs-calendly-trust li { display: flex; align-items: flex-start; gap: 10px; font-size: 13px; color: var(--gray-800); padding: 7px 0; border-bottom: 1px solid var(--gray-100); } .rs-calendly-trust li:last-child { border-bottom: none; } .rs-calendly-trust li svg { flex-shrink: 0; margin-top: 2px; width: 14px; height: 14px; color: var(--blue-mid); } .rs-calendly-widget { background: #fff; border: 1px solid var(--gray-200); border-radius: 16px; overflow: hidden; box-shadow: 0 20px 60px -20px rgba(0,0,0,0.1); position: relative; } .rs-calendly-widget::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, var(--blue), var(--cyan)); z-index: 1; } .rs-cal-fallback { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 48px 32px; text-align: center; } .rs-cal-fallback svg { color: var(--blue-mid); margin-bottom: 14px; } .rs-cal-fallback h4 { font-size: 17px; font-weight: 700; color: var(--black); margin-bottom: 6px; } .rs-cal-fallback p { font-size: 13px; color: var(--gray-600); margin-bottom: 20px; line-height: 1.5; } .rs-footer-note { text-align: center; padding: 32px 40px 40px; font-size: 14px; color: var(--gray-400); line-height: 1.6; } .rs-footer-note strong { color: var(--blue-mid); font-weight: 600; } /* ── ANIMATIONS ── */ .reveal { opacity: 0; transform: translateY(20px); transition: opacity 0.7s cubic-bezier(0.16,1,0.3,1), transform 0.7s cubic-bezier(0.16,1,0.3,1); } .reveal.visible { opacity: 1; transform: none; } .stagger > * { opacity: 0; transform: translateY(16px); transition: opacity 0.6s cubic-bezier(0.16,1,0.3,1), transform 0.6s cubic-bezier(0.16,1,0.3,1); } .stagger.visible > *:nth-child(1) { opacity:1;transform:none;transition-delay:.05s; } .stagger.visible > *:nth-child(2) { opacity:1;transform:none;transition-delay:.12s; } .stagger.visible > *:nth-child(3) { opacity:1;transform:none;transition-delay:.19s; } .stagger.visible > *:nth-child(4) { opacity:1;transform:none;transition-delay:.26s; } .stagger.visible > *:nth-child(5) { opacity:1;transform:none;transition-delay:.33s; } .stagger.visible > *:nth-child(6) { opacity:1;transform:none;transition-delay:.40s; } @keyframes heroIn { from{opacity:0;transform:translateY(24px);}to{opacity:1;transform:none;} } .rs-hero-left > * { animation: heroIn 0.8s cubic-bezier(0.16,1,0.3,1) backwards; } .rs-hero-left > *:nth-child(1){animation-delay:.1s;} .rs-hero-left > *:nth-child(2){animation-delay:.2s;} .rs-hero-left > *:nth-child(3){animation-delay:.3s;} .rs-hero-left > *:nth-child(4){animation-delay:.38s;} .rs-hero-left > *:nth-child(5){animation-delay:.46s;} .rs-hero-left > *:nth-child(6){animation-delay:.54s;} @keyframes illusIn { from{opacity:0;transform:translateY(40px) scale(.96);}to{opacity:1;transform:none;} } .rs-hero-visual { animation: illusIn 1s cubic-bezier(0.16,1,0.3,1) .35s backwards; } @media (prefers-reduced-motion:reduce) { .reveal,.stagger>*,.rs-hero-left>*,.rs-hero-visual{animation:none!important;transition:none!important;opacity:1!important;transform:none!important;} } /* ── RESPONSIVE ── */ @media(max-width:1024px) { :root{--pad:0 24px;} .rs-hero-inner,.rs-2col,.rs-ba,.rs-calendly-grid{grid-template-columns:1fr;gap:40px;} .rs-2col--flip>*:first-child,.rs-2col--flip>*:last-child{order:unset;} .rs-4col{grid-template-columns:repeat(2,1fr);} .rs-3col{grid-template-columns:repeat(2,1fr);} .rs-audience{grid-template-columns:repeat(2,1fr);} .rs-stats{grid-template-columns:repeat(2,1fr);} .rs-steps{grid-template-columns:repeat(2,1fr);} .rs-steps::before{display:none;} .rs-hero{min-height:auto;padding:100px 24px 60px;} .rs-section{padding:48px 24px;} .rs-trust{padding:16px 24px;} .rs-cta-box{padding:40px 28px;} } @media(max-width:640px) { .rs-4col,.rs-3col,.rs-audience,.rs-stats,.rs-steps,.rs-ba{grid-template-columns:1fr;} .rs-hero h1{font-size:32px;} .rs-hero-btns{flex-direction:column;} .rs-header-nav{display:none;} .rs-section{padding:40px 20px;} .rs-trust-divider{display:none;} } /* Exact selectors from live homepage DOM inspection (post-355 header template) */ /* Logo lives inside .elementor-element-0763809 */ .elementor-element-0763809 img { filter: brightness(0) invert(1) !important; } /* Nav lives inside .elementor-element-37717a6 */ .elementor-element-37717a6 .elementor-item, .elementor-element-37717a6 a.elementor-item { color: rgba(255,255,255,0.92) !important; } .elementor-element-37717a6 .elementor-item:hover { color: #ffffff !important; } /* Submenu caret icon (Case study / Resources dropdown arrows) to white */ .elementor-element-37717a6 svg { fill: rgba(255,255,255,0.92) !important; } /* === NUCLEAR FULL-WIDTH OVERRIDE === */ /* Scoped to
only - main is a SIBLING of
in the DOM, so this can never touch the header */ html, body { overflow-x: hidden !important; width: 100% !important; max-width: 100% !important; } #page, #content, .site-main, .page-content, main, main.site-main, main [data-elementor-type="wp-page"], main .elementor-section-wrap, main .elementor-top-section, main article { max-width: 100% !important; width: 100% !important; padding-left: 0 !important; padding-right: 0 !important; margin-left: 0 !important; margin-right: 0 !important; box-sizing: border-box !important; } /* Content containers - scoped inside main only, header is untouched by definition */ main .e-con, main .e-con-full, main .e-parent { max-width: 100% !important; } .rs-bleed { width: 100vw !important; position: relative !important; left: 50% !important; right: 50% !important; margin-left: -50vw !important; margin-right: -50vw !important; } /* ════════════════════════════════════════ HEADER - matches riverstonemarketingsolutions.com exactly Spec: 950px container, 68px tall, 40px from top, border 1px solid rgba(255,255,255,0.75), bg rgba(0,0,0,0.14), border-radius 20px, NOT full width ════════════════════════════════════════ */ @import url('https://fonts.googleapis.com/css2?family=Mona+Sans:wght@400;500;600&display=swap'); .rs-nav-wrapper { position: fixed; top: 0; left: 0; right: 0; z-index: 99999; display: flex; justify-content: center; padding-top: 20px; pointer-events: none; /* Force GPU layer - prevents being trapped by parent transforms */ transform: translateZ(0); -webkit-transform: translateZ(0); will-change: transform; /* Escape any Elementor container stacking context */ isolation: isolate; } .rs-nav-container { pointer-events: all; width: 950px; max-width: calc(100vw - 40px); height: 68px; display: flex; align-items: center; background: rgba(0,0,0,0.14); border: 1px solid rgba(255,255,255,0.75); border-radius: 20px; padding-left: 10px; padding-right: 10px; gap: 0; } .rs-nav-logo { width: 188px; flex-shrink: 0; display: flex; align-items: center; padding-left: 8px; } .rs-nav-logo img { width: 168px; height: 28px; object-fit: contain; object-position: left center; /* Logo at this URL is already white */ } .rs-nav-links { flex: 1; display: flex; align-items: center; justify-content: center; height: 46px; list-style: none; margin: 0; padding: 0; gap: 0; position: relative; } .rs-nav-links > li { position: relative; } .rs-nav-links > li > a, .rs-nav-links > li > span { display: flex; align-items: center; gap: 5px; padding: 13px 20px; font-family: 'Mona Sans', sans-serif; font-size: 16px; font-weight: 600; line-height: 20px; color: #e9e9e9; text-decoration: none; white-space: nowrap; cursor: pointer; transition: color 0.15s; } .rs-nav-links > li > a:hover, .rs-nav-links > li > span:hover { color: #ffffff; } /* Chevron */ .rs-nav-chevron { width: 12px; height: 12px; flex-shrink: 0; transition: transform 0.2s; opacity: 0.8; } .rs-nav-links > li:hover .rs-nav-chevron { transform: rotate(180deg); } /* Dropdown */ .rs-nav-dropdown { display: none; position: absolute; top: calc(100% + 8px); left: 0; background: #ffffff; border-radius: 10px; box-shadow: 0 8px 32px rgba(0,0,0,0.15); min-width: 240px; padding: 6px 0; z-index: 100; list-style: none; margin: 0; } .rs-nav-links > li:hover .rs-nav-dropdown { display: block; } .rs-nav-dropdown li a { display: block; padding: 13px 20px; font-family: 'Mona Sans', sans-serif; font-size: 13px; font-weight: 500; line-height: 20px; color: #33373d; text-decoration: none; transition: background 0.15s; } .rs-nav-dropdown li a:hover { background: #f5f7fa; color: #0a0a0a; } /* CTA button */ .rs-nav-cta { flex-shrink: 0; display: inline-flex; align-items: center; gap: 8px; width: 176px; height: 48px; justify-content: center; background: #ffffff; color: #1961fe; font-family: 'Mona Sans', sans-serif; font-size: 16px; font-weight: 600; line-height: 24px; padding: 10px 20px; border: 2px solid #ffffff; border-radius: 8px; text-decoration: none; white-space: nowrap; transition: background 0.2s, color 0.2s; } .rs-nav-cta:hover { background: #e8efff; } .rs-nav-cta svg { width: 14px; height: 14px; flex-shrink: 0; } /* Hero must start at very top behind the header - header is 20px offset + 68px tall = 88px, give content 140px breathing room */ .rs-hero { padding-top: 140px !important; margin-top: 0 !important; } /* Hide Elementor site header - we use our own that matches the spec precisely */ .elementor-355, header[data-elementor-id="355"], .elementor-location-header { display: none !important; }

Google Shopping Ads Management

Shopping Ads built for profitable ecommerce growth.

We help ecommerce brands scale Google Shopping profitably - by fixing feed quality, campaign structure, tracking, and budget efficiency.

Because spending more only works when the economics work first.

Free 30-minute review. No obligation. No pitch slides.

Account health view

Feed quality score 94 / 100 Optimised
Blended ROAS 4.8× Scaling
Wasted spend -31% Contained
PMax signal quality Low Flagged
Margin protection Active Stable
1 issue needs attention Auto-flagged ✓
River Stone note PMax signal is too thin. We'd pause and rebuild before scaling.
11 years managing Google Ads
Search, Shopping, PMax specialists
Free audit, no commitment required
Ecommerce, D2C, and agency white-label

The real problem

Shopping Ads scale fast. So do the mistakes.

Google Shopping can grow revenue quickly. That's exactly why poorly structured accounts become expensive so fast - not because Shopping Ads are broken, but because they're managed in ways that prioritise platform recommendations over business economics.

We regularly see ecommerce brands dealing with:

  • Product feeds that aren't optimised for buyer intent
  • Best-selling products subsidising weak performers
  • Performance Max running without enough signal or control
  • Budgets scaled before profitability is stable
  • Poor visibility into what's actually driving revenue
  • Conversion tracking that inflates reported results

Revenue may grow. Margins quietly shrink.

Common account leaks we find on audit

Feed titles missing commercial intent keywords -$1,840 wasted
PMax has no negative keyword controls 23% off-target
Top SKUs subsidising underperforming catalogue Margin -18%
Budget scaled before profit was stable ROAS -32%
Conversion tracking double-counting purchases Data unreliable

Why structure matters

The difference between mis-spent and well-spent

4.3×

Average ROAS after rebuild

vs ~1× inherited from previous setup

-67%

Wasted spend reduction

In first 60 days of account restructure

45

Days to stable performance

Before we recommend scaling spend

$0.80

Brand CPC after bidding fix

Down from $4-5 on Maximize Conversions

Our approach

Four disciplines that protect profit while you scale

Feed Quality First

Your product feed tells Google what you sell, who it's for, and when to show it. Weak titles and poor categorisation reduce relevance and waste spend.

  • Titles aligned with buyer search intent
  • Attribute coverage and categorisation
  • Commercially aligned product data

Structure Protects Profitability

Not all products deserve equal budget. We segment campaigns by margin, performance, and commercial intent to stop your winners subsidising your losers.

  • Product performance segmentation
  • Margin-based budget allocation
  • Intent-aligned campaign architecture

Tracking Reflects Reality

Automation is only as smart as the data feeding it. Broken or inflated tracking destroys Smart Bidding efficiency and makes every decision unreliable.

  • Accurate revenue attribution
  • Clean ecommerce tracking setup
  • No double-counting, no ghost conversions

Efficiency Before Scale

We don't increase spend because revenue went up. Growth only makes sense when margins are stable and scaling decisions are backed by repeatable data.

  • ROAS and margin stability first
  • Controlled budget expansion
  • No guesswork, no gambling

Our process

How we manage Shopping Ads

01

Audit

Feed quality, campaign structure, tracking accuracy, product segmentation, and wasted spend - all reviewed before we touch anything.

02

Restructure

We rebuild campaigns around product performance, margin control, and cleaner intent alignment. No copy-paste from the previous setup.

03

Stabilise

We improve efficiency and protect margins before touching scale. Patience here is the strategy, not the obstacle.

04

Scale

Budgets increase only when performance is repeatable, margins are healthy, and the data supports it. Not before.

Who this is for

Built for brands where margins matter as much as revenue.

If revenue is growing but profitability feels unclear, Shopping structure is usually the problem.

01

Ecommerce and D2C brands

Scaling paid acquisition and need Shopping to pull its weight profitably, not just generate volume.

02

Stores with rising CAC

Revenue growing but margins eroding. Usually a structure problem, not a market problem.

03

Brands inheriting old accounts

Previous agency left behind a messy account. You need a forensic audit and a clean rebuild.

04

Teams frustrated by PMax

Running Performance Max but can't see what's working. Automation without clean inputs is expensive guessing.

05

Agencies needing fulfillment

We work white-label alongside agencies as a Shopping Ads fulfillment partner. Trusted, confidential, professional.

06

Businesses ready to scale right

You have budget and ambition. You want an agency whose interests align with yours, not with spend volume.

What changes

Before River Stone vs. after the rebuild

Before
  • Best-selling products subsidise weak inventory
  • Performance Max lacks visibility and control
  • Feed quality issues reducing relevance
  • ROAS fluctuates unpredictably week to week
  • Scaling feels risky with no clear data foundation
After
  • Product segmentation aligned with profitability
  • Cleaner feed structure and product relevance
  • Better visibility into where spend is allocated
  • Stable ROAS and predictable revenue trends
  • Scaling decisions backed by data, not guesses

What good feels like

When Shopping Ads are structured properly, they feel predictable.

Spend allocation is clear

You know exactly where your budget is going, which products are earning it, and which are costing you.

Performance is explainable

You can tell your team, your board, or your investors exactly why the numbers moved and what drives them.

Scaling is intentional

Budget decisions are made on data, not gut feel. When you scale, you scale with confidence - not crossed fingers.

Free Shopping Ads audit

Find out where your Shopping spend is leaking - and what would fix it.

We'll review your Shopping campaigns and show you exactly what's wrong, what's working, and where the biggest opportunities are.

  • Where your feed is leaking visibility
  • Which campaigns are draining budget without return
  • What's preventing stable, profitable scale
  • A 90-day direction for improvement

No pressure. No obligation. Just clarity.

Get My Free Shopping Ads Audit

Common questions

What ecommerce founders ask before working with us

Do you manage Performance Max campaigns?

Yes - but only when feed quality, tracking, and campaign structure support it properly. Automation without clean inputs creates unreliable and expensive outcomes. We use PMax where it earns its keep, not as a default.

Can you help improve our product feed?

Yes. Feed quality plays a major role in Shopping performance. We review titles, categorisation, attributes, and overall feed structure as part of every audit. A clean feed is non-negotiable before scaling.

Do Shopping Ads work for smaller ecommerce stores?

They can, provided the economics support paid acquisition. Product margins, pricing competitiveness, and conversion rates all influence viability. We'll tell you honestly during the audit if Shopping isn't the right channel for your stage.

What matters more: ROAS or revenue?

Neither in isolation. Sustainable growth comes from balancing revenue growth with healthy margins and efficient customer acquisition. We track contribution margin and actual profitability, not just dashboard ROAS.

How long until we see results?

Wasted spend is usually cut within 30 days. Structural improvements compound from there. ROAS and margin trends typically stabilise within 45-60 days, depending on data volume and account complexity. We never rush this timeline.

Do you work with agencies on a white-label basis?

Yes. We operate as a fulfillment partner for a number of agencies, managing Shopping Ads campaigns under their brand. Confidential, professional, and structured to integrate with your existing client reporting.

Let's collaborate

30 minutes. Your numbers. Real answers.

Book a no-pressure strategy call. We'll look at your Shopping account, not pitch slides. You'll leave with a clear view of what's working, what's leaking, and what to fix first.

What you'll get on the call
  • A quick screen-share review of your Shopping account
  • Two or three specific opportunities we'd act on first
  • An honest answer on whether working together makes sense
  • Zero pressure, zero sales pitch, zero obligation

30 Minute Strategy Call

Loading calendar. If it does not appear, use the button below.

Open Booking Calendar
// Force header to stay fixed at top of viewport // This JS approach bypasses any Elementor parent transform that breaks CSS position:fixed (function() { var nav = document.querySelector('.rs-nav-wrapper'); if (!nav) return; function pinHeader() { var scrollY = window.scrollY || window.pageYOffset; var rect = nav.getBoundingClientRect(); // If the header is scrolling away (top > 20px from viewport), force it back if (rect.top > 20 || rect.top < 0) { nav.style.position = 'fixed'; nav.style.top = '0'; nav.style.left = '0'; nav.style.right = '0'; } } // Run on scroll window.addEventListener('scroll', pinHeader, { passive: true }); // Run on load pinHeader(); })(); // Scroll reveal var io = new IntersectionObserver(function(entries) { entries.forEach(function(e) { if (e.isIntersecting) { e.target.classList.add('visible'); io.unobserve(e.target); } }); }, { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }); document.querySelectorAll('.reveal, .stagger').forEach(function(el) { io.observe(el); });