Frontdesk by InHouse | Upsells that feel like upgrades
Skip to content
document.addEventListener("DOMContentLoaded", (event) => { gsap.registerPlugin(ScrollTrigger);
let blurTexts = document.querySelectorAll("[data-blurin]") blurTexts.forEach((blurText) =>{ gsap.from(blurText,{ filter:"blur(32px)", opacity:0, //scale:0.5, yPercent:10, scrollTrigger:{ trigger:blurText, start:"top bottom" } }) })
let ctaIn = gsap.timeline({paused:true, scrollTrigger:{ trigger:"[data-nav]", start:"bottom top", toggleActions: "play none none reverse", }})
ctaIn.from("[data-cta]",{ opacity:0, y:40, })
let blackouts = document.querySelectorAll("[data-blackout]") blackouts.forEach((blackout) =>{ gsap.to(blackout,{ filter:"blur(32px)", opacity:0, //scale:0.5, //yPercent:10, scrollTrigger:{ trigger:blackout, start:"top top", end:"bottom top", scrub:0.5, } }) })
let appears = document.querySelectorAll("[data-appearup]") appears.forEach((appear) =>{ gsap.from(appear,{ //filter:"blur(32px)", opacity:0, //scale:0.5, y:"16em", scrollTrigger:{ trigger:appear, start:"top bottom", end:"top 80%", scrub:1.5, } }) })
gsap.to("[data-hider]",{ y:200, scale:0.7, scrollTrigger:{ trigger:"[data-hide]", start:"top bottom", //end:"top 70%", scrub: 1 } }) gsap.to("[data-hero]",{ scale:0.9, scrollTrigger:{ trigger:"[data-herotrigger]", start:"top 10%", end:"bottom 10%", scrub: 1 } })
let scrollers = document.querySelectorAll("[data-scroller]"); scrollers.forEach((scroller) => { let backgroundImage = scroller.querySelector("[data-background]"); let foregroundImage = scroller.querySelector("[data-foreground]");
let imageFan = gsap.timeline({ scrollTrigger: { trigger: scroller, scrub: 1, start: "top bottom", end: "bottom center", //markers: true, }, });
imageFan.to(backgroundImage, { x: -50, y: 30, scale:1.05, //rotate: 10, duration: 1, }); imageFan.to( foregroundImage, { x: 50, y: 30, scale:1.05, //rotate: 10, duration: 1, }, "-=1" ); }); });
document.addEventListener("DOMContentLoaded", (event) => { gsap.registerPlugin(ScrollTrigger);
const buttons = document.querySelectorAll('[data-magnetic]');
buttons.forEach((button)=>{
let boundingRect = button.getBoundingClientRect();
window.addEventListener('resize', () => { boundingRect = button.getBoundingClientRect(); }); window.addEventListener('scroll', () => { boundingRect = button.getBoundingClientRect(); });
button.addEventListener('mousemove', (e) => {
const mousePosX = e.x - boundingRect.left; const mousePosY = e.y - boundingRect.top;
gsap.to(button, { x: (mousePosX - boundingRect.width / 2) * 0.2, y: (mousePosY - boundingRect.height / 2) * 0.2, scale:1.05, //backgroundColor:"rgba(151, 71, 255, 0.20)", //border:"1px solid rgba(151, 71, 255, 0)", duration: 0.8, ease: 'power3.out', }); });
button.addEventListener('mouseleave', () => {
gsap.to(button, { x: 0, y: 0, scale:1, duration: 0.8, //backgroundColor:"rgba(151, 71, 255, 0)", //border:"1px solid #9747FF", //ease: 'elastic.out(1,0.3)', ease:"elastic.out(1,0.75)", }); }); }); let guideButtons = document.querySelectorAll("[data-guidebutton]") guideButtons.forEach((guideButton)=>{ let buttonText = guideButton.querySelectorAll("p") let buttonHover = gsap.timeline({paused:true, defaults:{duration:0.4, ease:"power1.inOut"}}) buttonHover.to(guideButton,{ backgroundColor:"#294444" })
buttonHover.to(buttonText,{ color:"#ffffff" },"<") guideButton.addEventListener("mouseenter",()=>{ buttonHover.play() })
guideButton.addEventListener("mouseleave",()=>{ buttonHover.reverse() })
})
});
document.addEventListener("DOMContentLoaded", (event) => { gsap.registerPlugin(ScrollTrigger);
let upsellPop = gsap.timeline({defaults:{duration:2, ease:"power1.out"},scrollTrigger:{trigger:"[data-herocontainer]",start:"top 80%"}}) upsellPop.to("[data-noshow]",{ stagger:0.1, scale:1, opacity:1, }) upsellPop.from("[data-noshow]",{ stagger:0.1, ease: "elastic.out(1,0.5)", y:100, },"<") upsellPop.from("[data-noshow]",{ stagger:0.1, duration:1, filter:"blur(32px)", },"<") upsellPop.from("[data-herobottom]",{ opacity:0 },"<") });
document.addEventListener("DOMContentLoaded", (event) => { gsap.registerPlugin(ScrollTrigger);
let notificationLoop = gsap.timeline({repeat:-1, defaults:{duration:1.5, ease:"power2.inOut"}}) notificationLoop.set(["[data-notificationone]","[data-notificationtwo]","[data-notificationthree]"],{ opacity:0, y:40 }) notificationLoop.to("[data-notificationone]",{ opacity:1, y:0, }) notificationLoop.to("[data-notificationtwo]",{ opacity:1, y:0, },"+=0.5") notificationLoop.to("[data-notificationone]",{ opacity:0, y:-40, scale:0.5, filter:"blur(32px)" },"<") notificationLoop.to("[data-notificationthree]",{ opacity:1, y:0, },"+=0.5") notificationLoop.to("[data-notificationtwo]",{ opacity:0, y:-40, scale:0.5, filter:"blur(32px)" },"<") notificationLoop.to("[data-notificationthree]",{ opacity:0, y:-40, scale:0.5, filter:"blur(32px)" },"+=0.5") });
document.addEventListener("DOMContentLoaded", (event) => { gsap.registerPlugin(ScrollTrigger);
let heroPop = gsap.timeline({defaults:{duration:1.5, ease:"power3.out"}})
heroPop.to("[data-ctablock]",{ duration:0.1, opacity:1, }) heroPop.from("[data-herotext]",{ yPercent:103, duration:1, },"<") heroPop.from("[data-herobutton]",{ yPercent:103, duration:1, },"<") heroPop.to("[data-imagetwo]",{ x:"15em", scale:0.8, rotate:"5deg" },"-=0.5") heroPop.to("[data-imagethree]",{ x:"-15em", scale:0.8, rotate:"-5deg" },"<") heroPop.to("[data-imagefour]",{ x:"30em", scale:0.6, rotate:"10deg" },"<") heroPop.to("[data-imagefive]",{ x:"-30em", scale:0.6, rotate:"-10deg" },"<") heroPop.from("[data-imageblock]",{ y:"20em", },"<") heroPop.to("[data-imageblock]",{ opacity:1, },"<") });
document.addEventListener("DOMContentLoaded", (event) => { gsap.registerPlugin(ScrollTrigger); gsap.set("[data-mobilenav]",{ autoAlpha:0, })
gsap.set("[data-navoff]",{ autoAlpha:0, })
let navExpand = gsap.timeline({paused:true}) navExpand.to("[data-mobilenav]",{ autoAlpha:1, }) navExpand.to("[data-navoff]",{ autoAlpha:1 },"<") navExpand.to("[data-navon]",{ autoAlpha:0, },"<") let menuOn = document.querySelector("[data-navon]") let menuOff = document.querySelector("[data-navoff]") menuOn.addEventListener("click",()=>{ navExpand.play() }) menuOff.addEventListener("click",()=>{ navExpand.reverse() }) });
Sign In
Start Free Trial
Guest upsells made effortless.
Frontdesk on-stay commerce software is designed to capture 50% more revenue from guests staying at boutique hotels and vacation rentals.
Start Free Trial
No credit card required
play-button
Book a Demo
Frontdesk on-stay commerce software is designed to capture 50% more revenue from guests staying at boutique hotels and vacation rentals.
Book a Demo
Start Free Trial
No credit card required
Frontdesk properties
10,000+
Est. incremental revenue / year
$6,500
Guest satisfaction score
98%
Connect with Airbnb
Import your properties instantly, keep in sync and deliver personalized guest experiences.
Connect with Airbnb
Everything you need to sell on-stay
Your full-stack e-commerce solution for selling and marketing to guests.
Unlock new revenue with
your custom storefront.
Guests allocate up to 65% of budget to on-stay experiences and retail. Capture that spend with integrated e-commerce and bookable experiences.
Engage guests on-stay with
your must access guidebook.
Deliver a seamless guest experience with all essential property info and local picks in one convenient spot.
Operate like a pro with powerful integrations and guest managment flows
Deliver a seamless guest experience with all essential property info and local picks in one convenient spot. You can even integrate recommended upsells like bike rentals and wine tastings to boost your earnings while guests build their travel itinerary.
Track earnings and manage growth with your property dashboard.
Frontdesk analytics provide insight on guest spend, preferences and behavior, enabling your to make dynamic pricing and service adjustments that optimize revenue and guest satisfaction.
Set up Automagically
Get your Frontdesk guest-ready in minutes with AI-assisted onboarding.
Earn up to 40% more
Sign Up Now
Upsells that feel like upgrades
Perfectly curated upsells aren’t an imposition, they’re a luxury.
Frontdesk University
Tips and best practices from hospitality experts in our community
We’re built to support
your operating model.
I own a short term rental
Self-serve tools for independent owners with 1-4 properties to smooth operations and increase revenue.
I manage a property portfolio
Solutions to attract clients and drive incremental revenue for managers with up to 1,000+ properties.
I operate a boutique hotel
Bespoke branded on-stay commerce solutions that drive revenue with no integrations required.
Trusted by investors from
Need design and furnishing
for your vacation rental?
You’re (almost) in the right place.
Go to InHouse
- Choosing a selection results in a full page refresh.
- Opens in a new window.