oddly

How oddly thinks

A governance layer for commerce automation.


Most tools tell you what they did. oddly tells you what it proposes, why, and what happens if you say yes, before anything moves. This is the model underneath. Read it and decide for yourself.

01 / Determinism

Deterministic, not inference.

Every recommendation oddly surfaces is produced by a fixed rule applied to a signal you connected. The same inputs always produce the same output.

oddly does not guess and it does not predict. There is no black box deciding what is wrong with your account. When a card appears, it appears because a specific condition in your data was met: a campaign held a sustained return shortfall, a keyword spent without converting, a top product walked toward a stockout. No AI guessing. A rule, a signal, a number you can check.

That is the trade. oddly will not invent an insight that is not in the data, and in exchange you get something rarer than cleverness: you get to verify it. Every card traces back to the exact signal that triggered it.

02 / The iron rule

Spend can pause, reduce, or stop. It never auto-increases.

This is the one constraint everything else is filtered through, and it is not a setting you can toggle. It is hardcoded into how oddly is built.

oddly can pause an ad, reduce a bid, or block a bleeding campaign on its own. It cannot raise your budget on its own. Not by a dollar, not ever, regardless of tier or automation level. If more spend would genuinely help, oddly shows you the evidence and hands you the button. The increase decision stays with you.

Decrease-only is the spine of the whole model, not a safety feature bolted on the side. It is enforced at the lowest level: the connectors that touch Google and Meta do not expose an increase path at all, and the build fails if anyone tries to add one. The product cannot spend more of your money than you told it to.

03 / Held-mutate

Nothing changes without a dry-run and your approval.

Before oddly changes anything in a live account, it runs the change as a dry-run, shows you the exact operation, and holds it. The change is made only when you approve it, and it can be reversed.

A proposed change moves through a held pipeline. oddly verifies the plan against the live account, you see precisely what will happen and the rule that decided it, and only then does it execute. Every executed change carries a path back.

1 Propose

A rule matches a signal and drafts the exact change.

2 Dry-run

The plan is verified against the live account. Nothing has moved yet.

3 Approved

You say yes. Only now does the change execute.

4 Reversible

The change carries a path back if you change your mind.

04 / The audit trail

The audit trail is a contract, not a log.

Every signal read, every rule fired, every plan proposed, and every change made is recorded in an order you can inspect. It is meant to be read, not buried.

An internal log exists to help engineers debug. An audit trail exists to answer one question for the operator: what did you do to my account, and why. oddly treats it as the second thing. Here is the shape of one, for a single change:

Sample audit trail · illustrative

09:02:11Signal read Google Ads: campaign "Spring Prospecting", 21-day return on ad spend 0.7x, below the floor.
09:02:11Rule fired Sustained return shortfall. Candidate: reduce daily budget.
09:02:12Plan proposed Reduce daily budget S$40 to S$24. Decrease-only check passed. Held for approval.
10:14:07Approved by operator Dry-run confirmed against live account.
10:14:08Change executed Budget set to S$24. Reversal path recorded.

Illustrative figures. A real trail shows your accounts, your numbers, your timestamps.

05 / The rule catalog

Every rule oddly runs, in the open.

There is nothing to take on faith. This is the full set of deterministic rules in the engine right now, grouped by the source they read. Pulled straight from the registry the product runs on.

19 deterministic rules across 5 connected sources, each one a fixed condition on data you connect.

Google Ads 6 rules

Google Ads campaign with sustained ROAS shortfall: propose budget reduction.
Google Ads keyword with low Quality Score and material spend, or rarely-served: pause.
Google Ads conversion action with material volume but no Shopify match: flag misattribution.
Google Ads search term wasting spend with zero conversions: add as negative keyword.
Google Ads platform recommendation that should be dismissed (e.g. raise budgets, broad match).
GSC organic query with strong impressions but no paid keyword coverage: bid on it.

HubSpot 3 rules

Ad channel with cost per qualified lead far above the cross-source average: review allocation.
Paid-acquired contacts dormant 30+ days: re-engage or exclude from paid audiences.
Ad source closes meaningfully faster than another: shift budget toward faster channel.

Judge.me reviews 2 rules

Product with high review rating and review volume: promote in ads / merchandising.
Recent orders far outpace review submissions: trigger review-request campaign.

Meta Ads 5 rules

Meta ad set where CAC exceeds the store's average unit margin: pause to stop per-order losses.
Meta ad set with declining ROAS and frequency saturation: refresh creative or audience.
Meta ad set with sustained ROAS shortfall: propose budget reduction.
Active in-stock product with order activity but no Meta ads coverage: add to catalog or launch ad.
Meta ad with rising frequency and falling CTR: rotate creative.

Shopify 3 rules

Material abandoned-checkout volume with no recovery email configured: enable recovery.
Top-revenue product approaching stockout: reorder to restore days of cover.
Slow-moving product with excess days of cover: drive demand (email feature, collection, bundle, page refresh, UGC) before any discount or archive.

Built the way it ships

The product governs spend. The build is governed the same way.

oddly asks a merchant to let a system change a live account only under guardrails, with a dry-run, and on the record. It would be strange to build it any other way. So it is not built any other way.

The same three commitments the product makes to a merchant are the ones the build runs on. The decrease-only rule is not a slogan in the copy; it is a check that fails the build if a spend-increase path is ever added. The state of the system is established before behaviour is layered on it. Every change ships behind a gate that has to pass before it merges. Not claimed: enforced.

Deterministic

Fixed rules on observed signals. The same inputs reach the same output, in the product and in the pipeline that ships it.

Audit-state-first

The recorded state is the source of truth. Behaviour is built on top of it, never around it.

Guardrailed

The constraints that protect a merchant's spend are the same kind of constraints that gate every change before it goes live.

See it on your own accounts.

Connect your store and ad accounts. The free tier watches and explains, and never expires. You approve every change.