avatar avatar avatar avatar
5K+ Users trust Crezlo

Boost Workforce Productivity with Smart Shift Planning

Assign shifts, track attendance, and manage changes in real-time. Keep your team aligned and reduce scheduling conflicts.

Overview of Features

Explore the main functionalities and benefits that help you get the most out of our platform.

Smart Shift Scheduling

Easily create, edit, and assign shifts for employees with drag-and-drop functionality and automatic conflict detection.

Employee Availability

Track when employees are available, set recurring availability, and automatically avoid scheduling conflicts.

Shift Reminders & Notifications

Send automated reminders to employees about upcoming shifts, changes, or shift swaps via email or SMS.

Shift Swaps & Coverage

Allow employees to request shift swaps and automatically find coverage for open shifts to ensure smooth operations.

Time Clock & Attendance

Track clock-ins, clock-outs, and breaks directly in the app with real-time attendance reporting.

Overtime & Shift Rules

Automatically calculate overtime, apply shift rules, and flag violations to ensure compliance and fair scheduling.

Recurring Shift Templates

Set up weekly or monthly recurring shifts to save time and maintain consistent scheduling across teams.

Team Calendar View

Visualize shifts in daily, weekly, or monthly calendar views for better planning and coordination.

Multi-Location Scheduling

Manage shifts across multiple locations or departments with ease, ensuring proper staffing everywhere.

Shift Reports & Analytics

Generate reports on attendance, hours worked, and shift coverage to improve workforce planning and productivity.

Employee Notifications & Alerts

Notify employees instantly about shift changes, approvals, or cancellations directly through the app.

Real Stories. Measurable Success.

Did I Do That??? I had SUCH a pleasant experience here. I never write review...but I could not NOT tell about this product. It does exactly what I needed it to do for my real estate tours. I didn't want to mess around and try to figure things out on my own...so I booked a 30 minute info session. I was SO impressed. I tried Crezlo Tours with my pano pics on my iPhone 15...whoa! It was perfect!

Dr.WandaJeanJones

Founder

The platform setup is straightforward—I was able to get it up and running in under 10 minutes. The ability to use a custom domain in each workspace is also a valuable feature. I’m particularly encouraged to see that email SMTP support for agencies is currently in development. The support and walkthrough was pretty helpful.

AD79315

Founder

Crezlo Tours is a tool I can say you have not seen on Appsumo before. Sure there have been tools that do 360 tours that has come to Appsumo, but they never gave you the opportunity to make Dairy Cow Money. They gave you the ability to make Beef Cow Money.

DigitalGrowthHacksClub

Founder

Really impressed with Crezlo Tours! The UI feels clean and intuitive, and the results look super professional. The Dollhouse feature is an absolute game-changer, such a smart addition for 360° virtual tours. Love how easy it is to customize and brand. Great job team

Abhijit Saha

Design Lead

Crezlo Flipbooks elevated our presentations. Clients love the smooth page flips and embedded media. Makes our content much more memorable.

Andy Kaplan

Founder

Featured Products

Explore our range of solutions created to elevate your digital experience.

See All

Power your business. The Crezlo way

Tailored solutions, dedicated support and integrations that fit your workflow.

// Active Menu Indicator - Like blog.crezlo.com (function() { const navLinks = document.querySelectorAll('.nav-link'); const activeIndicator = document.getElementById('active-indicator'); const nav = document.querySelector('#product-navbar nav'); const productNavbar = document.getElementById('product-navbar'); if (!navLinks.length || !activeIndicator || !nav || !productNavbar) return; // Get current path const currentPath = window.location.pathname; // Find active link let activeLink = null; navLinks.forEach(link => { const linkHref = link.getAttribute('href'); // Check if current path matches this link if (currentPath === linkHref || currentPath.startsWith(linkHref + '/')) { activeLink = link; link.classList.add('text-gray-900', 'font-medium'); } else { link.classList.remove('text-gray-900', 'font-medium'); } }); // Position indicator under active link, touching the border const updateIndicator = () => { if (activeLink) { const navbarRect = productNavbar.getBoundingClientRect(); const linkRect = activeLink.getBoundingClientRect(); // Calculate position relative to product-navbar (to touch the border) activeIndicator.style.left = (linkRect.left - navbarRect.left) + 'px'; activeIndicator.style.width = linkRect.width + 'px'; // Position at the very bottom (0px) to touch the border activeIndicator.style.bottom = '0px'; activeIndicator.style.display = 'block'; } else { activeIndicator.style.display = 'none'; } }; // Update on load and resize if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', updateIndicator); } else { setTimeout(updateIndicator, 50); } window.addEventListener('resize', updateIndicator); // Update when links are clicked (for smooth transition) navLinks.forEach(link => { link.addEventListener('click', () => { setTimeout(updateIndicator, 100); }); }); })(); // Position mega menu dropdown right below core navbar and fix hover gap (function() { const coreNavbar = document.getElementById('core-navbar'); const megaMenuDropdown = document.querySelector('.mega-menu-dropdown'); const megaMenuContainer = document.querySelector('.mega-menu-container'); const header = document.querySelector('header'); if (!coreNavbar || !megaMenuDropdown || !megaMenuContainer || !header) return; const updateMegaMenuPosition = () => { if (window.innerWidth >= 768) { // Check if core navbar is visible const isCoreNavbarHidden = coreNavbar.classList.contains('navbar-hidden'); if (isCoreNavbarHidden) { // If core navbar is hidden, position below product navbar const productNavbar = document.getElementById('product-navbar'); if (productNavbar) { const productNavbarRect = productNavbar.getBoundingClientRect(); megaMenuDropdown.style.top = productNavbarRect.bottom + 'px'; } else { megaMenuDropdown.style.top = '70px'; } } else { // If core navbar is visible, position below it const coreNavbarRect = coreNavbar.getBoundingClientRect(); const coreNavbarBottom = coreNavbarRect.bottom; megaMenuDropdown.style.top = coreNavbarBottom + 'px'; } } else { megaMenuDropdown.style.top = '0px'; } }; // Add delay before closing to allow mouse movement let closeTimeout; const showMenu = () => { clearTimeout(closeTimeout); updateMegaMenuPosition(); // Update position before showing megaMenuDropdown.style.opacity = '1'; megaMenuDropdown.style.visibility = 'visible'; megaMenuDropdown.style.pointerEvents = 'auto'; megaMenuDropdown.style.transform = 'translateX(-50%) translateY(0)'; }; const hideMenu = () => { closeTimeout = setTimeout(() => { megaMenuDropdown.style.opacity = '0'; megaMenuDropdown.style.visibility = 'hidden'; megaMenuDropdown.style.pointerEvents = 'none'; megaMenuDropdown.style.transform = 'translateX(-50%) translateY(-10px)'; }, 200); }; megaMenuContainer.addEventListener('mouseenter', showMenu); megaMenuContainer.addEventListener('mouseleave', (e) => { const relatedTarget = e.relatedTarget; if (!relatedTarget || (!megaMenuDropdown.contains(relatedTarget) && relatedTarget !== megaMenuDropdown)) { hideMenu(); } }); megaMenuDropdown.addEventListener('mouseenter', showMenu); megaMenuDropdown.addEventListener('mouseleave', hideMenu); // Update on load and resize if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', updateMegaMenuPosition); } else { updateMegaMenuPosition(); } window.addEventListener('resize', updateMegaMenuPosition); // Update when core navbar visibility changes const observer = new MutationObserver(() => { updateMegaMenuPosition(); // If menu is currently visible, update its position if (megaMenuDropdown.style.visibility === 'visible') { updateMegaMenuPosition(); } }); observer.observe(coreNavbar, { attributes: true, attributeFilter: ['class'] }); // Also update on scroll to catch navbar show/hide let scrollTimeout; window.addEventListener('scroll', () => { clearTimeout(scrollTimeout); scrollTimeout = setTimeout(() => { if (megaMenuDropdown.style.visibility === 'visible') { updateMegaMenuPosition(); } }, 100); }, { passive: true }); })();