{"id":240,"date":"2026-03-24T20:38:18","date_gmt":"2026-03-24T20:38:18","guid":{"rendered":"https:\/\/yebbo.com\/2013\/?p=240"},"modified":"2026-03-24T20:38:18","modified_gmt":"2026-03-24T20:38:18","slug":"yebbotax-obbb-qualified-overtime-calculator","status":"publish","type":"post","link":"https:\/\/yebbo.com\/2013\/2026\/03\/24\/yebbotax-obbb-qualified-overtime-calculator\/","title":{"rendered":"YebboTax OBBB Qualified Overtime Calculator"},"content":{"rendered":"\n\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\"><\/meta>\n  <meta content=\"width=device-width, initial-scale=1.0\" name=\"viewport\"><\/meta>\n  <title>YebboTax OBBB Qualified Overtime Calculator<\/title>\n  <style>\n     :root{\n      --bg:#fffaf5;\n      --card:#ffffff;\n      --card2:#fff7f0;\n      --text:#1f2937;\n      --muted:#6b7280;\n      --accent:#16a34a;\n      --accent2:#dc2626;\n      --warn:#d97706;\n      --danger:#dc2626;\n      --border:#f1d5cf;\n      --input:#ffffff;\n    }\n    *{box-sizing:border-box}\n    body{\n      margin:0;\n      font-family:Arial,Helvetica,sans-serif;\n      background:linear-gradient(180deg,#fff7f0 0%, #ffffff 100%);\n      color:var(--text);\n      line-height:1.45;\n    }\n    .wrap{\n      max-width:1100px;\n      margin:0 auto;\n      padding:28px 18px 48px;\n    }\n    .hero{\n      background:linear-gradient(135deg,rgba(22,163,74,.10),rgba(220,38,38,.08));\n      border:1px solid var(--border);\n      border-radius:20px;\n      padding:24px;\n      margin-bottom:22px;\n      box-shadow:0 14px 34px rgba(153,27,27,.08);\n    }\n    h1,h2,h3,p{margin:0 0 12px}\n    h1{font-size:clamp(28px,4vw,42px)}\n    h2{font-size:22px}\n    .sub{color:var(--muted);max-width:900px}\n    .grid{\n      display:grid;\n      grid-template-columns:1.15fr .85fr;\n      gap:20px;\n    }\n    .card{\n      background:rgba(255,255,255,.96);\n      border:1px solid var(--border);\n      border-radius:18px;\n      padding:20px;\n      box-shadow:0 10px 24px rgba(0,0,0,.06);\n    }\n    .section-title{\n      display:flex;\n      align-items:center;\n      justify-content:space-between;\n      gap:8px;\n      margin-bottom:14px;\n    }\n    .badge{\n      font-size:12px;\n      background:rgba(22,163,74,.10);\n      color:#166534;\n      padding:6px 10px;\n      border-radius:999px;\n      border:1px solid rgba(22,163,74,.20);\n      white-space:nowrap;\n    }\n    .form-grid{\n      display:grid;\n      grid-template-columns:repeat(2,minmax(0,1fr));\n      gap:14px;\n    }\n    .full{grid-column:1 \/ -1}\n    label{\n      display:block;\n      font-size:14px;\n      font-weight:700;\n      margin-bottom:6px;\n    }\n    .hint{\n      color:var(--muted);\n      font-size:12px;\n      margin-top:6px;\n    }\n    input, select{\n      width:100%;\n      background:var(--input);\n      color:var(--text);\n      border:1px solid var(--border);\n      border-radius:12px;\n      padding:12px 12px;\n      font-size:15px;\n      outline:none;\n    }\n    input:focus, select:focus{border-color:var(--accent2);box-shadow:0 0 0 3px rgba(56,189,248,.15)}\n    .actions{\n      display:flex;\n      gap:10px;\n      flex-wrap:wrap;\n      margin-top:16px;\n    }\n    button{\n      border:0;\n      border-radius:12px;\n      padding:12px 16px;\n      font-weight:700;\n      cursor:pointer;\n      font-size:14px;\n    }\n    .primary{background:var(--accent);color:#052e16}\n    .secondary{background:#fee2e2;color:#991b1b}\n    .ghost{background:#1e293b;color:#374151;border:1px solid var(--border)}\n    .result-box{\n      background:linear-gradient(180deg,rgba(22,163,74,.10),rgba(220,38,38,.03));\n      border:1px solid rgba(22,163,74,.22);\n      border-radius:16px;\n      padding:16px;\n      margin-bottom:16px;\n    }\n    .big{\n      font-size:34px;\n      font-weight:800;\n      letter-spacing:.2px;\n      margin-top:4px;\n      margin-bottom:4px;\n    }\n    .mini-grid{\n      display:grid;\n      grid-template-columns:repeat(2,minmax(0,1fr));\n      gap:12px;\n      margin-top:12px;\n    }\n    .mini{\n      border:1px solid var(--border);\n      border-radius:14px;\n      padding:14px;\n      background:#fffaf8;\n    }\n    .mini .k{font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.5px}\n    .mini .v{font-size:22px;font-weight:800;margin-top:6px}\n    .formula, .notes{\n      background:#fffaf8;\n      border:1px solid var(--border);\n      border-radius:14px;\n      padding:14px;\n      margin-top:14px;\n    }\n    .formula code{\n      color:#166534;\n      font-size:14px;\n      white-space:pre-wrap;\n      font-family:Consolas,Monaco,monospace;\n    }\n    ul{\n      margin:10px 0 0 18px;\n      padding:0;\n      color:var(--muted);\n    }\n    .ok{color:#86efac}\n    .warn{color:#fcd34d}\n    .danger{color:#fca5a5}\n    .footer-note{\n      color:var(--muted);\n      font-size:12px;\n      margin-top:18px;\n    }\n    \n    .brand-row{display:flex;align-items:center;gap:18px;flex-wrap:wrap;margin-bottom:10px}\n    .logo-box{background:#fff;border:1px solid var(--border);border-radius:18px;padding:14px 18px;box-shadow:0 8px 22px rgba(0,0,0,.05)}\n    .logo-box img{display:block;max-width:280px;width:100%;height:auto}\n    .brand-copy{flex:1;min-width:260px}\n    .brand-tag{display:inline-block;background:#dcfce7;color:#166534;border:1px solid #bbf7d0;padding:6px 10px;border-radius:999px;font-size:12px;font-weight:700;letter-spacing:.2px;margin-bottom:10px}\n    .contact-line{font-size:14px;font-weight:700;color:#991b1b;margin-top:4px}\n\n    @media (max-width:860px){\n      .grid{grid-template-columns:1fr}\n      .form-grid,.mini-grid{grid-template-columns:1fr}\n    }\n  <\/style>\n<\/head>\n<body>\n  <div class=\"wrap\">\n    <div class=\"hero\">\n      <div class=\"brand-row\">\n        <div class=\"logo-box\"><img decoding=\"async\" alt=\"YebboTax logo\" src=\"https:\/\/blogger.googleusercontent.com\/img\/a\/AVvXsEhQHgd1gmEEwL-wmzMeoUWaDyH5BKi-zTipKZQUiEEHLpi1N-whsjtJiiPz6GVpAxZovX3ZnXdJUOF_ym_DA0PWV1a8ZRdiz7yq5gMBtDBtbcOl8jRW5i4-mNAmcduHwjnvrSVpl1N7zFpHncQR31QYx2tG_hiQ0CqS-UprCt4DODM09y4tK6SpddYeuRY\" \/><\/div>\n        <div class=\"brand-copy\">\n          <div class=\"brand-tag\">YebboTax Branded Calculator<\/div>\n          <h1>OBBB Qualified Overtime Calculator<\/h1>\n          <p class=\"sub\">Estimate the <strong>qualified overtime deduction<\/strong> for the federal \u201cno tax on overtime\u201d rule. This calculator isolates the <strong>overtime premium portion<\/strong> and then applies the annual cap and estimated MAGI phaseout.<\/p>\n          <p class=\"sub\">Built for YebboTax website use, tax-prep education, and quick paystub checks. This is an estimate only and does not replace IRS instructions or a full tax review.<\/p>\n          <div class=\"contact-line\">YebboTax \u2022 619-255-5530<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"grid\">\n      <div class=\"card\">\n        <div class=\"section-title\">\n          <h2>Input your numbers<\/h2>\n          <span class=\"badge\">YebboTax Web Tool<\/span>\n        <\/div>\n\n        <div class=\"form-grid\">\n          <div>\n            <label for=\"filingStatus\">Filing status<\/label>\n            <select id=\"filingStatus\">\n              <option value=\"single\">Single \/ HOH \/ MFS<\/option>\n              <option value=\"mfj\">Married Filing Jointly<\/option>\n            <\/select>\n            <div class=\"hint\">Joint returns get a higher cap and higher MAGI threshold.<\/div>\n          <\/div>\n\n          <div>\n            <label for=\"taxYear\">Tax year<\/label>\n            <select id=\"taxYear\">\n              <option>2025<\/option>\n              <option selected=\"\">2026<\/option>\n              <option>2027<\/option>\n              <option>2028<\/option>\n            <\/select>\n            <div class=\"hint\">The deduction is currently described by the IRS as effective for 2025 through 2028.<\/div>\n          <\/div>\n\n          <div>\n            <label for=\"regularRate\">Regular hourly rate ($)<\/label>\n            <input id=\"regularRate\" min=\"0\" step=\"0.01\" type=\"number\" value=\"20\" \/>\n          <\/div>\n\n          <div>\n            <label for=\"otHours\">Overtime hours<\/label>\n            <input id=\"otHours\" min=\"0\" step=\"0.01\" type=\"number\" value=\"100\" \/>\n          <\/div>\n\n          <div>\n            <label for=\"otMode\">Overtime input method<\/label>\n            <select id=\"otMode\">\n              <option selected=\"\" value=\"multiplier\">Use OT multiplier<\/option>\n              <option value=\"totalpay\">Enter total OT pay directly<\/option>\n            <\/select>\n          <\/div>\n\n          <div id=\"multiplierWrap\">\n            <label for=\"otMultiplier\">OT multiplier<\/label>\n            <select id=\"otMultiplier\">\n              <option selected=\"\" value=\"1.5\">1.5 \u00d7 (time-and-a-half)<\/option>\n              <option value=\"2\">2.0 \u00d7 (double time)<\/option>\n              <option value=\"1.75\">1.75 \u00d7<\/option>\n              <option value=\"custom\">Custom multiplier<\/option>\n            <\/select>\n          <\/div>\n\n          <div id=\"customMultiplierWrap\" style=\"display: none;\">\n            <label for=\"customMultiplier\">Custom OT multiplier<\/label>\n            <input id=\"customMultiplier\" min=\"1\" step=\"0.01\" type=\"number\" value=\"1.5\" \/>\n          <\/div>\n\n          <div id=\"otPayWrap\" style=\"display: none;\">\n            <label for=\"otTotalPay\">Total OT pay ($)<\/label>\n            <input id=\"otTotalPay\" min=\"0\" step=\"0.01\" type=\"number\" value=\"7000\" \/>\n            <div class=\"hint\">Use the actual overtime earnings line if your paystub shows it.<\/div>\n          <\/div>\n\n          <div>\n            <label for=\"magi\">Modified AGI \/ MAGI ($)<\/label>\n            <input id=\"magi\" min=\"0\" step=\"1\" type=\"number\" value=\"70000\" \/>\n            <div class=\"hint\">Used to estimate the phaseout.<\/div>\n          <\/div>\n\n          <div class=\"full\">\n            <label for=\"eligibility\">FLSA overtime eligibility check<\/label>\n            <select id=\"eligibility\">\n              <option selected=\"\" value=\"yes\">Yes, this is FLSA-required overtime<\/option>\n              <option value=\"maybe\">Not sure<\/option>\n              <option value=\"no\">No \/ exempt \/ not FLSA-required<\/option>\n            <\/select>\n            <div class=\"hint\">The calculator still runs, but the warning changes based on your answer.<\/div>\n          <\/div>\n        <\/div>\n\n        <div class=\"actions\">\n          <button class=\"primary\" onclick=\"calculate()\">Calculate<\/button>\n          <button class=\"secondary\" onclick=\"loadExample()\">Load $7,000 Example<\/button>\n          <button class=\"ghost\" onclick=\"resetForm()\">Reset<\/button>\n        <\/div>\n\n        <div class=\"formula\">\n          <strong>Formula used<\/strong><br \/>\n          <code>Qualified OT = Total OT Pay \u2212 (Regular Rate \u00d7 OT Hours)\nAllowed Deduction = min(Qualified OT, annual cap) \u2212 MAGI phaseout reduction<\/code>\n        <\/div>\n      <\/div>\n\n      <div class=\"card\">\n        <div class=\"section-title\">\n          <h2>Estimated result<\/h2>\n          <span class=\"badge\">Federal estimate<\/span>\n        <\/div>\n\n        <div class=\"result-box\">\n          <div class=\"k\">Estimated qualified overtime deduction<\/div>\n          <div class=\"big\" id=\"qualifiedDeduction\">$0.00<\/div>\n          <div class=\"hint\" id=\"statusText\">Enter your numbers and click Calculate.<\/div>\n        <\/div>\n\n        <div class=\"mini-grid\">\n          <div class=\"mini\">\n            <div class=\"k\">Total OT pay<\/div>\n            <div class=\"v\" id=\"displayOtPay\">$0.00<\/div>\n          <\/div>\n          <div class=\"mini\">\n            <div class=\"k\">Regular-rate portion<\/div>\n            <div class=\"v\" id=\"displayBasePortion\">$0.00<\/div>\n          <\/div>\n          <div class=\"mini\">\n            <div class=\"k\">Raw qualified OT<\/div>\n            <div class=\"v\" id=\"displayRawQualified\">$0.00<\/div>\n          <\/div>\n          <div class=\"mini\">\n            <div class=\"k\">Phaseout reduction<\/div>\n            <div class=\"v\" id=\"displayPhaseout\">$0.00<\/div>\n          <\/div>\n        <\/div>\n\n        <div class=\"notes\">\n          <strong>Interpretation<\/strong>\n          <div class=\"hint\" id=\"interpretation\" style=\"color: #374151; font-size: 14px; margin-top: 8px;\">\n            This tool estimates only the federal OBBB overtime deduction.\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\" style=\"margin-top: 20px;\">\n      <h2>What information you need from the paystub<\/h2>\n      <ul>\n        <li>Regular hourly rate<\/li>\n        <li>Overtime hours<\/li>\n        <li>Overtime pay line or OT multiplier<\/li>\n        <li>Whether the employee is actually eligible for FLSA overtime<\/li>\n        <li>MAGI for the tax return<\/li>\n        <li>For 2025, extra records may be needed if qualified OT was not separately reported<\/li>\n      <\/ul>\n      <p class=\"footer-note\">Website note: This calculator estimates the deduction only. It does not calculate payroll withholding, Social Security, Medicare, or state tax.<\/p>\n    <\/div>\n  <\/div>\n\n  <script>\n    function money(n){\n      return new Intl.NumberFormat('en-US',{style:'currency',currency:'USD'}).format(Number(n)||0);\n    }\n\n    function ceilToWholeThousandsPhaseout(excess){\n      if (excess <= 0) return 0;\n      return Math.floor(excess \/ 1000) * 100;\n    }\n\n    function getMultiplier(){\n      const selected = document.getElementById('otMultiplier').value;\n      if(selected === 'custom') return Number(document.getElementById('customMultiplier').value) || 1.5;\n      return Number(selected) || 1.5;\n    }\n\n    function syncMode(){\n      const mode = document.getElementById('otMode').value;\n      document.getElementById('otPayWrap').style.display = mode === 'totalpay' ? 'block' : 'none';\n      document.getElementById('multiplierWrap').style.display = mode === 'multiplier' ? 'block' : 'none';\n      document.getElementById('customMultiplierWrap').style.display = (mode === 'multiplier' &#038;&#038; document.getElementById('otMultiplier').value === 'custom') ? 'block' : 'none';\n    }\n\n    function calculate(){\n      const filingStatus = document.getElementById('filingStatus').value;\n      const regularRate = Number(document.getElementById('regularRate').value) || 0;\n      const otHours = Number(document.getElementById('otHours').value) || 0;\n      const mode = document.getElementById('otMode').value;\n      const magi = Number(document.getElementById('magi').value) || 0;\n      const eligibility = document.getElementById('eligibility').value;\n\n      const cap = filingStatus === 'mfj' ? 25000 : 12500;\n      const threshold = filingStatus === 'mfj' ? 300000 : 150000;\n\n      let totalOtPay = 0;\n      let multiplier = getMultiplier();\n\n      if(mode === 'multiplier'){\n        totalOtPay = regularRate * otHours * multiplier;\n      } else {\n        totalOtPay = Number(document.getElementById('otTotalPay').value) || 0;\n      }\n\n      const basePortion = regularRate * otHours;\n      let rawQualified = totalOtPay - basePortion;\n      if(rawQualified < 0) rawQualified = 0;\n\n      let cappedQualified = Math.min(rawQualified, cap);\n      const phaseoutReduction = ceilToWholeThousandsPhaseout(magi - threshold);\n      let allowedDeduction = Math.max(0, cappedQualified - phaseoutReduction);\n\n      let status = '';\n      let interp = '';\n      if(eligibility === 'no'){\n        status = 'Warning: this may not qualify as OBBB overtime.';\n        interp = 'You indicated the worker is not receiving FLSA-required overtime. Under IRS guidance, overtime generally must be required under section 7 of the FLSA to count as qualified overtime compensation.';\n      } else if(eligibility === 'maybe'){\n        status = 'Estimate only: FLSA eligibility needs confirmation.';\n        interp = 'The math is shown here, but the deduction depends on whether the worker is actually covered by and not exempt from the FLSA overtime rules.';\n      } else {\n        status = 'Estimated based on the numbers entered.';\n        interp = 'This estimate isolates only the overtime premium portion. It then applies the annual deduction cap and an estimated MAGI phaseout.';\n      }\n\n      if(rawQualified === 0 &#038;&#038; totalOtPay > 0){\n        interp += ' The result is zero because the entered OT pay does not exceed the regular-rate portion of the overtime hours.';\n      }\n      if(rawQualified > cap){\n        interp += ' The raw qualified overtime exceeds the annual cap, so the cap limits the amount before the phaseout.';\n      }\n      if(phaseoutReduction > 0){\n        interp += ' A phaseout reduction was applied because MAGI is above the threshold for the filing status selected.';\n      }\n\n      document.getElementById('qualifiedDeduction').textContent = money(allowedDeduction);\n      document.getElementById('displayOtPay').textContent = money(totalOtPay);\n      document.getElementById('displayBasePortion').textContent = money(basePortion);\n      document.getElementById('displayRawQualified').textContent = money(rawQualified);\n      document.getElementById('displayPhaseout').textContent = '-' + money(phaseoutReduction);\n      document.getElementById('statusText').textContent = status;\n      document.getElementById('interpretation').textContent = interp;\n    }\n\n    function loadExample(){\n      document.getElementById('filingStatus').value = 'single';\n      document.getElementById('taxYear').value = '2026';\n      document.getElementById('regularRate').value = '20';\n      document.getElementById('otHours').value = '350';\n      document.getElementById('otMode').value = 'totalpay';\n      document.getElementById('otTotalPay').value = '7000';\n      document.getElementById('magi').value = '70000';\n      document.getElementById('eligibility').value = 'yes';\n      document.getElementById('otMultiplier').value = '1.5';\n      document.getElementById('customMultiplier').value = '1.5';\n      syncMode();\n      calculate();\n    }\n\n    function resetForm(){\n      document.getElementById('filingStatus').value = 'single';\n      document.getElementById('taxYear').value = '2026';\n      document.getElementById('regularRate').value = '20';\n      document.getElementById('otHours').value = '100';\n      document.getElementById('otMode').value = 'multiplier';\n      document.getElementById('otMultiplier').value = '1.5';\n      document.getElementById('customMultiplier').value = '1.5';\n      document.getElementById('otTotalPay').value = '7000';\n      document.getElementById('magi').value = '70000';\n      document.getElementById('eligibility').value = 'yes';\n      syncMode();\n      calculate();\n    }\n\n    document.getElementById('otMode').addEventListener('change', syncMode);\n    document.getElementById('otMultiplier').addEventListener('change', syncMode);\n    Array.from(document.querySelectorAll('input, select')).forEach(el => {\n      el.addEventListener('input', () => {\n        syncMode();\n        calculate();\n      });\n      el.addEventListener('change', () => {\n        syncMode();\n        calculate();\n      });\n    });\n\n    syncMode();\n    calculate();\n  <\/script>\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>YebboTax OBBB Qualified Overtime Calculator YebboTax Branded Calculator OBBB Qualified Overtime Calculator Estimate the qualified overtime deduction for the federal \u201cno tax on overtime\u201d rule. This calculator isolates the overtime premium portion and then applies the annual cap and estimated MAGI phaseout. Built for YebboTax website use, tax-prep education, and quick paystub checks. This is<span class=\"post-excerpt-end\">&hellip;<\/span><\/p>\n<p class=\"more-link\"><a href=\"https:\/\/yebbo.com\/2013\/2026\/03\/24\/yebbotax-obbb-qualified-overtime-calculator\/\" class=\"themebutton\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-240","post","type-post","status-publish","format-standard","hentry","category-blog"],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/yebbo.com\/2013\/wp-json\/wp\/v2\/posts\/240","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yebbo.com\/2013\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yebbo.com\/2013\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yebbo.com\/2013\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yebbo.com\/2013\/wp-json\/wp\/v2\/comments?post=240"}],"version-history":[{"count":1,"href":"https:\/\/yebbo.com\/2013\/wp-json\/wp\/v2\/posts\/240\/revisions"}],"predecessor-version":[{"id":241,"href":"https:\/\/yebbo.com\/2013\/wp-json\/wp\/v2\/posts\/240\/revisions\/241"}],"wp:attachment":[{"href":"https:\/\/yebbo.com\/2013\/wp-json\/wp\/v2\/media?parent=240"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yebbo.com\/2013\/wp-json\/wp\/v2\/categories?post=240"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yebbo.com\/2013\/wp-json\/wp\/v2\/tags?post=240"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}