{"id":3239,"date":"2026-05-02T15:08:49","date_gmt":"2026-05-02T08:08:49","guid":{"rendered":"https:\/\/satusatu.com\/inspiration\/?p=3239"},"modified":"2026-05-02T15:08:51","modified_gmt":"2026-05-02T08:08:51","slug":"canggu-to-ubud","status":"publish","type":"post","link":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/","title":{"rendered":"Canggu to Ubud: Everything You Need to Know Before You Go"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Canggu and Ubud sit at opposite ends of Bali&#8217;s personality spectrum. Canggu is beach clubs, surf breaks, and brunches that arrive with matcha art on top. Ubud is rice terraces, temple ceremonies, and afternoons watching clouds settle over the Campuhan Ridge.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The distance between them is roughly 28 to 35 kilometers by road, which sounds modest until Bali traffic reminds you that kilometers work differently here. If you&#8217;re planning the Canggu to Ubud journey and want it to go smoothly, this guide covers everything you need to know.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SatuSatu, a Bali travel platform designed for exactly these kinds of cross-island moves, handles this route regularly<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">    <!-- Styles -->\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Overpass:ital,wght@0,100..900;1,100..900&display=swap\" rel=\"stylesheet\">\n    <style>\n        \/* ========================= *\/\n          \/* BASE STYLES *\/\n          \/* ========================= *\/\n          .produk-container {\n              display: flex;\n              flex-direction: column;\n              gap: 12px;\n          }\n\n          .produk-card {\n            cursor: pointer;\n            display: flex;\n            margin: 0;\n            border: 1px solid #eee;\n            border-radius: 12px;\n            overflow: hidden;\n            font-family: Overpass, sans-serif;\n            background: #ffffff;\n          }\n\n          .produk-image {\n            position: relative;\n            flex-shrink: 0;\n          }\n\n          .produk-image img {\n            width: 100%;\n            height: 100%;\n            object-fit: cover;\n          }\n\n          .produk-location {\n            position: absolute;\n            left: 8px;\n            bottom: 8px;\n            background: #fff;\n            border-radius: 12px;\n            border: 1px solid #dadbe0;\n            padding: 4px 6px;\n            font-size: 10px;\n            line-height: 14px;\n          }\n\n          .produk-content {\n            flex: 1;\n            display: flex;\n            flex-direction: column;\n            gap: 12px;\n          }\n\n          .produk-title {\n            font-weight: 700;\n          }\n\n          .produk-rating {\n            font-size: 16px;\n            color: #333;\n            display: flex;\n            align-items: flex-start;\n            gap: 4px;\n          }\n\n          .produk-rating-line {\n            display: flex;\n            align-items: flex-start;\n            gap: 4px;\n          }\n\n          .produk-price-main {\n            color: #cb1c4f;\n            font-weight: 800;\n            font-size: 16px;\n          }\n\n          .produk-price-strike {\n            text-decoration: line-through;\n            font-size: 14px;\n            opacity: 0.7;\n            margin-right: 8px;\n          }\n\n          .produk-discount {\n            background: #cb1c4f;\n            color: #fff;\n            padding: 2px 6px;\n            border-radius: 4px;\n            font-size: 14px;\n          }\n\n          .produk-btn {\n            background: #cb1c4f;\n            color: #ffffff;\n            padding: 10px 16px;\n            border-radius: 8px;\n            text-decoration: none;\n            font-weight: 600;\n            margin-top: 8px;\n          }\n\n          .produk-btn:hover {\n            text-decoration: none;\n            color: #ffffff;\n          }\n\n          .product-info-wrap {\n            display: flex;\n            flex-wrap: nowrap;\n            justify-content: space-between;\n          }\n\n          \/* ========================= *\/\n          \/* DESKTOP (>= 800px) *\/\n          \/* ========================= *\/\n\n          @media (min-width: 800px) {\n            .produk-image {\n              width: 200px;\n            }\n\n            .produk-content {\n              padding: 20px;\n            }\n\n            .product-info-wrap {\n              flex-direction: row;\n              align-items: center;\n            }\n\n            .produk-btn {\n              display: inline-block;\n            }\n          }\n\n          \/* ========================= *\/\n          \/* TABLET (<= 768px) *\/\n          \/* ========================= *\/\n\n          @media (max-width: 768px) {\n            .produk-card {\n              flex-direction: column;\n            }\n\n            .produk-image {\n              width: 200px;\n              height: 220px;\n            }\n\n            .produk-content {\n              padding: 12px;\n            }\n\n            .produk-title {\n              font-size: 18px;\n            }\n\n            .produk-rating {\n              font-size: 14px;\n            }\n\n            .product-info-wrap {\n              flex-direction: column;\n              align-items: flex-start;\n              gap: 12px;\n            }\n\n            .produk-btn {\n              display: none;\n            }\n          }\n\n          \/* ========================= *\/\n          \/* MOBILE (<= 480px) *\/\n          \/* ========================= *\/\n\n          @media (max-width: 480px) {\n            .produk-image {\n              width: 100%;\n            }\n\n            .produk-content {\n              padding: 12px;\n            }\n\n            .produk-title {\n              font-size: 16px;\n              overflow: hidden;\n              text-overflow: ellipsis;\n            }\n\n            .produk-price-main {\n              font-size: 15px;\n            }\n\n            .produk-discount {\n              font-size: 12px;\n            }\n\n            .produk-btn {\n              display: none;\n            }\n          }\n\n          \/* ======================================= *\/\n          \/* CAROUSEL MODE (inside .carousel-list)  *\/\n          \/* ======================================= *\/\n\n          .carousel-wrapper {\n            position: relative;\n          }\n\n          .carousel-list {\n            overflow-x: auto;\n            overflow-y: hidden;\n            -webkit-overflow-scrolling: touch;\n            scroll-behavior: smooth;\n            scroll-snap-type: x mandatory;\n            scrollbar-width: none;\n          }\n\n          .carousel-list::-webkit-scrollbar {\n            display: none;\n          }\n\n          .carousel-list .produk-container {\n            display: flex;\n            flex-direction: row;\n            flex-wrap: nowrap;\n            width: max-content;\n            gap: 12px;\n          }\n\n          .carousel-list .produk-card {\n            flex: 0 0 auto;\n            width: 220px;\n            flex-direction: column;\n            scroll-snap-align: start;\n          }\n\n          .carousel-list .produk-image {\n            width: 100%;\n            height: 220px;\n          }\n\n          .carousel-list .produk-content {\n            padding: 12px;\n          }\n\n          .carousel-list .produk-title {\n\t\t\t  font-size: 16px;\n\t\t\t  overflow: hidden;\n\t\t\t  text-overflow: ellipsis;\n\t\t\t  display: -webkit-box;\n\t\t\t  -webkit-line-clamp: 2;\n\t\t\t  -webkit-box-orient: vertical;\n\t\t\t  line-clamp: 2;\n\t\t\t}\n\n          .carousel-list .produk-rating {\n            font-size: 14px;\n          }\n\n          .carousel-list .produk-price-main {\n            font-size: 15px;\n          }\n\n          .carousel-list .produk-discount {\n            font-size: 12px;\n          }\n\n          .carousel-list .product-info-wrap {\n            flex-direction: column;\n            align-items: flex-start;\n            gap: 12px;\n          }\n\n          .carousel-list .produk-btn {\n            display: none;\n          }\n\n          \/* ========================= *\/\n          \/* CAROUSEL ARROWS *\/\n          \/* ========================= *\/\n\n          .carousel-arrow {\n            position: absolute;\n            top: 50%;\n            transform: translateY(-50%);\n            width: 36px;\n            height: 36px;\n            border-radius: 50%;\n            background: #ffffff;\n            border: 1px solid #dadbe0;\n            box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n            cursor: pointer;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            z-index: 10;\n            transition: opacity 0.2s, box-shadow 0.2s;\n            padding: 0;\n          }\n\n          .carousel-arrow:hover {\n\t\t\tbackground: #FFFFFF;\n            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n          }\n\n          .carousel-arrow.is-hidden {\n            opacity: 0;\n            pointer-events: none;\n          }\n\n          .carousel-arrow-left {\n            left: -18px;\n          }\n\n          .carousel-arrow-right {\n            right: -18px;\n          }\n\n          @media (max-width: 480px) {\n\t\t\t.carousel-arrow{\n\t\t\t\tdisplay: none;\n\t\t\t}\n            .carousel-arrow-left {\n              left: 4px;\n            }\n\n            .carousel-arrow-right {\n              right: 4px;\n            }\n          }\n    <\/style>\n\n    <!-- HTML -->\n    <div class=\"carousel-wrapper\" data-carousel-id=\"carousel-6a142bbe01832\" data-is-carousel=\"1\">\n                    <button type=\"button\" class=\"carousel-arrow carousel-arrow-left is-hidden\" aria-label=\"Scroll left\">\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"25\" height=\"25\" fill=\"#000000\" viewBox=\"0 0 256 256\"><path d=\"M216,88v80a8,8,0,0,1-8,8H120v48L24,128l96-96V80h88A8,8,0,0,1,216,88Z\" opacity=\"0.2\"><\/path><path d=\"M208,72H128V32a8,8,0,0,0-13.66-5.66l-96,96a8,8,0,0,0,0,11.32l96,96A8,8,0,0,0,128,224V184h80a16,16,0,0,0,16-16V88A16,16,0,0,0,208,72Zm0,96H120a8,8,0,0,0-8,8v28.69L35.31,128,112,51.31V80a8,8,0,0,0,8,8h88Z\"><\/path><\/svg>\n            <\/button>\n            <button type=\"button\" class=\"carousel-arrow carousel-arrow-right is-hidden\" aria-label=\"Scroll right\">\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"25\" height=\"25\" fill=\"#000000\" viewBox=\"0 0 256 256\"><path d=\"M136,224V176H48a8,8,0,0,1-8-8V88a8,8,0,0,1,8-8h88V32l96,96Z\" opacity=\"0.2\"><\/path><path d=\"M237.66,122.34l-96-96A8,8,0,0,0,128,32V72H48A16,16,0,0,0,32,88v80a16,16,0,0,0,16,16h80v40a8,8,0,0,0,13.66,5.66l96-96A8,8,0,0,0,237.66,122.34ZM144,204.69V176a8,8,0,0,0-8-8H48V88h88a8,8,0,0,0,8-8V51.31L220.69,128Z\"><\/path><\/svg>\n            <\/button>\n                <div class=\"carousel-list\">\n            <div class=\"produk-container\" data-slugs=\" uluwatu-temple-kecak-fire-dance-satusatu-curated-experience-sameday-booking-bonus-merchandise, satusatu-exclusive-car-charter-sameday-booking, satusatu-airport-transfer-from-to-airport-sameday-booking, nusa-penida-day-tour-satusatu-curated-experience-bonus-merchandise, bali-bird-park-experience-nature-wildlife-adventure\"><\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Script -->\n    <script>\n    (function() {\n\t\tfunction buildCatalogUrl(slug) {\n\t\t\t\/\/ UTM params hardcoded by the shortcode (these always win)\n\t\t\tconst hardcoded = {\n\t\t\t\tutm_source: \"blog\",\n\t\t\t\tutm_medium: \"in_line_product_cta\",\n\t\t\t};\n\n\t\t\t\/\/ UTM params from the current page URL (only used if hardcoded doesn't define them)\n\t\t\tconst pageParams = new URLSearchParams(window.location.search);\n\t\t\tconst utmKeys = [\"utm_source\", \"utm_medium\", \"utm_campaign\", \"utm_content\", \"utm_term\"];\n\t\t\tconst merged = new URLSearchParams();\n\n\t\t\tutmKeys.forEach(key => {\n\t\t\t\tif (hardcoded[key] !== undefined) {\n\t\t\t\t\t\/\/ Hardcoded value takes priority\n\t\t\t\t\tmerged.set(key, hardcoded[key]);\n\t\t\t\t} else if (pageParams.has(key)) {\n\t\t\t\t\t\/\/ Fall back to whatever the page URL has\n\t\t\t\t\tmerged.set(key, pageParams.get(key));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn \"https:\/\/satusatu.com\/en-ID\/catalog\/\" + slug + \"?\" + merged.toString();\n\t\t}\n\t\t\n        function renderCatalogItem(p) {\n            const location = p.location?.name || \"\";\n            const rating = p.rating?.average_rating ?? null;\n            const ratingCount = p.rating?.count_rating_display || \"\";\n            const soldDisplay = p.rating?.total_sold_display || \"\";\n            const currency = p.pricing?.currency_symbol || \"Rp\";\n            const price = p.pricing?.min_price || 0;\n            const originalPrice = p.pricing?.min_original_price || 0;\n            const discount = p.pricing?.discount || 0;\n\t\t\tconst catalogUrl = buildCatalogUrl(p.slug);\n\n            return `\n                <div class=\"produk-card\" data-url=\"${catalogUrl}\">\n                    <div class=\"produk-image\">\n                        <img decoding=\"async\" src=\"${p.image_url}\" alt=\"${p.title}\" \/>\n                        <div class=\"produk-location\">\n\t\t\t\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"16\" height=\"16\" fill=\"#000000\" viewBox=\"0 0 256 256\"><path d=\"M128,24a80,80,0,0,0-80,80c0,72,80,128,80,128s80-56,80-128A80,80,0,0,0,128,24Zm0,112a32,32,0,1,1,32-32A32,32,0,0,1,128,136Z\" opacity=\"0.2\"><\/path><path d=\"M128,64a40,40,0,1,0,40,40A40,40,0,0,0,128,64Zm0,64a24,24,0,1,1,24-24A24,24,0,0,1,128,128Zm0-112a88.1,88.1,0,0,0-88,88c0,31.4,14.51,64.68,42,96.25a254.19,254.19,0,0,0,41.45,38.3,8,8,0,0,0,9.18,0A254.19,254.19,0,0,0,174,200.25c27.45-31.57,42-64.85,42-96.25A88.1,88.1,0,0,0,128,16Zm0,206c-16.53-13-72-60.75-72-118a72,72,0,0,1,144,0C200,161.23,144.53,209,128,222Z\"><\/path><\/svg>\n                            <span>${location}<\/span>\n                        <\/div>\n                    <\/div>\n                    <div class=\"produk-content\">\n                        <div class=\"produk-title\">${p.title}<\/div>\n                        ${rating ? `\n                        <div class=\"produk-rating\">\n                            <div class=\"produk-rating-line\">\n                                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"18\" height=\"18\" fill=\"#F87500\" viewBox=\"0 0 256 256\"><path d=\"M229.06,108.79l-48.7,42,14.88,62.79a8.4,8.4,0,0,1-12.52,9.17L128,189.09,73.28,222.74a8.4,8.4,0,0,1-12.52-9.17l14.88-62.79-48.7-42A8.46,8.46,0,0,1,31.73,94L95.64,88.8l24.62-59.6a8.36,8.36,0,0,1,15.48,0l24.62,59.6L224.27,94A8.46,8.46,0,0,1,229.06,108.79Z\" opacity=\"0.2\"><\/path><path d=\"M239.18,97.26A16.38,16.38,0,0,0,224.92,86l-59-4.76L143.14,26.15a16.36,16.36,0,0,0-30.27,0L90.11,81.23,31.08,86a16.46,16.46,0,0,0-9.37,28.86l45,38.83L53,211.75a16.38,16.38,0,0,0,24.5,17.82L128,198.49l50.53,31.08A16.4,16.4,0,0,0,203,211.75l-13.76-58.07,45-38.83A16.43,16.43,0,0,0,239.18,97.26Zm-15.34,5.47-48.7,42a8,8,0,0,0-2.56,7.91l14.88,62.8a.37.37,0,0,1-.17.48c-.18.14-.23.11-.38,0l-54.72-33.65a8,8,0,0,0-8.38,0L69.09,215.94c-.15.09-.19.12-.38,0a.37.37,0,0,1-.17-.48l14.88-62.8a8,8,0,0,0-2.56-7.91l-48.7-42c-.12-.1-.23-.19-.13-.5s.18-.27.33-.29l63.92-5.16A8,8,0,0,0,103,91.86l24.62-59.61c.08-.17.11-.25.35-.25s.27.08.35.25L153,91.86a8,8,0,0,0,6.75,4.92l63.92,5.16c.15,0,.24,0,.33.29S224,102.63,223.84,102.73Z\"><\/path><\/svg>\n                                <span>${rating} (${ratingCount}) &bull; ${soldDisplay} sold<\/span>\n                            <\/div>\n                        <\/div>` : ''}\n                        <div class=\"product-info-wrap\">\n                            <div>\n                                <div style=\"display:flex;gap:6px;\">\n                                    <div style=\"font-size:14px;\">From<\/div>\n                                    <div class=\"produk-price-main\">${currency} ${price.toLocaleString()}<\/div>\n                                <\/div>\n                                ${discount > 0 ? `\n                                <div>\n                                    <span class=\"produk-price-strike\">${currency} ${originalPrice.toLocaleString()}<\/span>\n                                    <span class=\"produk-discount\">-${discount}%<\/span>\n                                <\/div>` : ''}\n                            <\/div>\n                            <div>\n                                <a target=\"_blank\" href=\"${catalogUrl}\" class=\"produk-btn\">Check Availability<\/a>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            `;\n        }\n\n        function initSatuSatuCatalog(wrapperEl) {\n            const scrollEl = wrapperEl.querySelector(\".carousel-list\");\n            const container = wrapperEl.querySelector(\".produk-container\");\n            const slugs = container.getAttribute(\"data-slugs\");\n            const isCarousel = wrapperEl.getAttribute(\"data-is-carousel\") === \"1\";\n            const leftArrow = wrapperEl.querySelector(\".carousel-arrow-left\");\n            const rightArrow = wrapperEl.querySelector(\".carousel-arrow-right\");\n\n            fetch(\"https:\/\/api.satusatu.com\/content\/guest\/satusatu\/v1\/catalogs\/blog\/catalog-list?slugs=\" + slugs)\n                .then(res => res.json())\n                .then(data => {\n                    container.innerHTML = data.data.map(renderCatalogItem).join('');\n                    \/\/ Event handler for card click\n                    container.querySelectorAll('.produk-card').forEach(card => {\n                        card.addEventListener('click', () => {\n                            window.open(card.dataset.url, '_blank');\n                        });\n                    });\n\n                    if (isCarousel && scrollEl && leftArrow && rightArrow) {\n                        const scrollAmount = 240;\n                        function updateArrows() {\n                            const sl = scrollEl.scrollLeft;\n                            const sw = scrollEl.scrollWidth;\n                            const cw = scrollEl.clientWidth;\n                            leftArrow.classList.toggle(\"is-hidden\", sl <= 0);\n                            rightArrow.classList.toggle(\"is-hidden\", sl + cw >= sw - 1);\n                        }\n                        leftArrow.addEventListener(\"click\", e => {\n                            e.stopPropagation();\n                            scrollEl.scrollBy({ left: -scrollAmount, behavior: \"smooth\" });\n                        });\n                        rightArrow.addEventListener(\"click\", e => {\n                            e.stopPropagation();\n                            scrollEl.scrollBy({ left: scrollAmount, behavior: \"smooth\" });\n                        });\n                        scrollEl.addEventListener(\"scroll\", updateArrows);\n                        window.addEventListener(\"resize\", updateArrows);\n                        setTimeout(updateArrows, 200);\n                    }\n                });\n        }\n\n        document.addEventListener(\"DOMContentLoaded\", function() {\n            document.querySelectorAll(\"[data-carousel-id]\").forEach(initSatuSatuCatalog);\n        });\n    })();\n    <\/script>\n    <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How Far Is Canggu to Ubud?<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1536\" height=\"1024\" src=\"https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud-1.png\" alt=\"Canggu to Ubud\" class=\"wp-image-3241\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The road distance from central Canggu to central Ubud is approximately 28 to 35 kilometers, depending on where in Canggu you start and where in Ubud you&#8217;re heading. This is not a highway route.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The road winds through several towns, including parts of Mengwi and the outskirts of Denpasar, before climbing into the Gianyar highlands toward Ubud.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Average travel time on a good run with early morning timing is 45 minutes to an hour. During peak traffic, particularly late morning or late afternoon when market traffic, school runs, and tourist movements all converge, the journey can stretch to 90 minutes or more in a car.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Getting from Canggu to Ubud: All Your Options<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>By private car or taxi<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This is the most straightforward option for most travelers. A private car with a local driver is particularly valuable on this route because the roads between Canggu and Ubud include some stretches where local knowledge makes a genuine difference.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A driver who knows Bali will use the Jalan Raya Munggu-Kapal route, which is faster and better maintained than some of the more scenic but slower alternatives. Cost for a one-way transfer by private car ranges from approximately IDR 200,000 to IDR 300,000 depending on time and provider.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a full day exploring Ubud with a private driver, which allows you to stop at Tegallalang, Goa Gajah, and other points along the way, expect to pay IDR 350,000 to IDR 1,000,000 for the full day, with the more affordable end covering a basic car and the higher end including a more premium experience.<\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>By scooter<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">For solo travelers or confident riders who travel light, the scooter route from Canggu to Ubud is one of the most rewarding rides in Bali. Taking the route through quiet backroads toward Pererenan and then connecting to the Munggu-Kapal road gives you views and experiences that car passengers miss entirely.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The journey takes around 1 to 1.5 hours, and the flexibility to stop at roadside temples, fruit stands, and viewpoints along the way is a genuine advantage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Scooter rental in Canggu starts from around IDR 60,000 per day. A valid driving license and travel insurance are required, and navigating Ubud&#8217;s one-way streets and parking situation takes some patience.<\/p>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>By shuttle bus<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Several shuttle services operate between Canggu and Ubud, offered by companies that run fixed-route tourist services across the island. These services typically require getting to a pickup point rather than offering door-to-door service, and they run on fixed schedules.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pricing is around IDR 100,000 to IDR 150,000 per person, making it the most budget-friendly motorized option after a scooter. The trade-off is the fixed timing and occasional crowding.<\/p>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>By app-based ride<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">App-based services operate between Canggu and Ubud but come with practical complications at both ends. Canggu has areas where app pickups can be confrontational with local taxi operators, and Ubud&#8217;s historic center has restrictions on motorized vehicles.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Using an app for this route is technically possible but requires knowing which streets in each area are app-accessible, which is knowledge that builds with familiarity rather than on a first trip.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What to See Between Canggu and Ubud<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The journey itself has rewards worth pausing for. Leaving early from Canggu gives you time to stop at Taman Ayun Temple in Mengwi, one of Bali&#8217;s most photogenic royal temples and far less visited than Tanah Lot.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Further along, the Tegallalang Rice Terraces outside Ubud are among the most photographed landscapes on the island and are best enjoyed before the tour buses arrive around 10am.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For those with cultural interests, Goa Gajah, the Elephant Cave temple complex just outside Ubud, is a legitimate archaeological site dating to the 9th century and only slightly out of the way on the main route.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Practical Tips<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Leave before 9am. The Canggu-to-Ubud route shares some roads with early morning market traffic and school runs, but these typically clear faster than the tourist-facing gridlock that settles in by late morning. The earlier you leave, the more of Ubud you get.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Build in buffer time, especially if you have restaurant reservations, a class, or a ceremony to attend. Bali traffic has its own timeline and doesn&#8217;t negotiate.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Explore Both Destinations with SatuSatu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Whether you&#8217;re moving base entirely or making a day trip, SatuSatu handles both kinds of Canggu-to-Ubud journey comfortably. SatuSatu is a Bali travel platform covering transport, experiences, and activities across the island, all available at <a href=\"http:\/\/satusatu.com\">SatuSatu.com<\/a>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/satusatu.com\/en-US\/catalog\/satusatu-airport-transfer-from-to-airport-sameday-booking\">SatuSatu Airport Transfer<\/a> is the recommended way to start any Bali trip, getting you from Ngurah Rai to your first accommodation without any of the arrival-hall chaos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the Canggu to Ubud journey itself, <a href=\"https:\/\/satusatu.com\/en-US\/catalog\/satusatu-exclusive-car-charter-sameday-booking\">SatuSatu Exclusive Car Charter<\/a> provides a private local driver and complete flexibility over timing, stops, and routing. It&#8217;s the most comfortable and reliable way to make this specific journey.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In Ubud, don&#8217;t leave without booking the <a href=\"https:\/\/satusatu.com\/en-US\/catalog\/uluwatu-temple-kecak-fire-dance-satusatu-curated-experience-sameday-booking-bonus-merchandise\">SatuSatu Kecak Fire Dance<\/a>, one of the most compelling cultural experiences on the island. And for the full Ubud experience, the SatuSatu Ubud Cultural Tour covers rice terraces, temples, and highland villages in a single well-organized day.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All bookings at <a href=\"http:\/\/satusatu.com\">SatuSatu.com<\/a> with payment options including BCA, Mandiri, OVO, DANA, credit cards, and more.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ about Canggu to Ubud<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How long does Canggu to Ubud take?<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Between 45 minutes and 1.5 hours depending on the time of day and traffic. Early mornings are consistently faster.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What is the best way to get from Canggu to Ubud?<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A private car with a local driver is the most comfortable and reliable option, especially for first-time visitors or those with luggage. Scooter is best for confident riders who travel light.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Is there a direct bus from Canggu to Ubud?<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Shuttle services operate on this route but require getting to a pickup point and following fixed departure times. They are affordable but less flexible than a private car.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Can I do Canggu to Ubud as a day trip?<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, it&#8217;s a popular day trip. Leaving early from Canggu gives you a full day in Ubud before returning in the afternoon.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What should I see on the way from Canggu to Ubud?<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Taman Ayun Temple in Mengwi, the Tegallalang Rice Terraces, and Goa Gajah are the most rewarding stops along the route.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">    <!-- Styles -->\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Overpass:ital,wght@0,100..900;1,100..900&display=swap\" rel=\"stylesheet\">\n    <style>\n        \/* ========================= *\/\n          \/* BASE STYLES *\/\n          \/* ========================= *\/\n          .produk-container {\n              display: flex;\n              flex-direction: column;\n              gap: 12px;\n          }\n\n          .produk-card {\n            cursor: pointer;\n            display: flex;\n            margin: 0;\n            border: 1px solid #eee;\n            border-radius: 12px;\n            overflow: hidden;\n            font-family: Overpass, sans-serif;\n            background: #ffffff;\n          }\n\n          .produk-image {\n            position: relative;\n            flex-shrink: 0;\n          }\n\n          .produk-image img {\n            width: 100%;\n            height: 100%;\n            object-fit: cover;\n          }\n\n          .produk-location {\n            position: absolute;\n            left: 8px;\n            bottom: 8px;\n            background: #fff;\n            border-radius: 12px;\n            border: 1px solid #dadbe0;\n            padding: 4px 6px;\n            font-size: 10px;\n            line-height: 14px;\n          }\n\n          .produk-content {\n            flex: 1;\n            display: flex;\n            flex-direction: column;\n            gap: 12px;\n          }\n\n          .produk-title {\n            font-weight: 700;\n          }\n\n          .produk-rating {\n            font-size: 16px;\n            color: #333;\n            display: flex;\n            align-items: flex-start;\n            gap: 4px;\n          }\n\n          .produk-rating-line {\n            display: flex;\n            align-items: flex-start;\n            gap: 4px;\n          }\n\n          .produk-price-main {\n            color: #cb1c4f;\n            font-weight: 800;\n            font-size: 16px;\n          }\n\n          .produk-price-strike {\n            text-decoration: line-through;\n            font-size: 14px;\n            opacity: 0.7;\n            margin-right: 8px;\n          }\n\n          .produk-discount {\n            background: #cb1c4f;\n            color: #fff;\n            padding: 2px 6px;\n            border-radius: 4px;\n            font-size: 14px;\n          }\n\n          .produk-btn {\n            background: #cb1c4f;\n            color: #ffffff;\n            padding: 10px 16px;\n            border-radius: 8px;\n            text-decoration: none;\n            font-weight: 600;\n            margin-top: 8px;\n          }\n\n          .produk-btn:hover {\n            text-decoration: none;\n            color: #ffffff;\n          }\n\n          .product-info-wrap {\n            display: flex;\n            flex-wrap: nowrap;\n            justify-content: space-between;\n          }\n\n          \/* ========================= *\/\n          \/* DESKTOP (>= 800px) *\/\n          \/* ========================= *\/\n\n          @media (min-width: 800px) {\n            .produk-image {\n              width: 200px;\n            }\n\n            .produk-content {\n              padding: 20px;\n            }\n\n            .product-info-wrap {\n              flex-direction: row;\n              align-items: center;\n            }\n\n            .produk-btn {\n              display: inline-block;\n            }\n          }\n\n          \/* ========================= *\/\n          \/* TABLET (<= 768px) *\/\n          \/* ========================= *\/\n\n          @media (max-width: 768px) {\n            .produk-card {\n              flex-direction: column;\n            }\n\n            .produk-image {\n              width: 200px;\n              height: 220px;\n            }\n\n            .produk-content {\n              padding: 12px;\n            }\n\n            .produk-title {\n              font-size: 18px;\n            }\n\n            .produk-rating {\n              font-size: 14px;\n            }\n\n            .product-info-wrap {\n              flex-direction: column;\n              align-items: flex-start;\n              gap: 12px;\n            }\n\n            .produk-btn {\n              display: none;\n            }\n          }\n\n          \/* ========================= *\/\n          \/* MOBILE (<= 480px) *\/\n          \/* ========================= *\/\n\n          @media (max-width: 480px) {\n            .produk-image {\n              width: 100%;\n            }\n\n            .produk-content {\n              padding: 12px;\n            }\n\n            .produk-title {\n              font-size: 16px;\n              overflow: hidden;\n              text-overflow: ellipsis;\n            }\n\n            .produk-price-main {\n              font-size: 15px;\n            }\n\n            .produk-discount {\n              font-size: 12px;\n            }\n\n            .produk-btn {\n              display: none;\n            }\n          }\n\n          \/* ======================================= *\/\n          \/* CAROUSEL MODE (inside .carousel-list)  *\/\n          \/* ======================================= *\/\n\n          .carousel-wrapper {\n            position: relative;\n          }\n\n          .carousel-list {\n            overflow-x: auto;\n            overflow-y: hidden;\n            -webkit-overflow-scrolling: touch;\n            scroll-behavior: smooth;\n            scroll-snap-type: x mandatory;\n            scrollbar-width: none;\n          }\n\n          .carousel-list::-webkit-scrollbar {\n            display: none;\n          }\n\n          .carousel-list .produk-container {\n            display: flex;\n            flex-direction: row;\n            flex-wrap: nowrap;\n            width: max-content;\n            gap: 12px;\n          }\n\n          .carousel-list .produk-card {\n            flex: 0 0 auto;\n            width: 220px;\n            flex-direction: column;\n            scroll-snap-align: start;\n          }\n\n          .carousel-list .produk-image {\n            width: 100%;\n            height: 220px;\n          }\n\n          .carousel-list .produk-content {\n            padding: 12px;\n          }\n\n          .carousel-list .produk-title {\n\t\t\t  font-size: 16px;\n\t\t\t  overflow: hidden;\n\t\t\t  text-overflow: ellipsis;\n\t\t\t  display: -webkit-box;\n\t\t\t  -webkit-line-clamp: 2;\n\t\t\t  -webkit-box-orient: vertical;\n\t\t\t  line-clamp: 2;\n\t\t\t}\n\n          .carousel-list .produk-rating {\n            font-size: 14px;\n          }\n\n          .carousel-list .produk-price-main {\n            font-size: 15px;\n          }\n\n          .carousel-list .produk-discount {\n            font-size: 12px;\n          }\n\n          .carousel-list .product-info-wrap {\n            flex-direction: column;\n            align-items: flex-start;\n            gap: 12px;\n          }\n\n          .carousel-list .produk-btn {\n            display: none;\n          }\n\n          \/* ========================= *\/\n          \/* CAROUSEL ARROWS *\/\n          \/* ========================= *\/\n\n          .carousel-arrow {\n            position: absolute;\n            top: 50%;\n            transform: translateY(-50%);\n            width: 36px;\n            height: 36px;\n            border-radius: 50%;\n            background: #ffffff;\n            border: 1px solid #dadbe0;\n            box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n            cursor: pointer;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            z-index: 10;\n            transition: opacity 0.2s, box-shadow 0.2s;\n            padding: 0;\n          }\n\n          .carousel-arrow:hover {\n\t\t\tbackground: #FFFFFF;\n            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n          }\n\n          .carousel-arrow.is-hidden {\n            opacity: 0;\n            pointer-events: none;\n          }\n\n          .carousel-arrow-left {\n            left: -18px;\n          }\n\n          .carousel-arrow-right {\n            right: -18px;\n          }\n\n          @media (max-width: 480px) {\n\t\t\t.carousel-arrow{\n\t\t\t\tdisplay: none;\n\t\t\t}\n            .carousel-arrow-left {\n              left: 4px;\n            }\n\n            .carousel-arrow-right {\n              right: 4px;\n            }\n          }\n    <\/style>\n\n    <!-- HTML -->\n    <div class=\"carousel-wrapper\" data-carousel-id=\"carousel-6a142bbe01851\" data-is-carousel=\"1\">\n                    <button type=\"button\" class=\"carousel-arrow carousel-arrow-left is-hidden\" aria-label=\"Scroll left\">\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"25\" height=\"25\" fill=\"#000000\" viewBox=\"0 0 256 256\"><path d=\"M216,88v80a8,8,0,0,1-8,8H120v48L24,128l96-96V80h88A8,8,0,0,1,216,88Z\" opacity=\"0.2\"><\/path><path d=\"M208,72H128V32a8,8,0,0,0-13.66-5.66l-96,96a8,8,0,0,0,0,11.32l96,96A8,8,0,0,0,128,224V184h80a16,16,0,0,0,16-16V88A16,16,0,0,0,208,72Zm0,96H120a8,8,0,0,0-8,8v28.69L35.31,128,112,51.31V80a8,8,0,0,0,8,8h88Z\"><\/path><\/svg>\n            <\/button>\n            <button type=\"button\" class=\"carousel-arrow carousel-arrow-right is-hidden\" aria-label=\"Scroll right\">\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"25\" height=\"25\" fill=\"#000000\" viewBox=\"0 0 256 256\"><path d=\"M136,224V176H48a8,8,0,0,1-8-8V88a8,8,0,0,1,8-8h88V32l96,96Z\" opacity=\"0.2\"><\/path><path d=\"M237.66,122.34l-96-96A8,8,0,0,0,128,32V72H48A16,16,0,0,0,32,88v80a16,16,0,0,0,16,16h80v40a8,8,0,0,0,13.66,5.66l96-96A8,8,0,0,0,237.66,122.34ZM144,204.69V176a8,8,0,0,0-8-8H48V88h88a8,8,0,0,0,8-8V51.31L220.69,128Z\"><\/path><\/svg>\n            <\/button>\n                <div class=\"carousel-list\">\n            <div class=\"produk-container\" data-slugs=\" uluwatu-temple-kecak-fire-dance-satusatu-curated-experience-sameday-booking-bonus-merchandise, satusatu-exclusive-car-charter-sameday-booking, satusatu-airport-transfer-from-to-airport-sameday-booking, nusa-penida-day-tour-satusatu-curated-experience-bonus-merchandise, bali-bird-park-experience-nature-wildlife-adventure\"><\/div>\n        <\/div>\n    <\/div>\n\n    <!-- Script -->\n    <script>\n    (function() {\n\t\tfunction buildCatalogUrl(slug) {\n\t\t\t\/\/ UTM params hardcoded by the shortcode (these always win)\n\t\t\tconst hardcoded = {\n\t\t\t\tutm_source: \"blog\",\n\t\t\t\tutm_medium: \"in_line_product_cta\",\n\t\t\t};\n\n\t\t\t\/\/ UTM params from the current page URL (only used if hardcoded doesn't define them)\n\t\t\tconst pageParams = new URLSearchParams(window.location.search);\n\t\t\tconst utmKeys = [\"utm_source\", \"utm_medium\", \"utm_campaign\", \"utm_content\", \"utm_term\"];\n\t\t\tconst merged = new URLSearchParams();\n\n\t\t\tutmKeys.forEach(key => {\n\t\t\t\tif (hardcoded[key] !== undefined) {\n\t\t\t\t\t\/\/ Hardcoded value takes priority\n\t\t\t\t\tmerged.set(key, hardcoded[key]);\n\t\t\t\t} else if (pageParams.has(key)) {\n\t\t\t\t\t\/\/ Fall back to whatever the page URL has\n\t\t\t\t\tmerged.set(key, pageParams.get(key));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn \"https:\/\/satusatu.com\/en-ID\/catalog\/\" + slug + \"?\" + merged.toString();\n\t\t}\n\t\t\n        function renderCatalogItem(p) {\n            const location = p.location?.name || \"\";\n            const rating = p.rating?.average_rating ?? null;\n            const ratingCount = p.rating?.count_rating_display || \"\";\n            const soldDisplay = p.rating?.total_sold_display || \"\";\n            const currency = p.pricing?.currency_symbol || \"Rp\";\n            const price = p.pricing?.min_price || 0;\n            const originalPrice = p.pricing?.min_original_price || 0;\n            const discount = p.pricing?.discount || 0;\n\t\t\tconst catalogUrl = buildCatalogUrl(p.slug);\n\n            return `\n                <div class=\"produk-card\" data-url=\"${catalogUrl}\">\n                    <div class=\"produk-image\">\n                        <img decoding=\"async\" src=\"${p.image_url}\" alt=\"${p.title}\" \/>\n                        <div class=\"produk-location\">\n\t\t\t\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"16\" height=\"16\" fill=\"#000000\" viewBox=\"0 0 256 256\"><path d=\"M128,24a80,80,0,0,0-80,80c0,72,80,128,80,128s80-56,80-128A80,80,0,0,0,128,24Zm0,112a32,32,0,1,1,32-32A32,32,0,0,1,128,136Z\" opacity=\"0.2\"><\/path><path d=\"M128,64a40,40,0,1,0,40,40A40,40,0,0,0,128,64Zm0,64a24,24,0,1,1,24-24A24,24,0,0,1,128,128Zm0-112a88.1,88.1,0,0,0-88,88c0,31.4,14.51,64.68,42,96.25a254.19,254.19,0,0,0,41.45,38.3,8,8,0,0,0,9.18,0A254.19,254.19,0,0,0,174,200.25c27.45-31.57,42-64.85,42-96.25A88.1,88.1,0,0,0,128,16Zm0,206c-16.53-13-72-60.75-72-118a72,72,0,0,1,144,0C200,161.23,144.53,209,128,222Z\"><\/path><\/svg>\n                            <span>${location}<\/span>\n                        <\/div>\n                    <\/div>\n                    <div class=\"produk-content\">\n                        <div class=\"produk-title\">${p.title}<\/div>\n                        ${rating ? `\n                        <div class=\"produk-rating\">\n                            <div class=\"produk-rating-line\">\n                                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"18\" height=\"18\" fill=\"#F87500\" viewBox=\"0 0 256 256\"><path d=\"M229.06,108.79l-48.7,42,14.88,62.79a8.4,8.4,0,0,1-12.52,9.17L128,189.09,73.28,222.74a8.4,8.4,0,0,1-12.52-9.17l14.88-62.79-48.7-42A8.46,8.46,0,0,1,31.73,94L95.64,88.8l24.62-59.6a8.36,8.36,0,0,1,15.48,0l24.62,59.6L224.27,94A8.46,8.46,0,0,1,229.06,108.79Z\" opacity=\"0.2\"><\/path><path d=\"M239.18,97.26A16.38,16.38,0,0,0,224.92,86l-59-4.76L143.14,26.15a16.36,16.36,0,0,0-30.27,0L90.11,81.23,31.08,86a16.46,16.46,0,0,0-9.37,28.86l45,38.83L53,211.75a16.38,16.38,0,0,0,24.5,17.82L128,198.49l50.53,31.08A16.4,16.4,0,0,0,203,211.75l-13.76-58.07,45-38.83A16.43,16.43,0,0,0,239.18,97.26Zm-15.34,5.47-48.7,42a8,8,0,0,0-2.56,7.91l14.88,62.8a.37.37,0,0,1-.17.48c-.18.14-.23.11-.38,0l-54.72-33.65a8,8,0,0,0-8.38,0L69.09,215.94c-.15.09-.19.12-.38,0a.37.37,0,0,1-.17-.48l14.88-62.8a8,8,0,0,0-2.56-7.91l-48.7-42c-.12-.1-.23-.19-.13-.5s.18-.27.33-.29l63.92-5.16A8,8,0,0,0,103,91.86l24.62-59.61c.08-.17.11-.25.35-.25s.27.08.35.25L153,91.86a8,8,0,0,0,6.75,4.92l63.92,5.16c.15,0,.24,0,.33.29S224,102.63,223.84,102.73Z\"><\/path><\/svg>\n                                <span>${rating} (${ratingCount}) &bull; ${soldDisplay} sold<\/span>\n                            <\/div>\n                        <\/div>` : ''}\n                        <div class=\"product-info-wrap\">\n                            <div>\n                                <div style=\"display:flex;gap:6px;\">\n                                    <div style=\"font-size:14px;\">From<\/div>\n                                    <div class=\"produk-price-main\">${currency} ${price.toLocaleString()}<\/div>\n                                <\/div>\n                                ${discount > 0 ? `\n                                <div>\n                                    <span class=\"produk-price-strike\">${currency} ${originalPrice.toLocaleString()}<\/span>\n                                    <span class=\"produk-discount\">-${discount}%<\/span>\n                                <\/div>` : ''}\n                            <\/div>\n                            <div>\n                                <a target=\"_blank\" href=\"${catalogUrl}\" class=\"produk-btn\">Check Availability<\/a>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            `;\n        }\n\n        function initSatuSatuCatalog(wrapperEl) {\n            const scrollEl = wrapperEl.querySelector(\".carousel-list\");\n            const container = wrapperEl.querySelector(\".produk-container\");\n            const slugs = container.getAttribute(\"data-slugs\");\n            const isCarousel = wrapperEl.getAttribute(\"data-is-carousel\") === \"1\";\n            const leftArrow = wrapperEl.querySelector(\".carousel-arrow-left\");\n            const rightArrow = wrapperEl.querySelector(\".carousel-arrow-right\");\n\n            fetch(\"https:\/\/api.satusatu.com\/content\/guest\/satusatu\/v1\/catalogs\/blog\/catalog-list?slugs=\" + slugs)\n                .then(res => res.json())\n                .then(data => {\n                    container.innerHTML = data.data.map(renderCatalogItem).join('');\n                    \/\/ Event handler for card click\n                    container.querySelectorAll('.produk-card').forEach(card => {\n                        card.addEventListener('click', () => {\n                            window.open(card.dataset.url, '_blank');\n                        });\n                    });\n\n                    if (isCarousel && scrollEl && leftArrow && rightArrow) {\n                        const scrollAmount = 240;\n                        function updateArrows() {\n                            const sl = scrollEl.scrollLeft;\n                            const sw = scrollEl.scrollWidth;\n                            const cw = scrollEl.clientWidth;\n                            leftArrow.classList.toggle(\"is-hidden\", sl <= 0);\n                            rightArrow.classList.toggle(\"is-hidden\", sl + cw >= sw - 1);\n                        }\n                        leftArrow.addEventListener(\"click\", e => {\n                            e.stopPropagation();\n                            scrollEl.scrollBy({ left: -scrollAmount, behavior: \"smooth\" });\n                        });\n                        rightArrow.addEventListener(\"click\", e => {\n                            e.stopPropagation();\n                            scrollEl.scrollBy({ left: scrollAmount, behavior: \"smooth\" });\n                        });\n                        scrollEl.addEventListener(\"scroll\", updateArrows);\n                        window.addEventListener(\"resize\", updateArrows);\n                        setTimeout(updateArrows, 200);\n                    }\n                });\n        }\n\n        document.addEventListener(\"DOMContentLoaded\", function() {\n            document.querySelectorAll(\"[data-carousel-id]\").forEach(initSatuSatuCatalog);\n        });\n    })();\n    <\/script>\n    <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Canggu and Ubud sit at opposite ends of Bali&#8217;s personality spectrum. Canggu is beach clubs, surf breaks, and brunches that arrive with matcha art on top. Ubud is rice terraces, temple ceremonies, and afternoons watching clouds settle over the Campuhan Ridge.&nbsp; The distance between them is roughly 28 to 35 kilometers by road, which sounds&hellip;&nbsp;<\/p>\n","protected":false},"author":22,"featured_media":3240,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[4089,65],"tags":[4093,4443,526],"class_list":["post-3239","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bali-transportation","category-bali-travel-guide","tag-bali-transportation","tag-canggu-to-ubud","tag-satusatu"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Canggu to Ubud: Everything You Need to Know Before You Go -<\/title>\n<meta name=\"description\" content=\"Complete Canggu to Ubud travel guide covering distance, routes, travel time, transport options, costs, and best tips for smooth journey\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Canggu to Ubud: Everything You Need to Know Before You Go -\" \/>\n<meta property=\"og:description\" content=\"Complete Canggu to Ubud travel guide covering distance, routes, travel time, transport options, costs, and best tips for smooth journey\" \/>\n<meta property=\"og:url\" content=\"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-02T08:08:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-02T08:08:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1376\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Fatiya Aulia Muthmainnah\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatiya Aulia Muthmainnah\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/\"},\"author\":{\"name\":\"Fatiya Aulia Muthmainnah\",\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/#\\\/schema\\\/person\\\/4b773aced63910f3c4d3c4a8c82516c2\"},\"headline\":\"Canggu to Ubud: Everything You Need to Know Before You Go\",\"datePublished\":\"2026-05-02T08:08:49+00:00\",\"dateModified\":\"2026-05-02T08:08:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/\"},\"wordCount\":1203,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Canggu-to-Ubud.png\",\"keywords\":[\"Bali Transportation\",\"Canggu to Ubud\",\"SatuSatu\"],\"articleSection\":[\"Bali Transportation\",\"Bali Travel Guide\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/\",\"url\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/\",\"name\":\"Canggu to Ubud: Everything You Need to Know Before You Go -\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Canggu-to-Ubud.png\",\"datePublished\":\"2026-05-02T08:08:49+00:00\",\"dateModified\":\"2026-05-02T08:08:51+00:00\",\"description\":\"Complete Canggu to Ubud travel guide covering distance, routes, travel time, transport options, costs, and best tips for smooth journey\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/#primaryimage\",\"url\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Canggu-to-Ubud.png\",\"contentUrl\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Canggu-to-Ubud.png\",\"width\":1376,\"height\":768,\"caption\":\"Canggu to Ubud\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/canggu-to-ubud\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Canggu to Ubud: Everything You Need to Know Before You Go\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/#website\",\"url\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/\",\"name\":\"SatuSatu\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/#organization\",\"name\":\"SatuSatu\",\"url\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/Variant1024.png\",\"contentUrl\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/wp-content\\\/uploads\\\/2026\\\/01\\\/Variant1024.png\",\"width\":1024,\"height\":1024,\"caption\":\"SatuSatu\"},\"image\":{\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.instagram.com\\\/satusatucom\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/#\\\/schema\\\/person\\\/4b773aced63910f3c4d3c4a8c82516c2\",\"name\":\"Fatiya Aulia Muthmainnah\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f1bd35afe4fc3154c4ed985ce96b5941e11cd1aca25cc24a42ff9c58d10c640e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f1bd35afe4fc3154c4ed985ce96b5941e11cd1aca25cc24a42ff9c58d10c640e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f1bd35afe4fc3154c4ed985ce96b5941e11cd1aca25cc24a42ff9c58d10c640e?s=96&d=mm&r=g\",\"caption\":\"Fatiya Aulia Muthmainnah\"},\"url\":\"https:\\\/\\\/satusatu.com\\\/inspiration\\\/author\\\/ext-fatiya-aulia\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Canggu to Ubud: Everything You Need to Know Before You Go -","description":"Complete Canggu to Ubud travel guide covering distance, routes, travel time, transport options, costs, and best tips for smooth journey","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/","og_locale":"en_US","og_type":"article","og_title":"Canggu to Ubud: Everything You Need to Know Before You Go -","og_description":"Complete Canggu to Ubud travel guide covering distance, routes, travel time, transport options, costs, and best tips for smooth journey","og_url":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/","article_published_time":"2026-05-02T08:08:49+00:00","article_modified_time":"2026-05-02T08:08:51+00:00","og_image":[{"width":1376,"height":768,"url":"https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png","type":"image\/png"}],"author":"Fatiya Aulia Muthmainnah","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Fatiya Aulia Muthmainnah","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/#article","isPartOf":{"@id":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/"},"author":{"name":"Fatiya Aulia Muthmainnah","@id":"https:\/\/satusatu.com\/inspiration\/#\/schema\/person\/4b773aced63910f3c4d3c4a8c82516c2"},"headline":"Canggu to Ubud: Everything You Need to Know Before You Go","datePublished":"2026-05-02T08:08:49+00:00","dateModified":"2026-05-02T08:08:51+00:00","mainEntityOfPage":{"@id":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/"},"wordCount":1203,"commentCount":0,"publisher":{"@id":"https:\/\/satusatu.com\/inspiration\/#organization"},"image":{"@id":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/#primaryimage"},"thumbnailUrl":"https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png","keywords":["Bali Transportation","Canggu to Ubud","SatuSatu"],"articleSection":["Bali Transportation","Bali Travel Guide"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/","url":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/","name":"Canggu to Ubud: Everything You Need to Know Before You Go -","isPartOf":{"@id":"https:\/\/satusatu.com\/inspiration\/#website"},"primaryImageOfPage":{"@id":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/#primaryimage"},"image":{"@id":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/#primaryimage"},"thumbnailUrl":"https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png","datePublished":"2026-05-02T08:08:49+00:00","dateModified":"2026-05-02T08:08:51+00:00","description":"Complete Canggu to Ubud travel guide covering distance, routes, travel time, transport options, costs, and best tips for smooth journey","breadcrumb":{"@id":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/#primaryimage","url":"https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png","contentUrl":"https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png","width":1376,"height":768,"caption":"Canggu to Ubud"},{"@type":"BreadcrumbList","@id":"https:\/\/satusatu.com\/inspiration\/canggu-to-ubud\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/satusatu.com\/inspiration\/"},{"@type":"ListItem","position":2,"name":"Canggu to Ubud: Everything You Need to Know Before You Go"}]},{"@type":"WebSite","@id":"https:\/\/satusatu.com\/inspiration\/#website","url":"https:\/\/satusatu.com\/inspiration\/","name":"SatuSatu","description":"","publisher":{"@id":"https:\/\/satusatu.com\/inspiration\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/satusatu.com\/inspiration\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/satusatu.com\/inspiration\/#organization","name":"SatuSatu","url":"https:\/\/satusatu.com\/inspiration\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/satusatu.com\/inspiration\/#\/schema\/logo\/image\/","url":"https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/01\/Variant1024.png","contentUrl":"https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/01\/Variant1024.png","width":1024,"height":1024,"caption":"SatuSatu"},"image":{"@id":"https:\/\/satusatu.com\/inspiration\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.instagram.com\/satusatucom\/"]},{"@type":"Person","@id":"https:\/\/satusatu.com\/inspiration\/#\/schema\/person\/4b773aced63910f3c4d3c4a8c82516c2","name":"Fatiya Aulia Muthmainnah","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f1bd35afe4fc3154c4ed985ce96b5941e11cd1aca25cc24a42ff9c58d10c640e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f1bd35afe4fc3154c4ed985ce96b5941e11cd1aca25cc24a42ff9c58d10c640e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f1bd35afe4fc3154c4ed985ce96b5941e11cd1aca25cc24a42ff9c58d10c640e?s=96&d=mm&r=g","caption":"Fatiya Aulia Muthmainnah"},"url":"https:\/\/satusatu.com\/inspiration\/author\/ext-fatiya-aulia\/"}]}},"uagb_featured_image_src":{"full":["https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png",1376,768,false],"thumbnail":["https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png",150,84,false],"medium":["https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png",300,167,false],"medium_large":["https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png",768,429,false],"large":["https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png",1024,572,false],"1536x1536":["https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png",1376,768,false],"2048x2048":["https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png",1376,768,false],"neve-blog":["https:\/\/satusatu.com\/inspiration\/wp-content\/uploads\/2026\/05\/Canggu-to-Ubud.png",930,519,false]},"uagb_author_info":{"display_name":"Fatiya Aulia Muthmainnah","author_link":"https:\/\/satusatu.com\/inspiration\/author\/ext-fatiya-aulia\/"},"uagb_comment_info":0,"uagb_excerpt":"Canggu and Ubud sit at opposite ends of Bali&#8217;s personality spectrum. Canggu is beach clubs, surf breaks, and brunches that arrive with matcha art on top. Ubud is rice terraces, temple ceremonies, and afternoons watching clouds settle over the Campuhan Ridge.&nbsp; The distance between them is roughly 28 to 35 kilometers by road, which sounds&hellip;&nbsp;","_links":{"self":[{"href":"https:\/\/satusatu.com\/inspiration\/wp-json\/wp\/v2\/posts\/3239","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/satusatu.com\/inspiration\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/satusatu.com\/inspiration\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/satusatu.com\/inspiration\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/satusatu.com\/inspiration\/wp-json\/wp\/v2\/comments?post=3239"}],"version-history":[{"count":1,"href":"https:\/\/satusatu.com\/inspiration\/wp-json\/wp\/v2\/posts\/3239\/revisions"}],"predecessor-version":[{"id":3242,"href":"https:\/\/satusatu.com\/inspiration\/wp-json\/wp\/v2\/posts\/3239\/revisions\/3242"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/satusatu.com\/inspiration\/wp-json\/wp\/v2\/media\/3240"}],"wp:attachment":[{"href":"https:\/\/satusatu.com\/inspiration\/wp-json\/wp\/v2\/media?parent=3239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/satusatu.com\/inspiration\/wp-json\/wp\/v2\/categories?post=3239"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/satusatu.com\/inspiration\/wp-json\/wp\/v2\/tags?post=3239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}