How billing works

Vibes to Bucks tracks your Cursor AI token costs and converts them into billable hours in your time tracking software (Moneybird or Harvest). The conversion is based on your hourly rate — so the extension calculates how many hours of your time the AI cost represents, and creates a time entry for that amount.

Per client mapping you control three things:

Use this when you want to bill AI-assisted work at a profit margin. You set a Cost to Profit Multiplier that scales the raw AI cost before converting to hours. This captures the real value you deliver — prompt crafting, reviewing and iterating on output, integrating the result, and taking responsibility for the end product.

The math:

cost_eur = cost_usd × multiplier × fx_rate
hours    = cost_eur / hourly_rate

Example: €10 of AI cost, multiplier 5, hourly rate €120/h:

cost_eur = €10 × 5 = €50
hours    = €50 / €120 = 0.42h (≈ 25 minutes billed)

A multiplier of 5 means every €1 of AI spend becomes €5 of billable revenue — a margin that reflects the expertise and time you invest around the AI output. Start at 5 and adjust to match your client agreements.

Pass through at face value

Use this for cost-recovery billing — the raw AI cost is passed to the client at face value, converted to hours at your hourly rate. No margin is added.

The math:

cost_eur = cost_usd × fx_rate
hours    = cost_eur / hourly_rate

Example: $12.00 AI cost, EUR/USD rate 0.92, hourly rate €120/h:

cost_eur = $12.00 × 0.92 = €11.04
hours    = €11.04 / €120  = 0.092h (≈ 6 minutes billed)

Not billable

Uncheck Billable on a mapping to track AI costs for that client or project without generating any time entry. The costs appear in your dashboard so you can see the spend, but nothing is synced to Moneybird or Harvest. Useful for internal projects, R&D, or any work where you absorb the AI cost yourself.

Exchange rates

USD→EUR conversion uses the Frankfurter API, which serves European Central Bank reference rates published daily around 16:00 CET. Rates are cached locally to avoid redundant API calls. When the API is unreachable, the extension falls back to the fallback_rate from your config.

For backfill, the extension fetches the historical rate for each specific day, so you get accurate conversions even for past dates.

Rounding and minimums

Time entries are stored as start/end timestamps. The extension converts hours to minutes and rounds to the nearest whole minute, with a minimum of 1 minute:

All entries start at 09:00 UTC. The end time is calculated from the rounded duration. These timestamps are an API requirement and don’t reflect actual working hours.

One entry per client per project per day

The sync engine produces at most one time entry per client per project per day. If more events arrive later the same day, the next sync updates the existing entry rather than creating a new one. This keeps your time sheet clean and avoids fragmented entries.

Idempotent sync

Before creating an entry, the extension checks whether one already exists for the same (day, contact, project) combination:

Running “Sync Now” twice in a row produces no duplicates.

Weekly budget cap

Set a weekly AI cost limit per mapping (Pro). The extension tracks spend per repo and fires Cursor notifications at milestones: 25%, 50%, 75%, 85%, 95% as info alerts, escalating to a warning at 100% and every 10% beyond. Each milestone fires once per week per repo.

This is a soft cap — it never blocks AI usage, it just keeps you informed before you go over. Budget status is also visible on the Usage Dashboard with gauges showing spend vs. limit.