{"id":155475,"date":"2021-11-30T15:30:21","date_gmt":"2021-11-30T14:30:21","guid":{"rendered":"https:\/\/bikefinder.com\/ny-shop\/"},"modified":"2026-10-11T19:54:38","modified_gmt":"2026-10-11T17:54:38","slug":"buy","status":"publish","type":"page","link":"https:\/\/bikefinder.com\/da\/buy\/","title":{"rendered":"K\u00f8b en cykelsporingsenhed"},"content":{"rendered":"\n<script>\/* Run before the page content can paint; keep native products available on failure. *\/\n(function () {\n    const page = document.documentElement;\n    page.classList.add('bf-buy-loading');\n    window.setTimeout(function () {\n        const root = document.querySelector('.bf-buy');\n        if (root && !root.classList.contains('is-ready')) {\n            page.classList.remove('bf-buy-loading');\n            root.querySelector('.bf-buy-initial-error').hidden = false;\n        }\n    }, 25000);\n})();\n<\/script>\n<style>.bf-buy {\n    --ink: #182b38;\n    --muted: #60707c;\n    --line: #dce3e8;\n    --blue: #0075b9;\n    --wash: #eff7fc;\n    --paper: #f8f9fb;\n    --radius: 14px;\n    background: var(--paper);\n    color: var(--ink);\n    font:\n        14px\/1.6 'Open Sans',\n        Arial,\n        sans-serif;\n    padding: 52px max(24px, calc((100% - 1240px) \/ 2)) 64px;\n    isolation: isolate;\n}\n.bf-buy [hidden] {\n    display: none !important;\n}\n.bf-buy .bf-buy-app {\n    display: none;\n    max-width: 1240px;\n    margin: auto;\n}\n.bf-buy.is-ready .bf-buy-app {\n    display: block;\n}\n.bf-buy.is-ready .bf-buy-fallback {\n    display: none;\n}\n.bf-buy-loading .bf-buy .bf-buy-fallback {\n    display: none;\n}\n.bf-buy .bf-buy-loading-message {\n    display: none;\n    max-width: 1240px;\n    min-height: min(600px, 70vh);\n    margin: auto;\n    color: var(--muted);\n}\n.bf-buy-loading .bf-buy .bf-buy-loading-message {\n    display: block;\n}\n.bf-buy .bf-buy-fallback {\n    max-width: 1240px;\n    margin: auto;\n}\n.bf-buy .bf-source-trackers li.product img {\n    width: 75px;\n    max-width: 75px;\n    height: auto;\n}\n.bf-buy .bf-buy-native-plan {\n    border: 1px solid #dce3e8;\n    border-radius: 10px;\n    background: #fff;\n    padding: 18px;\n    margin: 10px 0;\n}\n.bf-buy .bf-buy-alert,\n.bf-buy .bf-buy-initial-error {\n    max-width: 1240px;\n    margin: 0 auto 20px;\n    font-size: 13px;\n    color: #a73232;\n}\n.bf-buy .bf-buy-cart-note {\n    margin-top: 16px;\n    padding: 12px 14px;\n    border-radius: 9px;\n    background: #eaf1f5;\n    font-size: 11px;\n}\n.bf-buy .bf-buy-cart-note a {\n    color: #0075b9;\n}\n.bf-buy .bf-buy-cart-note button {\n    background: none;\n    padding: 0;\n    color: #0075b9;\n    text-decoration: underline;\n    margin-top: 5px;\n    font-size: 11px;\n}\n.bf-buy .billing-choices .billed * {\n    font: inherit;\n    color: inherit;\n}\n.bf-buy .billing-choices .billed p {\n    display: inline;\n}\n.bf-buy .primary:disabled {\n    opacity: 0.6;\n    cursor: wait;\n}\n.bf-buy .primary[aria-disabled='true'] {\n    opacity: 0.6;\n    cursor: not-allowed;\n}\n.bf-buy .bf-buy-busy {\n    font-size: 11px;\n    color: #60707c;\n    text-align: center;\n    margin-top: 10px;\n}\n@media (max-width: 760px) {\n    .bf-buy {\n        padding: 30px 20px 120px;\n    }\n    .bf-buy .bf-buy-app {\n        margin: 0;\n    }\n    .bf-buy .mobile-checkout {\n        font:\n            14px\/1.6 'Open Sans',\n            Arial,\n            sans-serif;\n    }\n}\n\n.bf-buy {\n    --ink: #182b38;\n    --muted: #60707c;\n    --line: #dce3e8;\n    --blue: #0075b9;\n    --wash: #eff7fc;\n    --paper: #f8f9fb;\n    --radius: 14px;\n}\n.bf-buy * {\n    box-sizing: border-box;\n}\n.bf-buy h1,\n.bf-buy h2,\n.bf-buy h3,\n.bf-buy strong,\n.bf-buy button,\n.bf-buy .price {\n    font-family: Montserrat, Arial, sans-serif;\n    font-weight: 600;\n}\n.bf-buy h1,\n.bf-buy h2,\n.bf-buy h3,\n.bf-buy p {\n    margin: 0;\n}\n.bf-buy button,\n.bf-buy input,\n.bf-buy select {\n    font: inherit;\n    color: inherit;\n}\n.bf-buy button,\n.bf-buy a,\n.bf-buy label,\n.bf-buy select {\n    -webkit-tap-highlight-color: transparent;\n}\n.bf-buy button,\n.bf-buy select,\n.bf-buy summary {\n    cursor: pointer;\n}\n.bf-buy a {\n    color: inherit;\n    text-underline-offset: 4px;\n}\n.bf-buy button {\n    border: 0;\n}\n.bf-buy :focus-visible {\n    outline: 3px solid #0075b9;\n    outline-offset: 4px;\n}\n.bf-buy [hidden] {\n    display: none !important;\n}\n.bf-buy svg {\n    display: block;\n    width: 22px;\n    height: 22px;\n    fill: none;\n    stroke: currentColor;\n    stroke-width: 1.6;\n    stroke-linecap: round;\n    stroke-linejoin: round;\n    flex-shrink: 0;\n}\n.bf-buy .svg-library,\n.bf-buy .sr-only {\n    position: absolute;\n    width: 1px;\n    height: 1px;\n    padding: 0;\n    overflow: hidden;\n    clip-path: inset(50%);\n    white-space: nowrap;\n}\n.bf-buy .buy-layout {\n    display: grid;\n    grid-template-columns: minmax(0, 1.12fr) minmax(0, 1fr);\n    gap: clamp(40px, 6vw, 88px);\n    align-items: start;\n}\n.bf-buy .eyebrow {\n    text-transform: uppercase;\n    letter-spacing: 0.16em;\n    font-size: 10px;\n    color: var(--blue);\n    margin-bottom: 17px;\n    font-weight: 600;\n}\n.bf-buy h1 {\n    font-size: clamp(40px, 4.4vw, 61px);\n    letter-spacing: -2.6px;\n    line-height: 1.08;\n    margin-bottom: 20px;\n}\n.bf-buy .intro {\n    color: var(--muted);\n    max-width: 415px;\n    font-size: 15px;\n    line-height: 1.8;\n}\n.bf-buy .product-stage {\n    position: relative;\n    margin-top: 28px;\n    height: 460px;\n    overflow: hidden;\n    border-radius: 18px;\n    background: #f0f1f2;\n    isolation: isolate;\n}\n.bf-buy .stage-top {\n    position: absolute;\n    z-index: 2;\n    top: 22px;\n    left: 24px;\n    display: grid;\n    gap: 3px;\n}\n.bf-buy .stage-top strong {\n    font-size: 14px;\n}\n.bf-buy .stage-top small {\n    color: var(--muted);\n    font-size: 10px;\n}\n.bf-buy .product-stage::before {\n    content: '';\n    position: absolute;\n    width: 330px;\n    height: 330px;\n    border: 1px solid #d6dde2;\n    border-radius: 50%;\n    top: 52px;\n    left: calc(50% - 165px);\n}\n.bf-buy .product-stage::after {\n    content: '';\n    position: absolute;\n    width: 235px;\n    height: 235px;\n    border: 1px solid #dce2e6;\n    border-radius: 50%;\n    top: 100px;\n    left: calc(50% - 118px);\n    z-index: -1;\n}\n.bf-buy .product-photo {\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n    mix-blend-mode: multiply;\n    transition: opacity 0.2s;\n}\n.bf-buy .product-stage[data-model='g1'] .product-photo,\n.bf-buy .product-stage[data-model='fahrradfinden'] .product-photo {\n    object-fit: contain;\n    padding: 55px 15px 45px;\n}\n.bf-buy .stage-caption {\n    position: absolute;\n    z-index: 2;\n    bottom: 20px;\n    left: 24px;\n    right: 24px;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 12px;\n    font-size: 10px;\n    color: var(--muted);\n}\n.bf-buy .stage-tag {\n    border: 1px solid #ccd8df;\n    border-radius: 20px;\n    padding: 5px 10px;\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    color: var(--ink);\n    background: #f5f6f7;\n}\n.bf-buy .stage-tag svg {\n    width: 13px;\n    height: 13px;\n    color: var(--blue);\n}\n.bf-buy .feature-strip {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 12px;\n    padding: 22px 0 0;\n}\n.bf-buy .feature {\n    display: flex;\n    align-items: center;\n    gap: 9px;\n    font-size: 11px;\n}\n.bf-buy .feature svg {\n    color: var(--blue);\n    width: 20px;\n    height: 20px;\n}\n.bf-buy .product-details {\n    margin-top: 25px;\n    border-top: 1px solid var(--line);\n    font-size: 12px;\n}\n.bf-buy details {\n    border-bottom: 1px solid var(--line);\n}\n.bf-buy summary {\n    padding: 15px 0;\n    list-style: none;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    font-weight: 600;\n}\n.bf-buy summary::-webkit-details-marker {\n    display: none;\n}\n.bf-buy summary::after {\n    content: '+';\n    font-size: 19px;\n    font-weight: 400;\n}\n.bf-buy details[open] summary::after {\n    content: '\u2212';\n}\n.bf-buy details p {\n    padding: 0 0 18px;\n    color: var(--muted);\n}\n.bf-buy .configurator {\n    padding-top: 2px;\n}\n.bf-buy .config-title {\n    font-size: 27px;\n    letter-spacing: -0.7px;\n    margin-bottom: 5px;\n}\n.bf-buy .config-subtitle {\n    font-size: 12px;\n    color: var(--muted);\n}\n.bf-buy .hardware-row {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    margin: 22px 0 10px;\n    padding-bottom: 16px;\n    border-bottom: 1px solid var(--line);\n    gap: 12px;\n}\n.bf-buy .hardware-info {\n    display: flex;\n    align-items: center;\n    gap: 11px;\n}\n.bf-buy .hardware-icon {\n    display: grid;\n    place-items: center;\n    width: 36px;\n    height: 36px;\n    background: #eaf1f5;\n    border-radius: 9px;\n    color: var(--blue);\n}\n.bf-buy .hardware-info strong {\n    font-size: 13px;\n}\n.bf-buy .hardware-info small {\n    display: block;\n    font-size: 10px;\n    color: var(--muted);\n}\n.bf-buy .hardware-price {\n    font-size: 15px;\n    white-space: nowrap;\n}\n.bf-buy .owner-toggle {\n    width: fit-content;\n    display: flex;\n    align-items: center;\n    gap: 7px;\n    color: var(--muted);\n    font-size: 11px;\n    cursor: pointer;\n}\n.bf-buy input[type='checkbox'] {\n    accent-color: var(--blue);\n    width: 15px;\n    height: 15px;\n    margin: 0;\n    flex-shrink: 0;\n}\n.bf-buy fieldset {\n    border: 0;\n    padding: 0;\n    margin: 24px 0 0;\n    min-width: 0;\n}\n.bf-buy legend {\n    width: 100%;\n    padding: 0;\n    font-family: Montserrat, sans-serif;\n    font-weight: 600;\n    font-size: 13px;\n    margin-bottom: 12px;\n    display: flex;\n    align-items: center;\n    gap: 9px;\n}\n.bf-buy .step {\n    color: var(--muted);\n    width: 19px;\n    height: 19px;\n    display: inline-grid;\n    place-items: center;\n    font-size: 10px;\n    border: 1px solid #c9d3da;\n    border-radius: 50%;\n}\n.bf-buy .choices {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 10px;\n}\n.bf-buy .choice {\n    position: relative;\n    cursor: pointer;\n}\n.bf-buy .choice input {\n    position: absolute;\n    inset: 0;\n    width: 100%;\n    height: 100%;\n    margin: 0;\n    opacity: 0;\n    z-index: 1;\n    cursor: pointer;\n}\n.bf-buy .choice-face {\n    height: 100%;\n    border: 1px solid #cdd8e0;\n    border-radius: 10px;\n    padding: 15px 13px;\n    display: grid;\n    grid-template-columns: 1fr 15px;\n    align-items: start;\n    column-gap: 5px;\n    background: #fff;\n    transition:\n        border-color 0.15s,\n        background 0.15s;\n}\n.bf-buy .choice:hover .choice-face {\n    border-color: var(--blue);\n}\n.bf-buy .choice input:checked + .choice-face {\n    border: 2px solid var(--blue);\n    padding: 14px 12px;\n    background: var(--wash);\n}\n.bf-buy .choice input:focus-visible + .choice-face {\n    outline: 3px solid var(--blue);\n    outline-offset: 3px;\n}\n.bf-buy .choice input:disabled {\n    cursor: not-allowed;\n}\n.bf-buy .choice input:disabled + .choice-face {\n    opacity: 0.55;\n    background: #edf0f2;\n}\n.bf-buy .choice-face strong {\n    display: block;\n    font-size: 12px;\n}\n.bf-buy .choice-face small {\n    font-size: 10px;\n    color: var(--muted);\n    display: block;\n    margin-top: 5px;\n    line-height: 1.5;\n}\n.bf-buy .radio-mark {\n    border: 1px solid #b9c7d0;\n    border-radius: 50%;\n    width: 15px;\n    height: 15px;\n    margin-top: 2px;\n}\n.bf-buy input:checked + .choice-face .radio-mark {\n    border: 4px solid var(--blue);\n    background: #fff;\n}\n.bf-buy .insurance-box {\n    margin-top: 12px;\n    padding: 16px;\n    border: 1px solid #d5e4ed;\n    background: #f0f6fa;\n    border-radius: 10px;\n}\n.bf-buy .insurance-box > label {\n    display: block;\n    font-size: 11px;\n    margin-bottom: 7px;\n}\n.bf-buy .value-select {\n    width: 100%;\n    padding: 10px 12px;\n    border: 1px solid #bdced9;\n    border-radius: 7px;\n    background: #fff;\n    font-size: 12px;\n}\n.bf-buy .eligibility {\n    color: var(--muted);\n    font-size: 10px;\n    line-height: 1.7;\n    margin-top: 10px;\n}\n.bf-buy .policy-links {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 14px;\n    margin-top: 7px;\n    font-size: 10px;\n    color: var(--blue);\n}\n.bf-buy .residence-check {\n    display: flex;\n    align-items: flex-start;\n    gap: 8px;\n    margin-top: 13px;\n    font-size: 11px;\n    cursor: pointer;\n}\n.bf-buy .residence-check input {\n    margin-top: 3px;\n}\n.bf-buy .market-note {\n    font-size: 10px;\n    line-height: 1.6;\n    color: var(--muted);\n    margin-top: 9px;\n}\n.bf-buy .billing-choices {\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n}\n.bf-buy .billing-choices .choice-face {\n    display: block;\n    padding: 14px 10px;\n    position: relative;\n}\n.bf-buy .billing-choices input:checked + .choice-face {\n    padding: 13px 9px;\n}\n.bf-buy .billing-choices .choice-face strong {\n    font-size: 11px;\n    margin-bottom: 9px;\n}\n.bf-buy .monthly-price {\n    font-family: Montserrat, sans-serif;\n    font-weight: 600;\n    font-size: 20px;\n    white-space: nowrap;\n    letter-spacing: -0.6px;\n}\n.bf-buy .per-month {\n    color: var(--muted);\n    font-size: 10px;\n    margin-left: 2px;\n}\n.bf-buy .choice-face .billed {\n    font-size: 9px;\n    margin-top: 7px;\n}\n.bf-buy .saving {\n    display: inline-block;\n    margin-top: 9px;\n    padding: 2px 6px;\n    border-radius: 4px;\n    background: #e7eee9;\n    color: #315841;\n    font-size: 9px;\n}\n.bf-buy .billing-note {\n    color: var(--muted);\n    font-size: 10px;\n    margin-top: 10px;\n}\n.bf-buy .accessory {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 12px;\n    border-top: 1px solid var(--line);\n    margin-top: 22px;\n    padding-top: 18px;\n    font-size: 11px;\n    cursor: pointer;\n}\n.bf-buy .accessory-copy {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n}\n.bf-buy .accessory small {\n    display: block;\n    font-size: 10px;\n    color: var(--muted);\n}\n.bf-buy .accessory .price {\n    white-space: nowrap;\n    font-size: 11px;\n}\n.bf-buy .order-summary {\n    background: #fff;\n    border: 1px solid var(--line);\n    border-radius: var(--radius);\n    margin-top: 22px;\n    padding: 19px 20px;\n}\n.bf-buy .summary-line {\n    display: flex;\n    justify-content: space-between;\n    gap: 12px;\n    color: var(--muted);\n    font-size: 11px;\n}\n.bf-buy .summary-line + .summary-line {\n    margin-top: 6px;\n}\n.bf-buy .summary-line span:last-child {\n    white-space: nowrap;\n}\n.bf-buy .today-line {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 12px;\n    padding-top: 13px;\n    margin-top: 13px;\n    border-top: 1px solid var(--line);\n}\n.bf-buy .today-line strong {\n    font-size: 12px;\n}\n.bf-buy .today-line .price {\n    font-size: 24px;\n    letter-spacing: -0.5px;\n}\n.bf-buy .renewal {\n    margin-top: 5px;\n    color: var(--muted);\n    font-size: 10px;\n    text-align: right;\n}\n.bf-buy .shipping-note {\n    color: var(--muted);\n    font-size: 9px;\n    margin-top: 9px;\n    text-align: right;\n}\n.bf-buy .primary {\n    width: 100%;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 12px;\n    background: var(--blue);\n    color: #fff;\n    border-radius: 9px;\n    padding: 16px 20px;\n    font-family: Montserrat, sans-serif;\n    font-weight: 600;\n    font-size: 13px;\n    transition: background 0.15s;\n}\n.bf-buy .primary:hover {\n    background: #005e95;\n}\n.bf-buy .primary svg {\n    width: 18px;\n    height: 18px;\n}\n.bf-buy .desktop-cta {\n    margin-top: 15px;\n}\n.bf-buy .cta-footnote {\n    text-align: center;\n    color: var(--muted);\n    font-size: 9px;\n    margin-top: 9px;\n}\n.bf-buy .inline-error {\n    color: #a73232;\n    font-size: 11px;\n    margin-top: 12px;\n}\n.bf-buy .mobile-checkout {\n    display: none;\n}\n.bf-buy .how-section {\n    border-top: 1px solid var(--line);\n    padding-top: 50px;\n    margin-top: 58px;\n}\n.bf-buy .section-intro {\n    display: flex;\n    align-items: baseline;\n    justify-content: space-between;\n    gap: 20px;\n    margin-bottom: 25px;\n}\n.bf-buy .section-intro h2 {\n    font-size: 25px;\n    letter-spacing: -0.6px;\n}\n.bf-buy .section-intro p {\n    color: var(--muted);\n    font-size: 12px;\n}\n.bf-buy .how-grid {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 28px;\n}\n.bf-buy .how-card {\n    padding: 24px;\n    background: #fff;\n    border: 1px solid var(--line);\n    border-radius: var(--radius);\n}\n.bf-buy .how-number {\n    color: var(--blue);\n    font-size: 10px;\n    letter-spacing: 0.1em;\n}\n.bf-buy .how-card h3 {\n    font-size: 15px;\n    margin: 11px 0 9px;\n}\n.bf-buy .how-card p {\n    color: var(--muted);\n    font-size: 12px;\n}\n.bf-buy .faq-section {\n    margin: 50px auto 0;\n    max-width: 720px;\n}\n.bf-buy .faq-section h2 {\n    font-size: 25px;\n    letter-spacing: -0.6px;\n    margin-bottom: 18px;\n}\n.bf-buy .faq-section details {\n    font-size: 12px;\n}\n@media (min-width: 1021px) {\n    .bf-buy .product-column {\n        position: sticky;\n        top: 28px;\n    }\n}\n@media (max-width: 1150px) {\n    .bf-buy .buy-layout {\n        gap: 38px;\n    }\n    .bf-buy .monthly-price {\n        font-size: 18px;\n    }\n}\n@media (max-width: 1020px) {\n    .bf-buy .buy-layout {\n        gap: 28px;\n    }\n    .bf-buy h1 {\n        font-size: 44px;\n    }\n    .bf-buy .product-stage {\n        height: 375px;\n    }\n    .bf-buy .feature-strip {\n        grid-template-columns: 1fr;\n        gap: 10px;\n    }\n    .bf-buy .config-title {\n        font-size: 23px;\n    }\n    .bf-buy .choice-face strong {\n        font-size: 11px;\n    }\n    .bf-buy .billing-choices .choice-face strong {\n        font-size: 10px;\n    }\n    .bf-buy .monthly-price {\n        font-size: 16px;\n    }\n    .bf-buy .billing-choices .choice-face {\n        padding: 12px 7px;\n    }\n    .bf-buy .billing-choices input:checked + .choice-face {\n        padding: 11px 6px;\n    }\n}\n@media (max-width: 760px) {\n    .bf-buy .buy-layout {\n        grid-template-columns: 1fr;\n        gap: 34px;\n    }\n    .bf-buy h1 {\n        font-size: clamp(39px, 10vw, 56px);\n        letter-spacing: -1.9px;\n    }\n    .bf-buy .eyebrow {\n        margin-bottom: 13px;\n        font-size: 9px;\n    }\n    .bf-buy .intro {\n        font-size: 13px;\n        max-width: 430px;\n    }\n    .bf-buy .product-stage {\n        height: 290px;\n        margin-top: 22px;\n    }\n    .bf-buy .product-stage::before {\n        width: 235px;\n        height: 235px;\n        top: 28px;\n        left: calc(50% - 118px);\n    }\n    .bf-buy .product-stage::after {\n        width: 180px;\n        height: 180px;\n        top: 55px;\n        left: calc(50% - 90px);\n    }\n    .bf-buy .stage-top {\n        top: 16px;\n        left: 18px;\n    }\n    .bf-buy .stage-top strong {\n        font-size: 12px;\n    }\n    .bf-buy .stage-caption {\n        left: 18px;\n        right: 18px;\n        bottom: 16px;\n        font-size: 9px;\n    }\n    .bf-buy .feature-strip {\n        grid-template-columns: repeat(3, 1fr);\n        gap: 8px;\n        padding-top: 18px;\n    }\n    .bf-buy .feature {\n        gap: 7px;\n        font-size: 9px;\n    }\n    .bf-buy .feature svg {\n        width: 17px;\n        height: 17px;\n    }\n    .bf-buy .product-details {\n        display: none;\n    }\n    .bf-buy .config-title {\n        font-size: 25px;\n    }\n    .bf-buy .choice-face strong {\n        font-size: 12px;\n    }\n    .bf-buy .billing-choices .choice-face {\n        padding: 14px 10px;\n    }\n    .bf-buy .billing-choices input:checked + .choice-face {\n        padding: 13px 9px;\n    }\n    .bf-buy .billing-choices .choice-face strong {\n        font-size: 11px;\n    }\n    .bf-buy .monthly-price {\n        font-size: 19px;\n    }\n    .bf-buy .desktop-cta,\n    .bf-buy .cta-footnote {\n        display: none;\n    }\n    .bf-buy .mobile-checkout {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        gap: 16px;\n        padding: 12px 20px calc(12px + env(safe-area-inset-bottom)) 56px;\n        position: fixed;\n        bottom: 0;\n        left: 0;\n        right: 0;\n        z-index: 4;\n        background: #ffffffef;\n        backdrop-filter: blur(12px);\n        border-top: 1px solid var(--line);\n    }\n    .bf-buy .mobile-total {\n        flex-shrink: 0;\n    }\n    .bf-buy .mobile-total small {\n        color: var(--muted);\n        font-size: 9px;\n        display: block;\n    }\n    .bf-buy .mobile-total strong {\n        font-size: 18px;\n    }\n    .bf-buy .mobile-checkout .primary {\n        width: auto;\n        flex: 1;\n        max-width: 245px;\n        padding: 14px 16px;\n        font-size: 11px;\n    }\n    .bf-buy .how-section {\n        margin-top: 38px;\n        padding-top: 32px;\n    }\n    .bf-buy .section-intro {\n        display: block;\n    }\n    .bf-buy .section-intro p {\n        margin-top: 7px;\n    }\n    .bf-buy .how-grid {\n        grid-template-columns: 1fr;\n        gap: 12px;\n    }\n    .bf-buy .how-card {\n        padding: 20px;\n    }\n    .bf-buy .how-card h3 {\n        margin-top: 7px;\n    }\n    .bf-buy .faq-section {\n        margin-top: 35px;\n    }\n}\n@media (max-width: 360px) {\n    .bf-buy .monthly-price {\n        font-size: 17px;\n    }\n    .bf-buy .billing-choices .choice-face {\n        padding: 12px 7px;\n    }\n    .bf-buy .billing-choices input:checked + .choice-face {\n        padding: 11px 6px;\n    }\n    .bf-buy .feature {\n        font-size: 8px;\n    }\n    .bf-buy .stage-caption {\n        font-size: 8px;\n        gap: 8px;\n    }\n}\n@media (prefers-reduced-motion: reduce) {\n    .bf-buy * {\n        transition: none !important;\n    }\n}\n\n\/* Approved compact builder, scoped to page content. *\/\n\/* Page-content study. Existing prototype header and footer are retained. *\/\n.bf-buy .config-title {\n    font-size: 28px;\n    line-height: 1.25;\n}\n.bf-buy .purchase-mode {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 8px;\n    margin: 20px 0 0;\n}\n.bf-buy .purchase-mode legend {\n    font:\n        12px\/1.5 'Open Sans',\n        sans-serif;\n    color: var(--muted);\n    margin-bottom: 8px;\n}\n.bf-buy .mode-choice {\n    position: relative;\n    cursor: pointer;\n}\n.bf-buy .mode-choice input {\n    position: absolute;\n    inset: 0;\n    opacity: 0;\n    width: 100%;\n    height: 100%;\n    margin: 0;\n    cursor: pointer;\n}\n.bf-buy .mode-choice span {\n    display: block;\n    padding: 12px 10px;\n    border: 1px solid var(--line);\n    border-radius: 8px;\n    background: #fff;\n    font-size: 12px;\n    text-align: center;\n}\n.bf-buy .mode-choice input:checked + span {\n    border-color: var(--blue);\n    background: var(--wash);\n    color: var(--blue);\n    box-shadow: inset 0 0 0 1px var(--blue);\n}\n.bf-buy .mode-choice input:focus-visible + span {\n    outline: 3px solid var(--blue);\n    outline-offset: 3px;\n}\n.bf-buy .owner-note {\n    margin-top: 14px;\n    color: var(--muted);\n    font-size: 12px;\n}\n.bf-buy .hardware-row {\n    margin-top: 18px;\n}\n.bf-buy .choices > .choice-face {\n    min-width: 0;\n}\n.bf-buy .choice-face strong {\n    font-size: 13px;\n}\n.bf-buy .choice-face small {\n    font-size: 12px;\n    line-height: 1.5;\n}\n.bf-buy .choice-face {\n    padding: 15px 12px;\n}\n.bf-buy .choice input:checked + .choice-face {\n    padding: 14px 11px;\n}\n.bf-buy .choices.tracking-only {\n    grid-template-columns: 1fr;\n}\n.bf-buy .choices.tracking-only .choice:last-child {\n    display: none;\n}\n.bf-buy .market-note {\n    font-size: 12px;\n}\n.bf-buy .billing-choices .choice-face {\n    display: flex;\n    flex-direction: column;\n    gap: 8px;\n    padding: 16px 12px;\n}\n.bf-buy .billing-choices input:checked + .choice-face {\n    padding: 15px 11px;\n}\n.bf-buy .billing-choices .choice-face strong {\n    font-size: 12px;\n    margin: 0;\n}\n.bf-buy .charge-price {\n    font:\n        600 23px\/1.25 Montserrat,\n        sans-serif;\n    letter-spacing: -0.6px;\n    white-space: nowrap;\n}\n.bf-buy .billing-choices .charge-frequency {\n    font-size: 11px;\n    color: var(--muted);\n}\n.bf-buy .billing-choices .equivalent {\n    font-size: 12px;\n    color: var(--muted);\n}\n.bf-buy .billing-choices .saving {\n    align-self: flex-start;\n    margin: 0;\n    font-size: 10px;\n}\n.bf-buy .billing-note,\n.bf-buy .value-hint {\n    font-size: 12px;\n    line-height: 1.6;\n}\n.bf-buy .value-hint {\n    margin: 8px 0 12px;\n    color: var(--muted);\n}\n.bf-buy .value-select {\n    font-size: 14px;\n    min-height: 46px;\n}\n.bf-buy .eligibility,\n.bf-buy .policy-links,\n.bf-buy .residence-check {\n    font-size: 12px;\n}\n.bf-buy .residence-check {\n    padding: 10px;\n    background: #fff;\n    border: 1px solid var(--line);\n    border-radius: 7px;\n}\n.bf-buy .accessory {\n    font-size: 12px;\n    min-height: 56px;\n}\n.bf-buy .accessory small {\n    font-size: 11px;\n}\n.bf-buy .summary-line {\n    font-size: 12px;\n}\n.bf-buy .renewal {\n    font-size: 12px;\n    text-align: left;\n    margin-top: 12px;\n}\n.bf-buy .shipping-note {\n    font-size: 11px;\n    text-align: left;\n}\n.bf-buy .today-line strong {\n    font-size: 14px;\n}\n.bf-buy .today-line .price {\n    font-size: 26px;\n}\n.bf-buy .fit-range {\n    color: var(--blue);\n    font-size: 12px;\n    white-space: nowrap;\n    margin-left: auto;\n    margin-right: 14px;\n}\n.bf-buy .product-details summary {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n}\n.bf-buy .product-details summary::after {\n    flex-shrink: 0;\n}\n.bf-buy .inline-error {\n    font-size: 12px;\n}\n@media (max-width: 760px) {\n    .bf-buy {\n        margin-top: 24px;\n    }\n    .bf-buy .buy-layout {\n        gap: 24px;\n    }\n    .bf-buy h1 {\n        font-size: 36px;\n        line-height: 1.14;\n        letter-spacing: -1.3px;\n    }\n    .bf-buy .eyebrow {\n        margin-bottom: 10px;\n    }\n    .bf-buy .intro {\n        margin-top: 12px;\n        font-size: 12px;\n        line-height: 1.6;\n    }\n    .bf-buy .product-stage {\n        height: 185px;\n        margin-top: 18px;\n    }\n    .bf-buy .product-photo {\n        display: block;\n        width: auto;\n        max-width: 100%;\n        margin: 0 auto;\n        object-fit: contain;\n        object-position: center;\n        mask-image: linear-gradient(90deg, transparent, #000 20%, #000 80%, transparent);\n    }\n    .bf-buy .product-stage[data-model='g1'] .product-photo,\n    .bf-buy .product-stage[data-model='fahrradfinden'] .product-photo {\n        padding: 14px 0;\n    }\n    .bf-buy .product-stage::before {\n        width: 160px;\n        height: 160px;\n        top: 13px;\n        left: calc(50% - 80px);\n    }\n    .bf-buy .product-stage::after {\n        width: 120px;\n        height: 120px;\n        top: 33px;\n        left: calc(50% - 60px);\n    }\n    .bf-buy .stage-top {\n        top: 12px;\n        left: 14px;\n    }\n    .bf-buy .stage-top strong {\n        font-size: 11px;\n    }\n    .bf-buy .stage-caption {\n        left: 14px;\n        right: 14px;\n        bottom: 12px;\n        font-size: 8px;\n    }\n    .bf-buy .stage-tag {\n        padding: 4px 7px;\n    }\n    .bf-buy .feature-strip {\n        padding-top: 14px;\n    }\n    .bf-buy .product-details {\n        display: block;\n        margin-top: 10px;\n    }\n    .bf-buy .product-details summary {\n        padding: 10px 0;\n        font-size: 12px;\n    }\n    .bf-buy .product-details p {\n        font-size: 12px;\n    }\n    .bf-buy .config-title {\n        font-size: 24px;\n    }\n    .bf-buy .choices {\n        gap: 8px;\n    }\n    .bf-buy .choice-face {\n        grid-template-columns: 1fr;\n        gap: 8px;\n        position: relative;\n    }\n    .bf-buy .choice-face .radio-mark {\n        position: absolute;\n        right: 10px;\n        top: 12px;\n    }\n    .bf-buy .choice-face strong {\n        padding-right: 17px;\n        font-size: 12px;\n    }\n    .bf-buy .choice-face small {\n        font-size: 12px;\n    }\n    .bf-buy .billing-choices {\n        grid-template-columns: 1fr;\n    }\n    .bf-buy .billing-choices .choice-face {\n        display: grid;\n        grid-template-columns: minmax(0, 1fr) auto;\n        column-gap: 12px;\n        row-gap: 3px;\n        align-items: center;\n        padding: 13px 14px;\n    }\n    .bf-buy .billing-choices input:checked + .choice-face {\n        padding: 12px 13px;\n    }\n    .bf-buy .billing-choices .choice-face strong {\n        font-size: 13px;\n        padding-right: 0;\n    }\n    .bf-buy .charge-price {\n        font-size: 23px;\n        grid-column: 2;\n        grid-row: 1 \/ span 2;\n        text-align: right;\n    }\n    .bf-buy .billing-choices .charge-frequency {\n        grid-column: 1;\n        grid-row: 2;\n    }\n    .bf-buy .billing-choices .equivalent {\n        grid-column: 1;\n        grid-row: 3;\n        font-size: 11px;\n    }\n    .bf-buy .billing-choices .saving {\n        grid-column: 2;\n        grid-row: 3;\n        justify-self: end;\n    }\n    .bf-buy .desktop-cta,\n    .bf-buy .cta-footnote {\n        display: flex;\n    }\n    .bf-buy .cta-footnote {\n        justify-content: center;\n        font-size: 11px;\n    }\n    .bf-buy .order-summary {\n        padding: 18px 16px;\n    }\n}\n@media (max-width: 360px) {\n    .bf-buy .stage-caption > span:last-child {\n        display: none;\n    }\n    .bf-buy .mode-choice span {\n        font-size: 11px;\n        padding: 12px 6px;\n    }\n    .bf-buy .charge-price {\n        font-size: 21px;\n    }\n}\n\n\/* Page-content sketch; original prototype navigation and footer are retained. *\/\n.bf-buy .product-column {\n    position: static;\n}\n.bf-buy .gallery-stage {\n    height: 550px;\n    overflow: hidden;\n    background: #eff0f1;\n    border-radius: 5px;\n}\n.bf-buy .gallery-stage img,\n.bf-buy .gallery-thumbnail img {\n    display: block;\n    width: 100%;\n    height: 100%;\n    object-fit: contain;\n    transform: translate(var(--pan-x, 0), var(--pan-y, 0)) scale(var(--zoom, 1));\n}\n.bf-buy .gallery-name {\n    margin: 16px 0 12px;\n    font-size: 14px;\n}\n.bf-buy .gallery-thumbnails {\n    display: flex;\n    gap: 12px;\n}\n.bf-buy .gallery-thumbnail {\n    width: 86px;\n    aspect-ratio: 1;\n    padding: 0;\n    border: 1px solid var(--line);\n    background: #eff0f1;\n    border-radius: 5px;\n    overflow: hidden;\n    cursor: pointer;\n}\n.bf-buy .gallery-thumbnail[aria-pressed='true'] {\n    border: 2px solid var(--blue);\n}\n.bf-buy .product-details {\n    margin-top: 18px;\n}\n.bf-buy .config-title {\n    font-size: 28px;\n    letter-spacing: -0.8px;\n    margin: 0;\n}\n.bf-buy .config-subtitle {\n    margin-top: 8px;\n}\n.bf-buy .setup-builder {\n    margin-top: 24px;\n}\n.bf-buy .section-label {\n    font:\n        600 13px\/1.5 Montserrat,\n        sans-serif;\n    margin-bottom: 12px;\n}\n.bf-buy .subscription-settings {\n    margin-top: 24px;\n}\n.bf-buy .plan-type {\n    font-size: 12px;\n    color: var(--muted);\n    margin-top: 12px;\n}\n.bf-buy fieldset {\n    margin: 0;\n}\n.bf-buy .billing-fieldset {\n    margin-top: 24px;\n}\n.bf-buy .hardware-row {\n    margin-top: 0;\n}\n.bf-buy .hardware-icon {\n    flex-shrink: 0;\n}\n.bf-buy .owner-controls {\n    display: flex;\n    align-items: center;\n    flex-wrap: wrap;\n    justify-content: space-between;\n    gap: 10px 18px;\n}\n.bf-buy .purchase-link {\n    padding: 0;\n    border: 0;\n    background: transparent;\n    color: var(--blue);\n    font-size: 11px;\n    text-decoration: underline;\n    text-underline-offset: 3px;\n    cursor: pointer;\n}\n.bf-buy .protection-choices {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.bf-buy .protection-choices .choice-face {\n    height: 100%;\n    min-height: 90px;\n    border-radius: 10px;\n}\n.bf-buy .insurance-settings {\n    margin-top: 20px;\n}\n.bf-buy .tracking-requirement {\n    font-size: 11px;\n    color: var(--muted);\n    line-height: 1.6;\n    margin-top: 12px;\n}\n.bf-buy .value-heading {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    flex-wrap: wrap;\n    gap: 12px;\n}\n.bf-buy .value-heading label {\n    font-size: 13px;\n    font-weight: 600;\n}\n.bf-buy #bf-bike-value-amount {\n    color: var(--ink);\n    font:\n        600 22px\/1.4 Montserrat,\n        sans-serif;\n    white-space: nowrap;\n}\n.bf-buy .bike-value-range {\n    display: block;\n    width: 100%;\n    margin: 16px 0 0;\n    height: 36px;\n    background: transparent;\n    appearance: none;\n    cursor: pointer;\n}\n.bf-buy .bike-value-range::-webkit-slider-runnable-track {\n    height: 6px;\n    border-radius: 10px;\n    background: linear-gradient(\n        to right,\n        var(--blue) var(--value-progress, 0%),\n        #d9e2e9 var(--value-progress, 0%)\n    );\n}\n.bf-buy .bike-value-range::-moz-range-track {\n    height: 6px;\n    background: #d9e2e9;\n    border-radius: 10px;\n}\n.bf-buy .bike-value-range::-moz-range-progress {\n    height: 6px;\n    background: var(--blue);\n    border-radius: 10px;\n}\n.bf-buy .bike-value-range::-webkit-slider-thumb {\n    appearance: none;\n    width: 24px;\n    height: 24px;\n    margin-top: -9px;\n    border: 3px solid #fff;\n    border-radius: 50%;\n    background: var(--blue);\n    box-shadow:\n        0 0 0 1px var(--blue),\n        0 2px 5px #17334226;\n}\n.bf-buy .bike-value-range::-moz-range-thumb {\n    width: 18px;\n    height: 18px;\n    border: 3px solid #fff;\n    border-radius: 50%;\n    background: var(--blue);\n    box-shadow: 0 0 0 1px var(--blue);\n}\n.bf-buy .value-stops {\n    position: relative;\n    height: 30px;\n    margin: 0 12px;\n    font-size: 10px;\n    color: var(--muted);\n}\n.bf-buy .value-stop {\n    position: absolute;\n    left: var(--stop-position);\n    width: 0;\n}\n.bf-buy .value-stop::before {\n    content: '';\n    display: block;\n    width: 3px;\n    height: 5px;\n    background: #b0c0cc;\n    border-radius: 2px;\n    transform: translateX(-50%);\n}\n.bf-buy .value-stop span {\n    position: absolute;\n    top: 10px;\n    white-space: nowrap;\n    transform: translateX(-50%);\n}\n.bf-buy .value-stop:first-child span {\n    transform: translateX(-12px);\n}\n.bf-buy .value-stop:last-child span {\n    transform: translateX(calc(-100% + 12px));\n}\n.bf-buy .bike-value-picker input:focus-visible {\n    outline: 3px solid var(--blue);\n    outline-offset: 4px;\n}\n.bf-buy .eligibility {\n    margin-top: 10px;\n}\n.bf-buy .eligibility a {\n    color: var(--blue);\n    text-decoration: underline;\n    text-underline-offset: 2px;\n}\n.bf-buy .eligibility a:focus-visible {\n    outline: 2px solid var(--blue);\n    outline-offset: 3px;\n}\n.bf-buy .billing-choices {\n    gap: 8px;\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n    container: billing-cards \/ inline-size;\n}\n.bf-buy .billing-choices .choice-face {\n    display: grid;\n    grid-template-columns: minmax(0, 1fr);\n    grid-template-rows: 20px 32px 32px 18px;\n    place-items: center;\n    align-content: center;\n    height: 100%;\n    min-height: 154px;\n    padding: 16px 10px;\n    border-radius: 6px;\n    gap: 7px;\n    text-align: center;\n}\n.bf-buy .billing-choices input:checked + .choice-face {\n    padding: 15px 9px;\n}\n.bf-buy .charge-price {\n    font-size: 21px;\n}\n.bf-buy .billing-choices .choice-face strong {\n    font-size: 11px;\n    grid-column: 1;\n    grid-row: 1;\n    padding: 0;\n    margin: 0;\n}\n.bf-buy .billing-choices .charge-price {\n    display: flex;\n    grid-column: 1;\n    grid-row: 2;\n    align-items: baseline;\n    align-content: center;\n    justify-content: center;\n    flex-wrap: wrap;\n    gap: 2px 3px;\n    width: 100%;\n    height: 100%;\n    line-height: 1.4;\n}\n.bf-buy .charge-number {\n    display: inline-flex;\n    align-items: baseline;\n    gap: 3px;\n    white-space: nowrap;\n}\n.bf-buy .charge-currency {\n    font-size: inherit;\n    font-weight: inherit;\n}\n.bf-buy .rate-unit {\n    font-size: 10px;\n    color: var(--muted);\n    font-weight: 400;\n    letter-spacing: 0;\n}\n.bf-buy .billing-choices .saving {\n    grid-column: 1;\n    grid-row: 4;\n    place-self: center;\n    font-size: 9px;\n    color: #315841;\n    margin: 0;\n}\n.bf-buy .billing-choices .charge-frequency {\n    grid-column: 1;\n    grid-row: 3;\n    margin: 0;\n    font-size: 10px;\n    line-height: 1.6;\n}\n.bf-buy .billing-note {\n    margin-top: 12px;\n    font-size: 10px;\n}\n.bf-buy .quote-placeholder {\n    border-top: 1px solid var(--line);\n    padding-top: 22px;\n    font-size: 12px;\n    color: var(--muted);\n}\n.bf-buy .order-summary {\n    border: 1px solid var(--line);\n    border-radius: 14px;\n    background: #fff;\n    margin-top: 24px;\n    padding: 22px 20px;\n}\n.bf-buy .today-line {\n    border-top: 1px solid var(--line);\n    padding-top: 16px;\n    margin-top: 16px;\n}\n.bf-buy .today-line .price {\n    font-size: 25px;\n}\n.bf-buy .setup-description {\n    margin-top: 10px;\n    font-size: 12px;\n    color: var(--muted);\n}\n.bf-buy .renewal,\n.bf-buy .shipping-note {\n    font-size: 11px;\n    margin-top: 8px;\n    text-align: right;\n}\n.bf-buy .order-breakdown {\n    border: 0;\n    margin-top: 10px;\n}\n.bf-buy .order-breakdown summary {\n    font-size: 11px;\n    color: var(--muted);\n    padding: 0;\n    justify-content: flex-start;\n    gap: 10px;\n    width: fit-content;\n}\n.bf-buy .order-breakdown[open] summary {\n    margin-bottom: 14px;\n}\n.bf-buy .flow-action {\n    margin-top: 22px;\n    border-radius: 6px;\n}\n.bf-buy .flow-action:disabled {\n    background: #ced7df;\n    cursor: default;\n    transform: none;\n    box-shadow: none;\n}\n.bf-buy .how-section {\n    margin-top: 70px;\n}\n.bf-buy .how-card {\n    background: transparent;\n    border: 0;\n    border-radius: 0;\n    padding: 0;\n}\n.bf-buy .how-number {\n    display: none;\n}\n.bf-buy .how-card h3 {\n    margin-top: 0;\n    font-size: 14px;\n}\n.bf-buy .how-card p {\n    font-size: 12px;\n}\n.bf-buy .faq-section {\n    margin-top: 48px;\n}\n.bf-buy .faq-section h2 {\n    font-size: 24px;\n}\n.bf-buy .faq-section summary {\n    font-size: 12px;\n}\n.bf-buy button:focus-visible {\n    outline: 3px solid var(--blue);\n    outline-offset: 4px;\n}\n@media (max-width: 760px) {\n    .bf-buy {\n        margin-top: 24px;\n    }\n    .bf-buy .buy-layout {\n        gap: 28px;\n    }\n    .bf-buy .gallery-stage {\n        height: 310px;\n    }\n    .bf-buy .gallery-name {\n        margin-top: 12px;\n    }\n    .bf-buy .gallery-thumbnails {\n        gap: 10px;\n    }\n    .bf-buy .gallery-thumbnail {\n        width: 66px;\n    }\n    .bf-buy .config-title {\n        font-size: 25px;\n    }\n    .bf-buy .billing-choices .choice-face {\n        padding: 14px 6px;\n    }\n    .bf-buy .billing-choices input:checked + .choice-face {\n        padding: 13px 5px;\n    }\n    .bf-buy .billing-choices .choice-face strong {\n        font-size: 12px;\n    }\n    .bf-buy #bf-bike-value-amount {\n        font-size: 19px;\n    }\n    .bf-buy .charge-price {\n        font-size: 18px;\n    }\n    .bf-buy .how-section {\n        margin-top: 48px;\n    }\n}\n@media (max-width: 360px) {\n    .bf-buy .gallery-stage {\n        height: 280px;\n    }\n    .bf-buy .gallery-thumbnails {\n        gap: 8px;\n    }\n    .bf-buy .gallery-thumbnail {\n        width: 60px;\n    }\n}\n@container billing-cards (max-width: 400px) {\n    .bf-buy .billing-choices .choice-face {\n        grid-template-rows: 20px 44px 32px 18px;\n        padding: 14px 6px;\n    }\n    .bf-buy .billing-choices input:checked + .choice-face {\n        padding: 13px 5px;\n    }\n    .bf-buy .charge-price {\n        font-size: 18px;\n    }\n}\n@container billing-cards (max-width: 320px) {\n    .bf-buy .charge-price {\n        font-size: 16px;\n    }\n    .bf-buy .billing-choices .choice-face strong {\n        font-size: 10px;\n    }\n}\n\n.bf-buy .sr-only {\n    position: absolute;\n    width: 1px;\n    height: 1px;\n    padding: 0;\n    margin: -1px;\n    overflow: hidden;\n    clip-path: inset(50%);\n    white-space: nowrap;\n    border: 0;\n}\n.bf-buy .hardware-icon svg {\n    width: 21px;\n    height: 21px;\n}\n.bf-buy .gallery-thumbnails {\n    flex-wrap: wrap;\n}\n.bf-buy .gallery-thumbnail {\n    flex-shrink: 0;\n}\n.bf-buy .gallery-stage img {\n    padding: 0;\n    mix-blend-mode: normal;\n}\n.bf-buy .desktop-cta {\n    display: flex;\n}\n.bf-buy .cta-footnote {\n    display: block;\n    text-align: center;\n    font-size: 10px;\n    margin-top: 10px;\n}\n.bf-buy .charge-frequency * {\n    font: inherit;\n    color: inherit;\n}\n.bf-buy .charge-frequency p {\n    display: inline;\n    margin: 0;\n}\n.bf-buy .owner-toggle input:focus-visible {\n    outline: 3px solid var(--blue);\n    outline-offset: 3px;\n}\n@media (max-width: 760px) {\n    .bf-buy {\n        padding-bottom: 64px;\n    }\n}\n<\/style>\n<main class=\"bf-buy\" data-language=\"da\"><p class=\"bf-buy-loading-message\" role=\"status\">Indl\u00e6ser dit valg\u2026<\/p><div class=\"bf-buy-app\">\n    <svg class=\"svg-library\" aria-hidden=\"true\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n        <symbol id=\"bf-i-pin\" viewBox=\"0 0 24 24\">\n            <path d=\"M20 10c0 6-8 12-8 12S4 16 4 10a8 8 0 1 1 16 0Z\"><\/path>\n            <circle cx=\"12\" cy=\"10\" r=\"2.5\"><\/circle>\n        <\/symbol>\n        <symbol id=\"bf-i-shield\" viewBox=\"0 0 24 24\">\n            <path d=\"M12 3 3.5 6v6c0 5 8.5 9 8.5 9s8.5-4 8.5-9V6Z\"><\/path>\n            <path d=\"m8 12 2.5 2.5L16 9\"><\/path>\n        <\/symbol>\n        <symbol id=\"bf-i-tool\" viewBox=\"0 0 24 24\">\n            <path d=\"M14 5a6 6 0 0 0-7.5 7.5L3 16a3 3 0 0 0 4 4l3.5-3.5A6 6 0 0 0 18 9l-4 4-3-3Z\"><\/path>\n        <\/symbol>\n        <symbol id=\"bf-i-phone\" viewBox=\"0 0 24 24\">\n            <rect x=\"6\" y=\"2\" width=\"12\" height=\"20\" rx=\"2\"><\/rect>\n            <path d=\"M10 5h4m-3 14h2\"><\/path>\n        <\/symbol>\n        <symbol id=\"bf-i-arrow\" viewBox=\"0 0 24 24\"><path d=\"M4 12h16m-6-6 6 6-6 6\"><\/path><\/symbol>\n        <symbol id=\"bf-i-chevron\" viewBox=\"0 0 24 24\"><path d=\"m6 9 6 6 6-6\"><\/path><\/symbol>\n        <symbol id=\"bf-i-close\" viewBox=\"0 0 24 24\"><path d=\"m6 6 12 12M6 18 18 6\"><\/path><\/symbol>\n        <symbol id=\"bf-i-check\" viewBox=\"0 0 24 24\">\n            <circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle>\n            <path d=\"m8 12 3 3 5-6\"><\/path>\n        <\/symbol>\n        <symbol id=\"bf-i-device\" viewBox=\"0 0 24 24\">\n            <rect x=\"8\" y=\"3\" width=\"8\" height=\"18\" rx=\"2\"><\/rect>\n            <path d=\"M6 7h12M9 16h6\"><\/path>\n        <\/symbol>\n    <\/svg>\n    <div class=\"buy-layout\">\n        <section class=\"product-column\" aria-labelledby=\"bf-product-name\">\n            <div class=\"gallery-stage\" id=\"bf-product-stage\" data-model=\"g2\" data-view=\"overview\">\n                <img id=\"bf-product-photo\" alt=\"BikeFinder G2\">\n            <\/div>\n            <h2 class=\"gallery-name model-name\" id=\"bf-product-name\">BikeFinder G2<\/h2>\n            <div class=\"gallery-thumbnails\" id=\"bf-gallery-thumbnails\" role=\"group\" aria-label=\"Product images\"><\/div>\n            <div class=\"product-details\">\n                <details>\n                    <summary>\n                        <span data-copy=\"fitHeading\">Passer den til min cykel?<\/span><span class=\"fit-range\">15\u201327 mm<\/span>\n                    <\/summary>\n                    <p data-copy=\"fitCopy\">Trackeren passer i styr med en indvendig diameter p\u00e5 15\u201327 mm. Kontroll\u00e9r indersiden af styret, f\u00f8r du bestiller.<\/p>\n                <\/details>\n            <\/div>\n        <\/section>\n        <section class=\"configurator\" id=\"start\" aria-labelledby=\"bf-config-heading\">\n            <h1 class=\"config-title\" id=\"bf-config-heading\" tabindex=\"-1\" data-copy=\"configTitle\">Sammens\u00e6t din BikeFinder.<\/h1>\n            <p class=\"config-subtitle\" id=\"bf-destination-copy\"><\/p>\n            <div class=\"setup-builder\">\n                <div class=\"hardware-row\">\n                    <div class=\"hardware-info\">\n                        <span class=\"hardware-icon\"><svg aria-hidden=\"true\"><use href=\"#bf-i-device\"><\/use><\/svg><\/span>\n                        <div>\n                            <strong id=\"bf-hardware-name\"><\/strong><small id=\"bf-hardware-help\"><\/small>\n                        <\/div>\n                    <\/div>\n                    <span class=\"hardware-price price\" id=\"bf-hardware-price\"><\/span>\n                <\/div>\n                <div class=\"owner-controls\">\n                    <label class=\"owner-toggle\"><input id=\"bf-existing-owner\" type=\"checkbox\"><span data-copy=\"alreadyOwn\">Har du allerede en tracker? V\u00e6lg kun abonnement.<\/span><\/label>\n                    <button class=\"purchase-link\" id=\"bf-tracker-only\" type=\"button\"><\/button>\n                <\/div>\n                <div class=\"subscription-settings\" id=\"bf-subscription-settings\">\n                    <fieldset class=\"protection-fieldset\" id=\"bf-protection-settings\">\n                        <legend class=\"section-label\">\n                            <span class=\"step\" aria-hidden=\"true\">1<\/span><span data-copy=\"protectionTitle\">V\u00e6lg din beskyttelse<\/span>\n                        <\/legend>\n                        <div class=\"choices protection-choices\">\n                            <label class=\"choice\"><input type=\"radio\" name=\"bf-protection\" value=\"tracking\" checked=\"\"><span class=\"choice-face\"><span><strong data-copy=\"tracking\">Sporing<\/strong><small data-copy=\"trackingDesc\">F\u00f8lg cyklens position i appen. Ingen forsikring inkluderet.<\/small><\/span><span class=\"radio-mark\" aria-hidden=\"true\"><\/span><\/span><\/label>\n                            <label class=\"choice\"><input type=\"radio\" name=\"bf-protection\" value=\"insurance\" id=\"bf-insurance-option\"><span class=\"choice-face\"><span><strong data-copy=\"insured\">Sporing + forsikring<\/strong><small data-copy=\"insuredDesc\">Sporing med valgfri cykelforsikring.<\/small><\/span><span class=\"radio-mark\" aria-hidden=\"true\"><\/span><\/span><\/label>\n                        <\/div>\n                    <\/fieldset>\n                    <section class=\"insurance-settings\" id=\"bf-insurance-settings\" aria-labelledby=\"bf-bike-value-label\">\n                        <div class=\"bike-value-picker\">\n                            <div class=\"value-heading\">\n                                <label id=\"bf-bike-value-label\" for=\"bf-bike-value\" data-copy=\"valueLabel\">Cykelv\u00e6rdi op til<\/label>\n                                <output id=\"bf-bike-value-amount\" for=\"bf-bike-value\"><\/output>\n                            <\/div>\n                            <input id=\"bf-bike-value\" class=\"bike-value-range\" type=\"range\" min=\"0\" step=\"1\" value=\"0\" aria-describedby=\"bf-plan-type\">\n                            <div class=\"value-stops\" id=\"bf-value-stops\" aria-hidden=\"true\"><\/div>\n                        <\/div>\n                    <\/section>\n                    <p class=\"plan-type\" id=\"bf-plan-type\"><\/p>\n                    <fieldset class=\"billing-fieldset\">\n                        <legend class=\"section-label\">\n                            <span class=\"step\" id=\"bf-billing-number\" aria-hidden=\"true\">2<\/span><span data-copy=\"billingTitle\">V\u00e6lg hvor ofte du vil betale<\/span>\n                        <\/legend>\n                        <div class=\"choices billing-choices\" id=\"bf-billing-choices\">\n                            <label class=\"choice\">\n                                <input type=\"radio\" name=\"bf-billing\" value=\"1\">\n                                <span class=\"choice-face\">\n                                    <strong class=\"period-label\"><\/strong>\n                                    <span class=\"charge-price\"><span class=\"charge-number\"><span class=\"charge-amount\" aria-hidden=\"true\"><\/span><span class=\"charge-currency\" aria-hidden=\"true\"><\/span><\/span><span class=\"rate-unit\" aria-hidden=\"true\"><\/span><span class=\"charge-announcement sr-only\"><\/span><\/span>\n                                    <small class=\"charge-frequency\"><\/small><small class=\"saving\" hidden=\"\"><\/small>\n                                <\/span>\n                            <\/label>\n                            <label class=\"choice\">\n                                <input type=\"radio\" name=\"bf-billing\" value=\"12\">\n                                <span class=\"choice-face\">\n                                    <strong class=\"period-label\"><\/strong>\n                                    <span class=\"charge-price\"><span class=\"charge-number\"><span class=\"charge-amount\" aria-hidden=\"true\"><\/span><span class=\"charge-currency\" aria-hidden=\"true\"><\/span><\/span><span class=\"rate-unit\" aria-hidden=\"true\"><\/span><span class=\"charge-announcement sr-only\"><\/span><\/span>\n                                    <small class=\"charge-frequency\"><\/small><small class=\"saving\" hidden=\"\"><\/small>\n                                <\/span>\n                            <\/label>\n                            <label class=\"choice\">\n                                <input type=\"radio\" name=\"bf-billing\" value=\"24\">\n                                <span class=\"choice-face\">\n                                    <strong class=\"period-label\"><\/strong>\n                                    <span class=\"charge-price\"><span class=\"charge-number\"><span class=\"charge-amount\" aria-hidden=\"true\"><\/span><span class=\"charge-currency\" aria-hidden=\"true\"><\/span><\/span><span class=\"rate-unit\" aria-hidden=\"true\"><\/span><span class=\"charge-announcement sr-only\"><\/span><\/span>\n                                    <small class=\"charge-frequency\"><\/small><small class=\"saving\" hidden=\"\"><\/small>\n                                <\/span>\n                            <\/label>\n                        <\/div>\n                        <p class=\"billing-note\" id=\"bf-billing-note\"><\/p>\n                    <\/fieldset>\n                    <p class=\"eligibility\" id=\"bf-eligibility-copy\" hidden=\"\"><\/p>\n                <\/div>\n            <\/div>\n\n            <div class=\"order-summary\" id=\"bf-order-summary\" aria-live=\"polite\" aria-atomic=\"true\">\n                <div class=\"summary-line\" id=\"bf-tracker-summary-row\">\n                    <span class=\"model-name\"><\/span><span id=\"bf-tracker-summary-price\"><\/span>\n                <\/div>\n                <div class=\"summary-line\" id=\"bf-plan-summary-row\">\n                    <span id=\"bf-plan-summary-label\"><\/span><span id=\"bf-plan-summary-price\"><\/span>\n                <\/div>\n                <div class=\"today-line\">\n                    <strong id=\"bf-total-heading\" tabindex=\"-1\" data-copy=\"dueToday\">Til betaling i dag<\/strong><span class=\"price today-price\"><\/span>\n                <\/div>\n\n                <p class=\"renewal\" id=\"bf-renewal-copy\"><\/p>\n                <p class=\"tracking-requirement\" id=\"bf-hardware-only-note\" data-copy=\"trackingRequirement\" hidden=\"\">Sporing kr\u00e6ver et aktivt abonnement.<\/p>\n                <p class=\"shipping-note\" data-copy=\"shippingNote\">Fragt og endelige afgifter beregnes ved betaling.<\/p>\n            <\/div><div class=\"bf-buy-cart-note\" hidden=\"\"><p>Du har allerede produkter i kurven. Gennemg\u00e5 dem for at forts\u00e6tte, eller fjern dem for at sammens\u00e6tte et nyt valg.<\/p><button type=\"button\" data-review-cart=\"\">Gennemg\u00e5 kurven<\/button><\/div>\n            <p class=\"inline-error\" id=\"bf-eligibility-error\" hidden=\"\" role=\"alert\"><\/p>\n            <p class=\"bf-buy-alert\" hidden=\"\" role=\"alert\"><\/p><p class=\"bf-buy-busy\" hidden=\"\" role=\"status\"><\/p><button class=\"primary flow-action desktop-cta\" id=\"bf-flow-action\" type=\"button\" data-checkout=\"\">\n                <span id=\"bf-action-label\" data-copy=\"checkout\">Forts\u00e6t til betaling<\/span><svg aria-hidden=\"true\"><use href=\"#bf-i-arrow\"><\/use><\/svg>\n            <\/button>\n            <p class=\"cta-footnote\" data-copy=\"reviewNote\">Gennemg\u00e5 dine valg f\u00f8r betaling.<\/p>\n        <\/section>\n    <\/div>\n    <section class=\"how-section\" id=\"bf-how-it-works\" aria-labelledby=\"bf-how-heading\">\n        <div class=\"section-intro\">\n            <h2 id=\"bf-how-heading\" data-copy=\"howHeading\">Lille tracker. Enkel start.<\/h2>\n            <p data-copy=\"howIntro\">Fra \u00e6sken til n\u00e6ste cykeltur.<\/p>\n        <\/div>\n        <div class=\"how-grid\">\n            <article class=\"how-card\">\n                <span class=\"how-number\">01 \/<\/span>\n                <h3 data-copy=\"installTitle\">Skjul den i styret.<\/h3>\n                <p data-copy=\"installCopy\">Fastg\u00f8r trackeren med det medf\u00f8lgende monteringsv\u00e6rkt\u00f8j. Den sidder diskret, s\u00e5 din cykel stadig ligner din cykel.<\/p>\n            <\/article>\n            <article class=\"how-card\">\n                <span class=\"how-number\">02 \/<\/span>\n                <h3 data-copy=\"activateTitle\">Forbind den i appen.<\/h3>\n                <p data-copy=\"activateCopy\">Download BikeFinder-appen, forbind din tracker og aktiv\u00e9r dit abonnement.<\/p>\n            <\/article>\n            <article class=\"how-card\">\n                <span class=\"how-number\">03 \/<\/span>\n                <h3 data-copy=\"rideTitle\">Nyd din cykeltur.<\/h3>\n                <p data-copy=\"rideCopy\">F\u00f8lg cyklens position i appen, og anmeld et tyveri, hvis du har brug for hj\u00e6lp.<\/p>\n            <\/article>\n        <\/div>\n    <\/section>\n    <section class=\"faq-section\" id=\"bf-questions\" aria-labelledby=\"bf-faq-heading\">\n        <h2 id=\"bf-faq-heading\" data-copy=\"faqHeading\">Godt at vide.<\/h2>\n        <details>\n            <summary data-copy=\"subscriptionQuestion\">Hvorfor skal jeg have et abonnement?<\/summary>\n            <p data-copy=\"subscriptionAnswer\">Et aktivt abonnement forbinder trackeren med BikeFinder-tjenesten og aktiverer sporing i appen. Tracker og abonnement er separate dele af dit k\u00f8b.<\/p>\n        <\/details>\n        <details>\n            <summary data-copy=\"paymentQuestion\">Hvorn\u00e5r betaler jeg for abonnementet?<\/summary>\n            <p data-copy=\"paymentAnswer\">F\u00f8rste abonnementsbetaling er inkluderet i bel\u00f8bet i dag. M\u00e5nedsabonnementet fornyes hver m\u00e5ned. Abonnementer p\u00e5 12 eller 24 m\u00e5neder betales fuldt ud og fornyes med samme interval. Oversigten viser fornyelsesbel\u00f8bet separat fra trackeren.<\/p>\n        <\/details>\n        <details>\n            <summary data-copy=\"insuranceQuestion\">Er forsikring inkluderet?<\/summary>\n            <p data-copy=\"insuranceAnswer\">Kun n\u00e5r du v\u00e6lger sporing med forsikring. Tilg\u00e6ngelighed, cykelv\u00e6rdigr\u00e6nser og k\u00f8bsberettigelse afh\u00e6nger af leveringslandet og forsikringsvilk\u00e5rene. Leveringslandet alene giver ikke ret til forsikring.<\/p>\n        <\/details>\n        <details>\n            <summary data-copy=\"destinationQuestion\">Hvorfor har leveringslandet betydning?<\/summary>\n            <p data-copy=\"destinationAnswer\">Leveringslandet bestemmer tilg\u00e6ngelige trackere, priser og forsikringer. Du kan l\u00e6se siden p\u00e5 et andet sprog uden at \u00e6ndre disse valg.<\/p>\n        <\/details>\n        <details>\n            <summary data-copy=\"boxHeading\">Hvad er der i \u00e6sken?<\/summary>\n            <p id=\"bf-box-copy\"><\/p>\n        <\/details>\n    <\/section>\n<span data-page-end=\"\" aria-hidden=\"true\" style=\"display: block; height: 1px;\"><\/span><\/div><p class=\"bf-buy-initial-error\" role=\"alert\" hidden>Vi kunne ikke indl\u00e6se dit valg. Du kan stadig bruge produktvalgene nedenfor.<\/p><div class=\"bf-buy-fallback\"><h1>K\u00f8b BikeFinder<\/h1><p data-country-name>Unknown<\/p><div class=\"bf-source-trackers\"><div class=\"woocommerce columns-3 \"><\/div><div class=\"woocommerce columns-3 \"><ul class=\"products columns-3\">\n<li class=\"desktop-align-left tablet-align-left mobile-align-left product type-product post-345373 status-publish first instock product_cat-bikefinder-tracker-en product_cat-tracker-en has-post-thumbnail taxable shipping-taxable purchasable product-type-simple\">\n\t<a href=\"https:\/\/bikefinder.com\/da\/product\/bikefinder-tracker-bfg2\/\" class=\"woocommerce-LoopProduct-link woocommerce-loop-product__link\"><img loading=\"lazy\" decoding=\"async\" width=\"75\" height=\"75\" src=\"https:\/\/bikefinder.com\/wp-content\/uploads\/2025\/01\/BikeFinder_Tracker_Buy_DE_1-75x75.jpg\" class=\"attachment-woocommerce_thumbnail size-woocommerce_thumbnail\" alt=\"BikeFinder G2-tracker og emballage ved siden af en telefon med sporingsappen\" srcset=\"https:\/\/bikefinder.com\/wp-content\/uploads\/2025\/01\/BikeFinder_Tracker_Buy_DE_1-75x75.jpg 75w, https:\/\/bikefinder.com\/wp-content\/uploads\/2025\/01\/BikeFinder_Tracker_Buy_DE_1-150x150.jpg 150w, https:\/\/bikefinder.com\/wp-content\/uploads\/2025\/01\/BikeFinder_Tracker_Buy_DE_1-100x100.jpg 100w\" sizes=\"auto, (max-width: 75px) 100vw, 75px\" \/><h2 class=\"woocommerce-loop-product__title\">BikeFinder G2 Tracker<\/h2>\n\t<span class=\"price\"><span class=\"woocommerce-Price-amount amount\"><bdi>1.979,00&nbsp;<span class=\"woocommerce-Price-currencySymbol\" translate=\"no\" dir=\"auto\"><span class=\"woocommerce-Price-currencyCode\">NOK<\/span><\/span><\/bdi><\/span><\/span>\n<\/a><a href=\"\/da\/wp-json\/wp\/v2\/pages\/155475?add-to-cart=345373\" aria-describedby=\"woocommerce_loop_add_to_cart_link_describedby_345373\" data-quantity=\"1\" class=\"button product_type_simple add_to_cart_button ajax_add_to_cart\" data-product_id=\"345373\" data-product_sku=\"BFG2\" aria-label=\"L\u00e6g i kurv: &ldquo;BikeFinder G2 Tracker&rdquo;\" rel=\"nofollow\" data-success_message=\"&ldquo;BikeFinder G2 Tracker&rdquo; er blevet tilf\u00f8jet til din kurv\" role=\"button\">Tilf\u00f8j til kurv<\/a>\t<span id=\"woocommerce_loop_add_to_cart_link_describedby_345373\" class=\"screen-reader-text\">\n\t\t\t<\/span>\n<\/li>\n<\/ul>\n<\/div><\/div><div class=\"bf-source-accessory\"><p class=\"product woocommerce add_to_cart_inline bikefinder-native-accessory\" style=\"\"><span class=\"woocommerce-Price-amount amount\"><bdi>135,00&nbsp;<span class=\"woocommerce-Price-currencySymbol\" translate=\"no\" dir=\"auto\"><span class=\"woocommerce-Price-currencyCode\">NOK<\/span><\/span><\/bdi><\/span><a href=\"\/da\/wp-json\/wp\/v2\/pages\/155475?add-to-cart=317926\" aria-describedby=\"woocommerce_loop_add_to_cart_link_describedby_317926\" data-quantity=\"1\" class=\"button product_type_simple add_to_cart_button ajax_add_to_cart\" data-product_id=\"317926\" data-product_sku=\"dummy-bar-end-2\" aria-label=\"L\u00e6g i kurv: &ldquo;Dummy Bar End&rdquo;\" rel=\"nofollow\" data-success_message=\"&ldquo;Dummy Bar End&rdquo; er blevet tilf\u00f8jet til din kurv\" role=\"button\">Tilf\u00f8j til kurv<\/a>\t<span id=\"woocommerce_loop_add_to_cart_link_describedby_317926\" class=\"screen-reader-text\">\n\t\t\t<\/span>\n<\/p><\/div><h2>Sporingsabonnementer<\/h2><div class=\"bf-buy-native-plan\" data-tier=\"0\" data-months=\"24\" data-product-id=\"117195\"><h3>24 m\u00e5neder<\/h3><p class=\"product woocommerce add_to_cart_inline bikefinder-native-plan\" style=\"\"><span class=\"woocommerce-Price-amount amount\"><bdi>1.320,00&nbsp;<span class=\"woocommerce-Price-currencySymbol\" translate=\"no\" dir=\"auto\"><span class=\"woocommerce-Price-currencyCode\">NOK<\/span><\/span><\/bdi><\/span> <span class=\"subscription-details\"> hver 2 \u00e5r<\/span><a href=\"https:\/\/bikefinder.com\/da\/product\/subscription\/?attribute_payment-period=24+months&#038;attribute_tier=Tier+0&#038;variation_id=117195&#038;add-to-cart=111701\" aria-describedby=\"woocommerce_loop_add_to_cart_link_describedby_117195\" data-quantity=\"1\" class=\"button product_type_subscription_variation add_to_cart_button ajax_add_to_cart\" data-product_id=\"117195\" data-product_sku=\"subscription-24months-tier0-v2\" aria-label=\"L\u00e6g i kurv: &ldquo;Subscription&rdquo;\" rel=\"nofollow\" data-success_message=\"&ldquo;Subscription&rdquo; er blevet tilf\u00f8jet til din kurv\" role=\"button\">L\u00e6g i kurv<\/a>\t<span id=\"woocommerce_loop_add_to_cart_link_describedby_117195\" class=\"screen-reader-text\">\n\t\t\t<\/span>\n<\/p><\/div>\n<div class=\"bf-buy-native-plan\" data-tier=\"0\" data-months=\"12\" data-product-id=\"117189\"><h3>12 m\u00e5neder<\/h3><p class=\"product woocommerce add_to_cart_inline bikefinder-native-plan\" style=\"\"><span class=\"woocommerce-Price-amount amount\"><bdi>708,00&nbsp;<span class=\"woocommerce-Price-currencySymbol\" translate=\"no\" dir=\"auto\"><span class=\"woocommerce-Price-currencyCode\">NOK<\/span><\/span><\/bdi><\/span> <span class=\"subscription-details\"> \/ \u00e5r<\/span><a href=\"https:\/\/bikefinder.com\/da\/product\/subscription\/?attribute_payment-period=12+months&#038;attribute_tier=Tier+0&#038;variation_id=117189&#038;add-to-cart=111701\" aria-describedby=\"woocommerce_loop_add_to_cart_link_describedby_117189\" data-quantity=\"1\" class=\"button product_type_subscription_variation add_to_cart_button ajax_add_to_cart\" data-product_id=\"117189\" data-product_sku=\"subscription-12months-tier0-v2\" aria-label=\"L\u00e6g i kurv: &ldquo;Subscription&rdquo;\" rel=\"nofollow\" data-success_message=\"&ldquo;Subscription&rdquo; er blevet tilf\u00f8jet til din kurv\" role=\"button\">L\u00e6g i kurv<\/a>\t<span id=\"woocommerce_loop_add_to_cart_link_describedby_117189\" class=\"screen-reader-text\">\n\t\t\t<\/span>\n<\/p><\/div>\n<div class=\"bf-buy-native-plan\" data-tier=\"0\" data-months=\"1\" data-product-id=\"117181\"><h3>1 m\u00e5ned<\/h3><p class=\"product woocommerce add_to_cart_inline bikefinder-native-plan\" style=\"\"><span class=\"woocommerce-Price-amount amount\"><bdi>69,00&nbsp;<span class=\"woocommerce-Price-currencySymbol\" translate=\"no\" dir=\"auto\"><span class=\"woocommerce-Price-currencyCode\">NOK<\/span><\/span><\/bdi><\/span> <span class=\"subscription-details\"> \/ m\u00e5ned<\/span><a href=\"https:\/\/bikefinder.com\/da\/product\/subscription\/?attribute_payment-period=1+month&#038;attribute_tier=Tier+0&#038;variation_id=117181&#038;add-to-cart=111701\" aria-describedby=\"woocommerce_loop_add_to_cart_link_describedby_117181\" data-quantity=\"1\" class=\"button product_type_subscription_variation add_to_cart_button ajax_add_to_cart\" data-product_id=\"117181\" data-product_sku=\"subscription-1months-tier0-v2\" aria-label=\"L\u00e6g i kurv: &ldquo;Subscription&rdquo;\" rel=\"nofollow\" data-success_message=\"&ldquo;Subscription&rdquo; er blevet tilf\u00f8jet til din kurv\" role=\"button\">L\u00e6g i kurv<\/a>\t<span id=\"woocommerce_loop_add_to_cart_link_describedby_117181\" class=\"screen-reader-text\">\n\t\t\t<\/span>\n<\/p><\/div>\n\n\n\n\n\n\n\n\n<\/div><script type=\"application\/json\" class=\"bf-buy-config\">{\"locale\":\"da-DK\",\"copy\":{\"eyebrow\":\"En lille tracker. Mere ro i sindet.\",\"heroOne\":\"Cykl mere.\",\"heroTwo\":\"Bekymr dig mindre.\",\"intro\":\"Skjult i styret. Forbundet med din telefon. G\u00f8r BikeFinder til en del af din n\u00e6ste cykeltur.\",\"designed\":\"Designet i Norge\",\"hidden\":\"Skjult i cykelstyret\",\"trackFeature\":\"F\u00f8lg din cykel\",\"installFeature\":\"Mont\u00e9r den selv\",\"appFeature\":\"Forbundet med appen\",\"boxHeading\":\"Hvad er der i \u00e6sken?\",\"fitHeading\":\"Passer den til min cykel?\",\"fitCopy\":\"Trackeren passer i styr med en indvendig diameter p\u00e5 15\u201327 mm. Kontroll\u00e9r indersiden af styret, f\u00f8r du bestiller.\",\"configTitle\":\"Sammens\u00e6t din BikeFinder.\",\"alreadyOwn\":\"Har du allerede en tracker? V\u00e6lg kun abonnement.\",\"protectionTitle\":\"V\u00e6lg din beskyttelse\",\"tracking\":\"Sporing\",\"trackingDesc\":\"F\u00f8lg cyklens position i appen. Ingen forsikring inkluderet.\",\"insured\":\"Sporing + forsikring\",\"insuredDesc\":\"Sporing med valgfri cykelforsikring.\",\"valueLabel\":\"Cykelv\u00e6rdi op til\",\"policy\":\"Forsikringsvilk\u00e5r \u2197\",\"ipid\":\"Produktinformation \u2197\",\"billingTitle\":\"V\u00e6lg hvor ofte du vil betale\",\"accessory\":\"Tilf\u00f8j en matchende DummyBarEnd\",\"accessoryHelp\":\"En matchende endeprop til den anden side.\",\"dueToday\":\"Til betaling i dag\",\"shippingNote\":\"Fragt og endelige afgifter beregnes ved betaling.\",\"checkout\":\"Forts\u00e6t til betaling\",\"reviewNote\":\"Gennemg\u00e5 dine valg f\u00f8r betaling.\",\"howHeading\":\"Lille tracker. Enkel start.\",\"howIntro\":\"Fra \u00e6sken til n\u00e6ste cykeltur.\",\"installTitle\":\"Skjul den i styret.\",\"installCopy\":\"Fastg\u00f8r trackeren med det medf\u00f8lgende monteringsv\u00e6rkt\u00f8j. Den sidder diskret, s\u00e5 din cykel stadig ligner din cykel.\",\"activateTitle\":\"Forbind den i appen.\",\"activateCopy\":\"Download BikeFinder-appen, forbind din tracker og aktiv\u00e9r dit abonnement.\",\"rideTitle\":\"Nyd din cykeltur.\",\"rideCopy\":\"F\u00f8lg cyklens position i appen, og anmeld et tyveri, hvis du har brug for hj\u00e6lp.\",\"faqHeading\":\"Godt at vide.\",\"subscriptionQuestion\":\"Hvorfor skal jeg have et abonnement?\",\"subscriptionAnswer\":\"Et aktivt abonnement forbinder trackeren med BikeFinder-tjenesten og aktiverer sporing i appen. Tracker og abonnement er separate dele af dit k\u00f8b.\",\"paymentQuestion\":\"Hvorn\u00e5r betaler jeg for abonnementet?\",\"paymentAnswer\":\"F\u00f8rste abonnementsbetaling er inkluderet i bel\u00f8bet i dag. M\u00e5nedsabonnementet fornyes hver m\u00e5ned. Abonnementer p\u00e5 12 eller 24 m\u00e5neder betales fuldt ud og fornyes med samme interval. Oversigten viser fornyelsesbel\u00f8bet separat fra trackeren.\",\"insuranceQuestion\":\"Er forsikring inkluderet?\",\"insuranceAnswer\":\"Kun n\u00e5r du v\u00e6lger sporing med forsikring. Tilg\u00e6ngelighed, cykelv\u00e6rdigr\u00e6nser og k\u00f8bsberettigelse afh\u00e6nger af leveringslandet og forsikringsvilk\u00e5rene. Leveringslandet alene giver ikke ret til forsikring.\",\"destinationQuestion\":\"Hvorfor har leveringslandet betydning?\",\"destinationAnswer\":\"Leveringslandet bestemmer tilg\u00e6ngelige trackere, priser og forsikringer. Du kan l\u00e6se siden p\u00e5 et andet sprog uden at \u00e6ndre disse valg.\",\"month\":\"m\u00e5ned\",\"months\":\"m\u00e5neder\",\"monthly\":\"M\u00e5nedligt\",\"billed\":\"betales\",\"save\":\"Spar\",\"perMonth\":\"\/md.\",\"destination\":\"Dit valg til levering i\",\"hardwareHelp\":\"Tracker + monteringss\u00e6t \u00b7 engangsk\u00f8b\",\"ownerHelp\":\"Kun abonnement \u00b7 tracker er ikke inkluderet\",\"ownerLabel\":\"Din eksisterende tracker\",\"billingMonthly\":\"Betales m\u00e5nedligt. F\u00f8rste m\u00e5ned er inkluderet nedenfor.\",\"billingLong\":\"Betales fuldt ud, ikke i m\u00e5nedlige rater. Fornyes med samme interval.\",\"renewal\":\"Derefter\",\"renewalMonth\":\"hver m\u00e5ned\",\"renewalLong\":\"hver\",\"planFirst\":\"f\u00f8rste\",\"valueUp\":\"Cykelv\u00e6rdi op til\",\"eligibility\":\"Forsikringen kr\u00e6ver fast bop\u00e6l i\",\"eligibilityEnd\":\"Se vilk\u00e5rene for d\u00e6kning og hvem der kan k\u00f8be forsikringen.\",\"germanEligibility\":\"Dette er den tyske forsikringsmulighed. Se vilk\u00e5rene for d\u00e6kning og k\u00f8bsberettigelse.\",\"residence\":\"Jeg har fast bop\u00e6l i\",\"error\":\"Bekr\u00e6ft fast bop\u00e6l i leveringslandet for at v\u00e6lge denne forsikring. V\u00e6lg ellers sporing uden forsikring.\",\"unavailable\":\"Cykelforsikring er ikke tilg\u00e6ngelig ved levering til\",\"stillTracking\":\"Sporing er tilg\u00e6ngelig.\",\"boxG2\":\"Tracker, styradapter, ladekabel, monteringsv\u00e6rkt\u00f8j, v\u00e6rkt\u00f8j til batterimodulet og brugervejledning.\",\"boxG1\":\"Tracker, styradapter, USB-C-ladekabel, monteringsv\u00e6rkt\u00f8j og brugervejledning.\",\"priceUnavailable\":\"Vi kunne ikke indl\u00e6se dit valg. Du kan stadig bruge produktvalgene nedenfor.\",\"checkoutError\":\"Vi kunne ikke tilf\u00f8je produktet. Gennemg\u00e5 kurven, eller pr\u00f8v igen.\",\"partialError\":\"Nogle produkter kan allerede v\u00e6re i kurven. Gennemg\u00e5 dem f\u00f8r \u00e6ndringer, eller pr\u00f8v det samme valg igen.\",\"existingCart\":\"Du har allerede produkter i kurven. Gennemg\u00e5 dem for at forts\u00e6tte, eller fjern dem for at sammens\u00e6tte et nyt valg.\",\"reviewCart\":\"Gennemg\u00e5 kurven\",\"retry\":\"Pr\u00f8v igen\",\"adding\":\"Tilf\u00f8jer dine valg\u2026\",\"deliveryChanged\":\"Leveringslandet er \u00e6ndret. Genindl\u00e6s siden for at se det rigtige valg.\",\"unavailableHardware\":\"Trackeren er ikke tilg\u00e6ngelig lige nu. Du kan stadig v\u00e6lge abonnement til en eksisterende tracker.\",\"fallbackTitle\":\"K\u00f8b BikeFinder\",\"fallbackTracking\":\"Sporingsabonnementer\",\"fallbackInsurance\":\"Sporing med forsikring\",\"trackerOnly\":\"K\u00f8b kun tracker\",\"addSubscription\":\"Tilf\u00f8j et abonnement\",\"trackerHelp\":\"Kun tracker \u00b7 kr\u00e6ver et aktivt abonnement.\",\"trackingRequirement\":\"Sporing kr\u00e6ver et aktivt abonnement.\",\"noInsurance\":\"Uden forsikring\",\"gallery\":\"Produktbilleder\",\"policyInline\":\"vilk\u00e5rene\",\"policyInlineGerman\":\"vilk\u00e5rene\",\"loadingSetup\":\"Indl\u00e6ser dit valg\u2026\"},\"models\":{\"117472\":{\"role\":\"g1\",\"name\":\"BikeFinder G1\",\"image\":{\"id\":124408,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2020\/03\/IMG_0553-scaled.jpg\",\"alt\":\"BikeFinder-tracker, ladekabel og v\u00e6rkt\u00f8j ved siden af emballagen\"},\"images\":[{\"id\":124408,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2020\/03\/IMG_0553-scaled.jpg\",\"alt\":\"BikeFinder-tracker, ladekabel og v\u00e6rkt\u00f8j ved siden af emballagen\"},{\"id\":98806,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2020\/02\/BikeFinder-product-box-new-copy.jpg\",\"alt\":\"BikeFinder-trackerens \u00e6ske\"},{\"id\":124395,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2020\/03\/IMG_0594-scaled.jpg\",\"alt\":\"BikeFinder-tracker og tilbeh\u00f8r foran emballagen\"},{\"id\":243874,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2023\/11\/IMG_0543-scaled-1.jpg\",\"alt\":\"\u00c5ben BikeFinder-\u00e6ske med tracker og tilbeh\u00f8r\"}]},\"185640\":{\"role\":\"fahrradfinden\",\"name\":\"FahrradFinden G1\",\"image\":{\"id\":185821,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2022\/08\/50-FahradFinden-net-shop-photo-3893-e1664871102963.jpg\",\"alt\":\"FahrradFinden-tracker, ladekabel og tilbeh\u00f8r ved siden af emballagen\"},\"images\":[{\"id\":185821,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2022\/08\/50-FahradFinden-net-shop-photo-3893-e1664871102963.jpg\",\"alt\":\"FahrradFinden-tracker, ladekabel og tilbeh\u00f8r ved siden af emballagen\"},{\"id\":185794,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2022\/08\/50-FahradFinden-net-shop-photo-3878-e1664871243399.jpg\",\"alt\":\"FahrradFinden-trackerens \u00e6ske\"},{\"id\":185839,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2022\/08\/50-FahradFinden-net-shop-photo-3879-e1664870905588.jpg\",\"alt\":\"\u00c5ben FahrradFinden-\u00e6ske med tracker og tilbeh\u00f8r\"},{\"id\":185830,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2022\/08\/50-FahradFinden-net-shop-photo-3890-e1664871030325.jpg\",\"alt\":\"FahrradFinden-tracker og tilbeh\u00f8r foran emballagen\"}]},\"345373\":{\"role\":\"g2\",\"name\":\"BikeFinder G2\",\"image\":{\"id\":312858,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2025\/01\/BikeFinder_Tracker_Buy_2.jpg\",\"alt\":\"BikeFinder G2-tracker st\u00e5ende oprejst\"},\"images\":[{\"id\":312858,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2025\/01\/BikeFinder_Tracker_Buy_2.jpg\",\"alt\":\"BikeFinder G2-tracker st\u00e5ende oprejst\"},{\"id\":360561,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2025\/01\/BikeFinder_Tracker_Buy_DE_1.jpg\",\"alt\":\"BikeFinder G2-tracker og emballage ved siden af en telefon med sporingsappen\"},{\"id\":360534,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2025\/01\/BikeFinder_Tracker_Buy_DE_3.jpg\",\"alt\":\"BikeFinder G2-tracker med emballage, monteringsv\u00e6rkt\u00f8j og ladekabel\"},{\"id\":312876,\"src\":\"https:\/\/bikefinder.com\/wp-content\/uploads\/2025\/01\/BikeFinder_Tracker_Buy_4.jpg\",\"alt\":\"N\u00e6rbillede af BikeFinder G2-ekspansionsmekanismen\"}]}}}<\/script><\/main>\n<script>\/** Buying-page presentation over native WooCommerce shortcodes and cart endpoints. *\/\n(function () {\n    'use strict';\n\n    async function initialise() {\n        const root = document.querySelector('.bf-buy');\n        if (!root || root.dataset.initialised) return;\n        root.dataset.initialised = 'true';\n        const config = JSON.parse(root.querySelector('.bf-buy-config').textContent);\n        const copy = config.copy;\n        const find = (id) => root.querySelector('#bf-' + id);\n        const note = root.querySelector('.bf-buy-cart-note');\n        const source = root.querySelector('.bf-buy-fallback');\n        const ajaxParams = window.wc_add_to_cart_params;\n        const currencyMeta = {};\n        const state = {\n            insurance: false,\n            tier: 0,\n            insuranceTier: 1,\n            subscription: true,\n            months: 12,\n            owner: false,\n            image: 0,\n            busy: false,\n            job: null,\n            cart: null,\n        };\n        const market = source.querySelector('[data-offer-zone]');\n        const bands = JSON.parse(market?.dataset.bands || '[]');\n        const countryName = source.querySelector('[data-country-name]').textContent.trim();\n        const country = () =>\n            document.querySelector('select.wcpbc-country-switcher')?.value ||\n            state.cart?.shipping_address?.country;\n        const expectedCountry = country();\n        const plans = new Map();\n        let tracker;\n        let cartNonce;\n\n        function rememberSelection() {\n            try {\n                window.sessionStorage.setItem(\n                    'bikefinder-buying-selection',\n                    JSON.stringify({\n                        country: state.cart.shipping_address.country,\n                        insurance: state.insurance,\n                        tier: state.tier,\n                        insuranceTier: state.insuranceTier,\n                        subscription: state.subscription,\n                        months: state.months,\n                        owner: state.owner,\n                    }),\n                );\n            } catch {\n                \/* Browser storage is optional; native products remain usable. *\/\n            }\n        }\n\n        function restoreSelection() {\n            try {\n                const saved = JSON.parse(\n                    window.sessionStorage.getItem('bikefinder-buying-selection'),\n                );\n                if (!saved) return;\n                if ([1, 12, 24].includes(saved.months)) state.months = saved.months;\n                state.owner = saved.owner === true;\n                state.subscription = state.owner || saved.subscription !== false;\n                if (saved.country === state.cart.shipping_address.country) {\n                    if (Number.isInteger(saved.tier) && plans.has(`${saved.tier}-${state.months}`))\n                        state.tier = saved.tier;\n                    state.insurance =\n                        saved.insurance === true &&\n                        Boolean(market.dataset.insuranceCountry) &&\n                        plans.has(`${state.tier}-${state.months}`);\n                    if (\n                        Number.isInteger(saved.insuranceTier) &&\n                        saved.insuranceTier > 0 &&\n                        plans.has(`${saved.insuranceTier}-${state.months}`)\n                    )\n                        state.insuranceTier = saved.insuranceTier;\n                    if (state.insurance && state.tier > 0) state.insuranceTier = state.tier;\n                    else {\n                        state.insurance = false;\n                        state.tier = 0;\n                    }\n                }\n            } catch {\n                \/* Ignore a missing or outdated draft. *\/\n            }\n        }\n\n        function message(text) {\n            const alert = root.querySelector(\n                root.classList.contains('is-ready') ? '.bf-buy-alert' : '.bf-buy-initial-error',\n            );\n            alert.textContent = text;\n            alert.hidden = !text;\n        }\n\n        async function json(url, options = {}) {\n            \/\/ Match FunnelKit's page language explicitly. After a language switch,\n            \/\/ the previous AJAX-language cookie can otherwise translate cart items\n            \/\/ during this read and invalidate the drawer's freshly fetched keys.\n            \/\/ WordPress publishes WPML's localized REST root. The country-pricing\n            \/\/ plugin recognizes frontend API requests against that native root.\n            const restRoot =\n                document.querySelector('link[rel=\"https:\/\/api.w.org\/\"]')?.href ||\n                new URL('\/wp-json\/', window.location.origin).href;\n            const requestUrl = new URL(url.replace(\/^\\\/wp-json\\\/\/, ''), restRoot);\n            requestUrl.searchParams.set('lang', root.dataset.language);\n            const response = await fetch(requestUrl, {\n                credentials: 'same-origin',\n                cache: 'no-store',\n                signal: AbortSignal.timeout(20000),\n                ...options,\n            });\n            if (!response.ok) throw new Error(copy.checkoutError);\n            cartNonce = response.headers.get('Nonce') || cartNonce;\n            const result = await response.json();\n            return result;\n        }\n\n        const cart = () => json('\/wp-json\/wc\/store\/v1\/cart?bf_buy=' + Date.now());\n        const quantity = (data, id) =>\n            data.items\n                .filter((item) => Number(item.id) === Number(id))\n                .reduce((sum, item) => sum + item.quantity, 0);\n        const selectedPlan = () =>\n            state.subscription\n                ? plans.get(`${state.insurance ? state.tier : 0}-${state.months}`)\n                : null;\n\n        function parsePrice(element) {\n            const amount =\n                element?.querySelector('ins .woocommerce-Price-amount') ||\n                element?.querySelector('.woocommerce-Price-amount');\n            if (!amount) return null;\n            const text = amount.textContent;\n            const stripped = text\n                .replaceAll(currencyMeta.currency_thousand_separator, '')\n                .replace(\/[^\\d.,-]\/g, '')\n                .replace(currencyMeta.currency_decimal_separator, '.');\n            const number = Number(stripped);\n            return Number.isFinite(number) && number >= 0\n                ? Math.round(number * 10 ** currencyMeta.currency_minor_unit)\n                : null;\n        }\n\n        function money(minor) {\n            return new Intl.NumberFormat(config.locale, {\n                style: 'currency',\n                currency: currencyMeta.currency_code,\n                minimumFractionDigits:\n                    minor % 10 ** currencyMeta.currency_minor_unit\n                        ? currencyMeta.currency_minor_unit\n                        : 0,\n                maximumFractionDigits: currencyMeta.currency_minor_unit,\n            }).format(minor \/ 10 ** currencyMeta.currency_minor_unit);\n        }\n\n        function nativeProduct(element) {\n            const button = element?.querySelector('.add_to_cart_button[data-product_id]');\n            const price = parsePrice(element?.querySelector('.price') || element);\n            return button && price !== null\n                ? { id: Number(button.dataset.product_id), price, button }\n                : null;\n        }\n\n        function setPrice(selector, price) {\n            root.querySelectorAll(selector).forEach((el) => {\n                el.textContent = money(price);\n            });\n        }\n\n        function openCart() {\n            if (window.jQuery && window.fkcart_app_data) {\n                window.jQuery(document.body).trigger('fkcart_open');\n            } else if (ajaxParams?.cart_url) {\n                window.location.assign(ajaxParams.cart_url);\n            }\n        }\n\n        function setBusy(busy) {\n            state.busy = busy;\n            root.querySelector('.configurator').setAttribute('aria-busy', String(busy));\n            root.querySelectorAll(\n                '.bf-buy-app input, .bf-buy-app select, .bf-buy-app button',\n            ).forEach((el) => {\n                if (busy) {\n                    el.dataset.wasDisabled = el.disabled ? 'true' : 'false';\n                    el.disabled = true;\n                } else {\n                    el.disabled = el.dataset.wasDisabled === 'true';\n                    delete el.dataset.wasDisabled;\n                }\n            });\n            root.querySelector('.bf-buy-busy').hidden = !busy;\n        }\n\n        function renderGallery() {\n            const model = config.models[config.trackerId];\n            const images = model.images || [model.image];\n            const image = images[state.image];\n            if (image) {\n                find('product-photo').src = image.src;\n                find('product-photo').alt = image.alt || model.name;\n            }\n            find('gallery-thumbnails')\n                .querySelectorAll('button')\n                .forEach((button, index) => {\n                    button.setAttribute('aria-pressed', String(index === state.image));\n                });\n        }\n\n        function renderBikeValue() {\n            const slider = find('bike-value');\n            const stops = [0, ...bands];\n            slider.max = bands.length;\n            slider.disabled = !bands.length;\n            slider.value = state.tier;\n            const value = money(stops[state.tier] * 10 ** currencyMeta.currency_minor_unit);\n            find('bike-value-amount').textContent = state.insurance ? value : copy.noInsurance;\n            slider.setAttribute(\n                'aria-valuetext',\n                state.insurance\n                    ? copy.valueUp + ' ' + value\n                    : copy.tracking + ' \u00b7 ' + copy.noInsurance,\n            );\n            slider.style.setProperty(\n                '--value-progress',\n                bands.length ? (state.tier \/ bands.length) * 100 + '%' : '0%',\n            );\n            find('value-stops').replaceChildren(\n                ...stops.map((limit, index) => {\n                    const stop = document.createElement('span');\n                    stop.className = 'value-stop';\n                    stop.style.setProperty(\n                        '--stop-position',\n                        bands.length ? (index \/ bands.length) * 100 + '%' : '0%',\n                    );\n                    if (!(bands.length > 3) || index === 0 || index === bands.length) {\n                        const label = document.createElement('span');\n                        label.textContent = money(limit * 10 ** currencyMeta.currency_minor_unit);\n                        stop.append(label);\n                    }\n                    return stop;\n                }),\n            );\n        }\n\n        function renderBilling() {\n            const active = root.ownerDocument.activeElement;\n            const focused = active?.name === 'bf-billing' ? active.value : null;\n            const tier = state.insurance ? state.tier : 0;\n            const monthly = plans.get(tier + '-1');\n            const holder = find('billing-choices');\n            holder.replaceChildren();\n            [1, 12, 24].forEach((months) => {\n                const plan = plans.get(tier + '-' + months);\n                const label = document.createElement('label');\n                label.className = 'choice';\n                const input = document.createElement('input');\n                input.type = 'radio';\n                input.name = 'bf-billing';\n                input.value = months;\n                input.checked = state.months === months;\n                input.disabled = !plan;\n                const face = document.createElement('span');\n                face.className = 'choice-face';\n                const title = document.createElement('strong');\n                title.className = 'period-label';\n                title.textContent = months === 1 ? copy.monthly : months + ' ' + copy.months;\n                const equivalent = document.createElement('span');\n                equivalent.className = 'charge-price';\n                const number = document.createElement('span');\n                number.className = 'charge-number';\n                number.setAttribute('aria-hidden', 'true');\n                const rate = plan ? money(Math.round(plan.price \/ months)) : '\u2014';\n                const rateMinor = plan ? Math.round(plan.price \/ months) : 0;\n                const parts = new Intl.NumberFormat(config.locale, {\n                    style: 'currency',\n                    currency: currencyMeta.currency_code,\n                    minimumFractionDigits:\n                        rateMinor % 10 ** currencyMeta.currency_minor_unit\n                            ? currencyMeta.currency_minor_unit\n                            : 0,\n                    maximumFractionDigits: currencyMeta.currency_minor_unit,\n                }).formatToParts(rateMinor \/ 10 ** currencyMeta.currency_minor_unit);\n                const amount = document.createElement('span');\n                amount.className = 'charge-amount';\n                amount.textContent = plan\n                    ? parts\n                          .filter((part) =>\n                              ['integer', 'group', 'decimal', 'fraction'].includes(part.type),\n                          )\n                          .map((part) => part.value)\n                          .join('')\n                    : '\u2014';\n                const currency = document.createElement('span');\n                currency.className = 'charge-currency';\n                currency.textContent = plan\n                    ? parts.find((part) => part.type === 'currency').value\n                    : '';\n                currency.style.order =\n                    parts.findIndex((part) => part.type === 'currency') >\n                    parts.findIndex((part) => part.type === 'integer')\n                        ? '1'\n                        : '-1';\n                number.append(amount, currency);\n                const suffix = document.createElement('span');\n                suffix.className = 'rate-unit';\n                suffix.setAttribute('aria-hidden', 'true');\n                suffix.textContent = copy.perMonth;\n                const announcement = document.createElement('span');\n                announcement.className = 'sr-only';\n                announcement.textContent = rate + copy.perMonth;\n                equivalent.setAttribute('aria-label', rate + copy.perMonth);\n                equivalent.append(number, suffix, announcement);\n                const billed = document.createElement('small');\n                billed.className = 'charge-frequency';\n                \/\/ Preserve WooCommerce Subscriptions' full native billing text.\n                if (plan) billed.append(plan.nativePrice.cloneNode(true));\n                const saving =\n                    plan && monthly\n                        ? Math.round((1 - plan.price \/ (monthly.price * months)) * 100)\n                        : 0;\n                const badge = document.createElement('small');\n                badge.className = 'saving';\n                badge.textContent = copy.save + ' ' + saving + '%';\n                badge.hidden = !(saving > 0) || months === 1;\n                face.append(title, equivalent, billed, badge);\n                label.append(input, face);\n                holder.append(label);\n            });\n            if (focused) holder.querySelector('input[value=\"' + focused + '\"]').focus();\n        }\n\n        function render() {\n            const plan = selectedPlan();\n            const stock = Boolean(tracker);\n            const hasCart = state.cart?.items.length > 0 && !state.job;\n            const hardwarePrice = tracker ? money(tracker.price) : '\u2014';\n            find('hardware-price').textContent = state.owner ? '\u2014' : hardwarePrice;\n            find('hardware-name').textContent = state.owner\n                ? copy.ownerLabel\n                : config.models[config.trackerId]?.name || copy.fallbackTitle;\n            let hardwareHelp = copy.ownerHelp;\n            if (!state.owner)\n                hardwareHelp = state.subscription ? copy.hardwareHelp : copy.trackerHelp;\n            find('hardware-help').textContent = hardwareHelp;\n            find('existing-owner').checked = state.owner;\n            find('tracker-only').textContent = state.subscription\n                ? copy.trackerOnly\n                : copy.addSubscription;\n            find('tracker-only').setAttribute('aria-pressed', String(!state.subscription));\n            find('subscription-settings').hidden = !state.subscription;\n            find('protection-settings').hidden = !bands.length;\n            find('insurance-settings').hidden = !bands.length;\n            find('insurance-option').disabled = !bands.length;\n            find('billing-number').textContent = bands.length ? '2' : '1';\n            find('plan-type').hidden = Boolean(bands.length);\n            find('plan-type').textContent = copy.trackingDesc;\n            find('eligibility-copy').hidden = !state.insurance || !state.subscription;\n            root.querySelectorAll('input[name=\"bf-protection\"]').forEach((input) => {\n                input.checked = (input.value === 'insurance') === state.insurance;\n            });\n            find('billing-note').textContent =\n                state.months === 1 ? copy.billingMonthly : copy.billingLong;\n            renderBikeValue();\n            renderBilling();\n            find('tracker-summary-row').hidden = state.owner;\n            if (tracker) find('tracker-summary-price').textContent = money(tracker.price);\n            find('plan-summary-row').hidden = !state.subscription;\n            find('plan-summary-label').textContent =\n                (state.insurance ? copy.insured : copy.tracking) +\n                ' \u00b7 ' +\n                state.months +\n                ' ' +\n                (state.months === 1 ? copy.month : copy.months);\n            find('plan-summary-price').textContent = plan ? money(plan.price) : '\u2014';\n            const total = (plan?.price || 0) + (state.owner ? 0 : tracker?.price || 0);\n            setPrice('.today-price', total);\n            find('renewal-copy').hidden = !state.subscription;\n            find('renewal-copy').textContent = plan\n                ? copy.renewal +\n                  ' ' +\n                  money(plan.price) +\n                  ' ' +\n                  (state.months === 1\n                      ? copy.renewalMonth\n                      : copy.renewalLong + ' ' + state.months + ' ' + copy.months) +\n                  '.'\n                : '';\n            find('hardware-only-note').hidden = state.subscription;\n            note.hidden = !hasCart;\n            const purchaseLabel = state.job ? copy.retry : copy.checkout;\n            root.querySelectorAll('[data-checkout]').forEach((button) => {\n                button.querySelector('span').textContent = hasCart\n                    ? copy.reviewCart\n                    : purchaseLabel;\n                button.setAttribute(\n                    'aria-disabled',\n                    String(!hasCart && ((state.subscription && !plan) || (!stock && !state.owner))),\n                );\n            });\n            find('eligibility-error').hidden = true;\n            if (!stock && !state.owner) message(copy.unavailableHardware);\n            rememberSelection();\n        }\n\n        function checkoutUrl(fragments) {\n            const fragment = Object.values(fragments || {})\n                .filter((value) => typeof value === 'string')\n                .join('');\n            const document = new window.DOMParser().parseFromString(fragment, 'text\/html');\n            const anchor =\n                document.querySelector('#fkcart-checkout-button, a.checkout.wc-forward') ||\n                window.document.querySelector('#fkcart-checkout-button, a.checkout.wc-forward');\n            if (anchor) {\n                const url = new URL(anchor.href, window.location.href);\n                if (url.origin === window.location.origin) return url.href;\n            }\n            return ajaxParams.cart_url;\n        }\n\n        function refreshDrawer() {\n            if (!window.jQuery || !window.fkcart_app_data) return Promise.resolve();\n            \/\/ Let FunnelKit replace and persist its own fragments. Store API analytics\n            \/\/ already track the batch; emitting legacy added_to_cart would count it twice.\n            return new Promise((resolve, reject) => {\n                const body = window.jQuery(document.body);\n                const event = 'wc_fragments_refreshed.bfbuycheckout';\n                const done = () => {\n                    clearTimeout(timeout);\n                    body.off(event, done);\n                    resolve();\n                };\n                const timeout = setTimeout(() => {\n                    body.off(event, done);\n                    reject(new Error(copy.checkoutError));\n                }, 20000);\n                body.one(event, done);\n                body.trigger('fkcart_update_side_cart', [false]);\n            });\n        }\n\n        async function purchase() {\n            if (state.busy) return;\n            if (state.cart.items.length && !state.job) {\n                openCart();\n                return;\n            }\n            if ((state.subscription && !selectedPlan()) || (!state.owner && !tracker)) return;\n            const products = [\n                ...(!state.owner ? [tracker.id] : []),\n                ...(state.subscription ? [selectedPlan().id] : []),\n            ];\n            const fingerprint = products.join(',');\n            if (state.job && state.job.fingerprint !== fingerprint) {\n                message(copy.partialError);\n                openCart();\n                return;\n            }\n            setBusy(true);\n            message('');\n            try {\n                let current = await cart();\n                if (expectedCountry && current.shipping_address.country !== expectedCountry)\n                    throw new Error(copy.deliveryChanged);\n                if (!state.job && current.items.length) {\n                    state.cart = current;\n                    await refreshDrawer();\n                    setBusy(false);\n                    render();\n                    openCart();\n                    return;\n                }\n                state.job ||= {\n                    fingerprint,\n                    products,\n                    baseline: Object.fromEntries(products.map((id) => [id, quantity(current, id)])),\n                };\n                const job = state.job;\n                const remaining = job.products.filter((id) => {\n                    const count = quantity(current, id);\n                    if (count === job.baseline[id] + 1) return false;\n                    if (count !== job.baseline[id]) throw new Error(copy.partialError);\n                    return true;\n                });\n                if (current.items.some((item) => !job.products.includes(Number(item.id))))\n                    throw new Error(copy.partialError);\n                if (remaining.length) {\n                    try {\n                        const result = await json('\/wp-json\/wc\/store\/v1\/batch', {\n                            method: 'POST',\n                            headers: { 'Content-Type': 'application\/json' },\n                            body: JSON.stringify({\n                                requests: remaining.map((id) => ({\n                                    path: '\/wc\/store\/v1\/cart\/add-item',\n                                    method: 'POST',\n                                    headers: { Nonce: cartNonce },\n                                    body: { id, quantity: 1 },\n                                })),\n                            }),\n                        });\n                        if (\n                            result.responses?.length !== remaining.length ||\n                            result.responses.some(\n                                (response) => !(response.status >= 200 && 300 > response.status),\n                            )\n                        )\n                            throw new Error(copy.checkoutError);\n                        current = result.responses.at(-1).body;\n                    } catch (error) {\n                        \/\/ A lost response can still mean success. Re-read only on failure.\n                        current = await cart();\n                        if (\n                            !job.products.every(\n                                (id) => quantity(current, id) === job.baseline[id] + 1,\n                            )\n                        )\n                            throw error;\n                    }\n                }\n                if (!job.products.every((id) => quantity(current, id) === job.baseline[id] + 1))\n                    throw new Error(copy.partialError);\n                state.cart = current;\n                if (expectedCountry && state.cart.shipping_address.country !== expectedCountry)\n                    throw new Error(copy.deliveryChanged);\n                await refreshDrawer();\n                window.location.assign(checkoutUrl());\n            } catch (error) {\n                message(error.message || copy.checkoutError);\n                try {\n                    state.cart = await cart();\n                    await refreshDrawer();\n                } catch {\n                    \/* Preserve the attempt so a retry cannot duplicate it. *\/\n                }\n                if (!state.cart.items.length) state.job = null;\n                setBusy(false);\n                render();\n            }\n        }\n\n        try {\n            if (!ajaxParams?.wc_ajax_url || !ajaxParams.cart_url)\n                throw new Error(copy.priceUnavailable);\n            if (!market || source.querySelectorAll('[data-offer-zone]').length !== 1)\n                throw new Error(copy.priceUnavailable);\n            const trackerCards = source.querySelectorAll('.bf-source-trackers li.product');\n            if (trackerCards.length > 1) throw new Error(copy.priceUnavailable);\n            state.cart = await cart();\n            Object.assign(currencyMeta, state.cart.totals);\n            if (expectedCountry && state.cart.shipping_address.country !== expectedCountry)\n                throw new Error(copy.deliveryChanged);\n            tracker = nativeProduct(trackerCards[0]);\n            const title = trackerCards[0]\n                ?.querySelector('.woocommerce-loop-product__title')\n                ?.textContent.trim();\n            config.trackerId =\n                tracker?.id || Number(trackerCards[0]?.className.match(\/\\bpost-(\\d+)\\b\/)?.[1]);\n            const model = config.models[config.trackerId];\n            source.querySelectorAll('.bf-buy-native-plan').forEach((el) => {\n                const product = nativeProduct(el);\n                if (product) {\n                    product.nativePrice = el.querySelector('p');\n                    product.nativePrice = product.nativePrice.cloneNode(true);\n                    product.nativePrice.querySelectorAll('a').forEach((a) => a.remove());\n                    plans.set(`${el.dataset.tier}-${el.dataset.months}`, product);\n                }\n            });\n            if (![1, 12, 24].every((months) => plans.has('0-' + months)))\n                throw new Error(copy.priceUnavailable);\n            root.querySelectorAll('.model-name').forEach((el) => {\n                el.textContent = title || model?.name || '';\n            });\n            find('destination-copy').textContent = `${copy.destination} ${countryName}.`;\n            find('product-stage').dataset.model = model?.role || 'g2';\n            find('box-copy').textContent = model?.role === 'g2' ? copy.boxG2 : copy.boxG1;\n            const nativeImage = trackerCards[0]?.querySelector('img');\n            const images = model?.images || [\n                model?.image || { src: nativeImage?.src, alt: nativeImage?.alt },\n            ];\n            if (!model || !images[0]?.src) throw new Error(copy.priceUnavailable);\n            model.images = images;\n            find('gallery-thumbnails').setAttribute('aria-label', copy.gallery);\n            images.forEach((image, index) => {\n                const button = document.createElement('button');\n                button.className = 'gallery-thumbnail';\n                button.type = 'button';\n                button.setAttribute('aria-label', copy.gallery + ': ' + (index + 1));\n                const photo = document.createElement('img');\n                photo.src = image.src;\n                photo.alt = '';\n                photo.loading = 'lazy';\n                button.append(photo);\n                button.addEventListener('click', () => {\n                    state.image = index;\n                    renderGallery();\n                });\n                find('gallery-thumbnails').append(button);\n            });\n            renderGallery();\n            const eligibility =\n                market.dataset.offerZone === 'germany'\n                    ? copy.germanEligibility\n                    : copy.eligibility + ' ' + countryName + '. ' + copy.eligibilityEnd;\n            const linkText =\n                market.dataset.offerZone === 'germany'\n                    ? copy.policyInlineGerman\n                    : copy.policyInline;\n            const linkStart = eligibility.indexOf(linkText);\n            if (bands.length && linkStart === -1) throw new Error(copy.priceUnavailable);\n            const policyLink = document.createElement('a');\n            policyLink.id = 'bf-policy-link';\n            policyLink.textContent = linkText;\n            policyLink.href = '\/terms\/' + market.dataset.offerZone + '\/';\n            policyLink.target = '_blank';\n            policyLink.rel = 'noopener';\n            find('eligibility-copy').replaceChildren(\n                eligibility.slice(0, linkStart),\n                policyLink,\n                eligibility.slice(linkStart + linkText.length),\n            );\n            root.querySelectorAll('input[name=\"bf-protection\"]').forEach((input) => {\n                const selectProtection = () => {\n                    state.insurance = input.value === 'insurance';\n                    state.tier = state.insurance ? state.insuranceTier : 0;\n                    render();\n                };\n                input.addEventListener('change', selectProtection);\n                input.addEventListener('click', selectProtection);\n            });\n            find('billing-choices').addEventListener('change', (event) => {\n                state.months = Number(event.target.value);\n                render();\n            });\n            find('bike-value').addEventListener('input', (event) => {\n                state.tier = Number(event.target.value);\n                state.insurance = state.tier > 0;\n                if (state.insurance) state.insuranceTier = state.tier;\n                render();\n            });\n            find('existing-owner').addEventListener('change', (event) => {\n                state.owner = event.target.checked;\n                state.subscription = true;\n                render();\n            });\n            find('tracker-only').addEventListener('click', () => {\n                state.owner = false;\n                state.subscription = !state.subscription;\n                render();\n            });\n            root.querySelectorAll('[data-checkout]').forEach((button) => {\n                button.addEventListener('click', purchase);\n            });\n            root.querySelector('[data-review-cart]').addEventListener('click', openCart);\n            root.querySelector('.bf-buy-busy').textContent = copy.adding;\n            if (window.jQuery)\n                window\n                    .jQuery(document.body)\n                    .on('removed_from_cart.bfbuy wc_fragments_refreshed.bfbuy', () => {\n                        if (state.busy) return;\n                        const drawer = document.querySelector('#fkcart-modal');\n                        if (!drawer || !window.fkcart_app_data) return;\n                        \/\/ The native drawer response already tells us whether to offer\n                        \/\/ cart review. Avoid another session request during cart mutations;\n                        \/\/ purchase still reads the authoritative Store API cart and nonce.\n                        state.cart.items = Array.from(\n                            drawer.querySelectorAll('.fkcart--item[data-key]'),\n                        ).map((item) => ({\n                            ...state.cart.items.find((known) => known.key === item.dataset.key),\n                            key: item.dataset.key,\n                            quantity: Number(\n                                item.querySelector('.fkcart-quantity__input')?.value || 1,\n                            ),\n                        }));\n                        if (!state.cart.items.length) state.job = null;\n                        render();\n                    });\n            restoreSelection();\n            render();\n            root.querySelector('.bf-buy-initial-error').hidden = true;\n            root.classList.add('is-ready');\n            document.documentElement.classList.remove('bf-buy-loading');\n        } catch (error) {\n            message(error.message || copy.priceUnavailable);\n            document.documentElement.classList.remove('bf-buy-loading');\n            \/\/ Native product\/plan buttons remain usable if the enhancement cannot initialise.\n        }\n    }\n    if (document.readyState === 'loading')\n        \/\/ WPML writes its AJAX-language cookie in a later DOMContentLoaded handler.\n        \/\/ Start after those native handlers so the first cart read uses this page's language.\n        document.addEventListener('DOMContentLoaded', () => window.setTimeout(initialise, 0));\n    else initialise();\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Indl\u00e6ser dit valg\u2026 BikeFinder G2 Passer den til min cykel?15\u201327 mm Trackeren passer i styr med en indvendig diameter p\u00e5 15\u201327 mm. Kontroll\u00e9r indersiden af styret, f\u00f8r du bestiller. Sammens\u00e6t din BikeFinder. Har du allerede en tracker? V\u00e6lg kun abonnement. 1V\u00e6lg din beskyttelse SporingF\u00f8lg cyklens position i appen. Ingen forsikring inkluderet. Sporing + forsikringSporing med [&hellip;]<\/p>\n","protected":false},"author":7498,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"block-theme-template.php","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"unboxed","site-sidebar-style":"unboxed","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-155475","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>K\u00f8b BikeFinder | Cykeltracker og abonnement<\/title>\n<meta name=\"description\" content=\"V\u00e6lg tracker, abonnement eller begge dele. Forsikring er valgfri, hvor den er tilg\u00e6ngelig. Produkterne tilpasses leveringslandet.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/bikefinder.com\/da\/buy\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"K\u00f8b BikeFinder | Cykeltracker og abonnement\" \/>\n<meta property=\"og:description\" content=\"V\u00e6lg tracker, abonnement eller begge dele. Forsikring er valgfri, hvor den er tilg\u00e6ngelig. Produkterne tilpasses leveringslandet.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/bikefinder.com\/da\/buy\/\" \/>\n<meta property=\"og:site_name\" content=\"BikeFinder\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/teambikefinder\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-11T17:54:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/bikefinder.com\/wp-content\/uploads\/2025\/09\/Box-design-clean-no-logo-PNG_without-side-scaled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1962\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@TeamBikeFinder\" \/>\n<meta name=\"twitter:label1\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":[\"WebPage\",\"ItemPage\"],\"@id\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/buy\\\/\",\"url\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/buy\\\/\",\"name\":\"K\u00f8b BikeFinder | Cykeltracker og abonnement\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/#website\"},\"datePublished\":\"2021-11-30T14:30:21+00:00\",\"dateModified\":\"2026-10-11T17:54:38+00:00\",\"description\":\"V\u00e6lg tracker, abonnement eller begge dele. Forsikring er valgfri, hvor den er tilg\u00e6ngelig. Produkterne tilpasses leveringslandet.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/buy\\\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/bikefinder.com\\\/da\\\/buy\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/buy\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"k\u00f8b en cykelsporingsenhed\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/#website\",\"url\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/\",\"name\":\"BikeFinder\",\"description\":\"GPS-sporing og forsikring til sykkel\",\"publisher\":{\"@id\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/#organization\",\"name\":\"BikeFinder\",\"url\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/bikefinder.com\\\/wp-content\\\/uploads\\\/2020\\\/05\\\/logo_drop_big.png\",\"contentUrl\":\"https:\\\/\\\/bikefinder.com\\\/wp-content\\\/uploads\\\/2020\\\/05\\\/logo_drop_big.png\",\"width\":200,\"height\":200,\"caption\":\"BikeFinder\"},\"image\":{\"@id\":\"https:\\\/\\\/bikefinder.com\\\/da\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/teambikefinder\",\"https:\\\/\\\/x.com\\\/TeamBikeFinder\",\"https:\\\/\\\/www.instagram.com\\\/teambikefinder\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@teambikefinder\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/bikefinder\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"K\u00f8b BikeFinder | Cykeltracker og abonnement","description":"V\u00e6lg tracker, abonnement eller begge dele. Forsikring er valgfri, hvor den er tilg\u00e6ngelig. Produkterne tilpasses leveringslandet.","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:\/\/bikefinder.com\/da\/buy\/","og_locale":"da_DK","og_type":"article","og_title":"K\u00f8b BikeFinder | Cykeltracker og abonnement","og_description":"V\u00e6lg tracker, abonnement eller begge dele. Forsikring er valgfri, hvor den er tilg\u00e6ngelig. Produkterne tilpasses leveringslandet.","og_url":"https:\/\/bikefinder.com\/da\/buy\/","og_site_name":"BikeFinder","article_publisher":"https:\/\/www.facebook.com\/teambikefinder","article_modified_time":"2026-10-11T17:54:38+00:00","og_image":[{"width":2560,"height":1962,"url":"https:\/\/bikefinder.com\/wp-content\/uploads\/2025\/09\/Box-design-clean-no-logo-PNG_without-side-scaled.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@TeamBikeFinder","twitter_misc":{"Estimeret l\u00e6setid":"1 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["WebPage","ItemPage"],"@id":"https:\/\/bikefinder.com\/da\/buy\/","url":"https:\/\/bikefinder.com\/da\/buy\/","name":"K\u00f8b BikeFinder | Cykeltracker og abonnement","isPartOf":{"@id":"https:\/\/bikefinder.com\/da\/#website"},"datePublished":"2021-11-30T14:30:21+00:00","dateModified":"2026-10-11T17:54:38+00:00","description":"V\u00e6lg tracker, abonnement eller begge dele. Forsikring er valgfri, hvor den er tilg\u00e6ngelig. Produkterne tilpasses leveringslandet.","breadcrumb":{"@id":"https:\/\/bikefinder.com\/da\/buy\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/bikefinder.com\/da\/buy\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/bikefinder.com\/da\/buy\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/bikefinder.com\/da\/"},{"@type":"ListItem","position":2,"name":"k\u00f8b en cykelsporingsenhed"}]},{"@type":"WebSite","@id":"https:\/\/bikefinder.com\/da\/#website","url":"https:\/\/bikefinder.com\/da\/","name":"BikeFinder","description":"GPS-sporing og forsikring til sykkel","publisher":{"@id":"https:\/\/bikefinder.com\/da\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/bikefinder.com\/da\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Organization","@id":"https:\/\/bikefinder.com\/da\/#organization","name":"BikeFinder","url":"https:\/\/bikefinder.com\/da\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/bikefinder.com\/da\/#\/schema\/logo\/image\/","url":"https:\/\/bikefinder.com\/wp-content\/uploads\/2020\/05\/logo_drop_big.png","contentUrl":"https:\/\/bikefinder.com\/wp-content\/uploads\/2020\/05\/logo_drop_big.png","width":200,"height":200,"caption":"BikeFinder"},"image":{"@id":"https:\/\/bikefinder.com\/da\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/teambikefinder","https:\/\/x.com\/TeamBikeFinder","https:\/\/www.instagram.com\/teambikefinder\/","https:\/\/www.youtube.com\/@teambikefinder\/","https:\/\/www.linkedin.com\/company\/bikefinder"]}]}},"_links":{"self":[{"href":"https:\/\/bikefinder.com\/da\/wp-json\/wp\/v2\/pages\/155475","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bikefinder.com\/da\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bikefinder.com\/da\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bikefinder.com\/da\/wp-json\/wp\/v2\/users\/7498"}],"replies":[{"embeddable":true,"href":"https:\/\/bikefinder.com\/da\/wp-json\/wp\/v2\/comments?post=155475"}],"version-history":[{"count":32,"href":"https:\/\/bikefinder.com\/da\/wp-json\/wp\/v2\/pages\/155475\/revisions"}],"predecessor-version":[{"id":395153,"href":"https:\/\/bikefinder.com\/da\/wp-json\/wp\/v2\/pages\/155475\/revisions\/395153"}],"wp:attachment":[{"href":"https:\/\/bikefinder.com\/da\/wp-json\/wp\/v2\/media?parent=155475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}