Help /Reading the numbers

Settings and your data

Dividend tax, commission defaults, the capital model, row highlighting, and exporting, importing or deleting account data.

Everything on the settings page, and what it actually changes.

Dividend tax (%)

Withholding applied to dividends by default. It prefills the tax field when you record a dividend and can be overridden on any individual entry. Cash booked is shares × $/share × (1 − tax%).

Capital requirement model

Reg-T (margin account) or TIMS (portfolio margin). This is purely a display choice — both figures are computed and stored for every campaign on every trade write, so switching takes effect immediately everywhere, with nothing to recompute and no history rewritten. The mechanics of each are in P/L, capital and break-even.

Default commissions

Four fields: $/contract and min $/trade for options, $/share and min $/trade for stock. The charge applied is max(minimum, rate × quantity).

They fill in when a trade arrives with no explicit commission — a manual entry left blank, or an import row whose commission column is missing or implausible. Two things to know:

  • They are not retroactive. Trades already recorded at $0 stay at $0. Set these before importing a year of history, not after.
  • They are stored per trade, as a dollar amount. Changing the schedule later does not disturb what is already recorded — which is what you want, since your broker's rates change over time too.

Dashboard highlighting

Three checkboxes, all on by default, controlling which conditions turn a dashboard row pink: expiring today, assignment risk and VIX spike. Turn all three off and the feature is off. What each one fires on is in The dashboard.

Your data

Export

Export my data produces a single JSON file — every campaign, trade, portfolio, setting and support message on the account, with no filtering and no subset. Worth taking before any large reorganisation, and before deleting a campaign that might be wanted back. The file is named ironwheel-export-YYYYMMDD.json.

The export is account data in a portable format, so it is worth knowing how to read. The file is one JSON object with six top-level keys:

KeyWhat is in it
exported_at When the file was downloaded (UTC).
account Email, name, sign-up date, and which version of the terms was accepted. The Google account ID is deliberately left out — it identifies the account to Google, serves no purpose here, and this file ends up in a downloads folder.
settings Everything on this page: dividend tax, commission defaults, capital model, highlighting. Defaults are filled in, so nothing is missing merely because it was never changed.
portfolios Each portfolio's name and creation date.
campaigns Each campaign, with its trades nested inside it.
support_tickets Every message sent to support and any reply — including messages hidden from the support page.

What a trade looks like

Trades appear exactly as entered, not as the app worked them out — no FIFO matching, no realised P/L, no computed positions. One short put, taken from the example file below:

{
  "id": 90001,
  "campaign_id": 4101,
  "trade_type": "OPTION",
  "action": "SELL",
  "symbol": "NVDA",
  "quantity": 1,
  "price": 3.25,
  "commission": 0.65,
  "strike_price": 120.0,
  "expiration_date": "2026-03-20",
  "option_type": "PUT",
  "tax_rate": null,
  "created_at": "2026-02-02T21:00:00Z"
}

Reading the fields:

FieldMeaning
trade_type STOCK, OPTION or DIVIDEND.
action BUY or SELL. quantity is always positive; the direction lives here, not in the sign.
quantity Shares for stock, contracts for options.
price Per share, including for options — 3.25 is a contract that paid $325. Same convention as the trade form.
commission Absolute dollars on the trade. null on dividends.
strike_price, expiration_date, option_type Options only; null on anything else. Expiration is a plain YYYY-MM-DD date.
tax_rate Dividend withholding percent. Dividends only, null elsewhere.
created_at When the trade happened, in UTC.

Two conventions apply throughout the file, and matter when processing it with a script or a spreadsheet:

  • Every timestamp is UTC, written in ISO-8601 with a trailing Z — 2026-02-02T21:00:00Z. Expiration dates are the exception: a date such as 2026-03-20 is a calendar day, so it carries no time and no time zone.
  • Every trade carries the same fields in the same order, whether it is a stock, an option or a dividend. A field that does not apply — a strike price on a stock purchase, a commission on a dividend — is present and set to null rather than left out, so a parser can read one shape throughout.

A complete example

The file below is a full export for a fictional account: two portfolios, two campaigns, five trades covering every type, and one support message. Anything written to read the format can be developed against it.

{
  "exported_at": "2026-09-22T14:30:07Z",
  "account": {
    "id": 1001,
    "email": "alex.morgan@example.com",
    "name": "Alex Morgan",
    "created_at": "2025-11-14T09:21:03Z",
    "accepted_terms_at": "2026-07-26T08:02:44Z",
    "accepted_terms_version": "2026-07-25"
  },
  "settings": {
    "dividend_tax_rate": 0.0,
    "margin_model": "REG_T",
    "option_commission_per_contract": 0.0,
    "option_commission_min": 0.0,
    "stock_commission_per_share": 0.0,
    "stock_commission_min": 0.0,
    "highlight_expiring_today": true,
    "highlight_assignment_risk": true,
    "highlight_vix_spike": true
  },
  "portfolios": [
    {
      "name": "Income",
      "created_at": "2025-11-14T09:30:00Z"
    },
    {
      "name": "Retirement",
      "created_at": "2026-01-08T18:12:00Z"
    }
  ],
  "campaigns": [
    {
      "id": 4101,
      "name": "NVDA wheel",
      "campaign_type": "WHEEL",
      "underlying": "NVDA",
      "portfolio": "Income",
      "created_at": "2026-02-02T20:55:12Z",
      "trades": [
        {
          "id": 90001,
          "campaign_id": 4101,
          "trade_type": "OPTION",
          "action": "SELL",
          "symbol": "NVDA",
          "quantity": 1,
          "price": 3.25,
          "commission": 0.65,
          "strike_price": 120.0,
          "expiration_date": "2026-03-20",
          "option_type": "PUT",
          "tax_rate": null,
          "created_at": "2026-02-02T21:00:00Z"
        },
        {
          "id": 90002,
          "campaign_id": 4101,
          "trade_type": "STOCK",
          "action": "BUY",
          "symbol": "NVDA",
          "quantity": 100,
          "price": 120.0,
          "commission": 0.0,
          "strike_price": null,
          "expiration_date": null,
          "option_type": null,
          "tax_rate": null,
          "created_at": "2026-03-20T21:00:00Z"
        },
        {
          "id": 90003,
          "campaign_id": 4101,
          "trade_type": "OPTION",
          "action": "SELL",
          "symbol": "NVDA",
          "quantity": 1,
          "price": 2.8,
          "commission": 0.65,
          "strike_price": 130.0,
          "expiration_date": "2026-04-17",
          "option_type": "CALL",
          "tax_rate": null,
          "created_at": "2026-03-23T21:00:00Z"
        },
        {
          "id": 90004,
          "campaign_id": 4101,
          "trade_type": "DIVIDEND",
          "action": "BUY",
          "symbol": "NVDA",
          "quantity": 100,
          "price": 0.04,
          "commission": null,
          "strike_price": null,
          "expiration_date": null,
          "option_type": null,
          "tax_rate": 15.0,
          "created_at": "2026-03-27T21:00:00Z"
        }
      ]
    },
    {
      "id": 4102,
      "name": "TLT cash-secured puts",
      "campaign_type": "CASH_SECURED_PUT",
      "underlying": "TLT",
      "portfolio": "Retirement",
      "created_at": "2026-04-06T20:48:00Z",
      "trades": [
        {
          "id": 90005,
          "campaign_id": 4102,
          "trade_type": "OPTION",
          "action": "SELL",
          "symbol": "TLT",
          "quantity": 2,
          "price": 1.15,
          "commission": 1.3,
          "strike_price": 86.0,
          "expiration_date": "2026-05-15",
          "option_type": "PUT",
          "tax_rate": null,
          "created_at": "2026-04-06T21:00:00Z"
        }
      ]
    }
  ],
  "support_tickets": [
    {
      "category": "TICKER",
      "symbol": "ASTS",
      "message": "Could you add ASTS?",
      "status": "CLOSED",
      "reply": "Added — it should appear in the symbol search now.",
      "created_at": "2026-03-02T11:04:00Z",
      "replied_at": "2026-03-02T16:39:00Z"
    }
  ]
}

Import

Import data, below the export button, reads an export file back in — from this account or from another one. It reads two of the six keys: portfolios and campaigns, each campaign with its trades. Account details, settings and support messages in the file are ignored. A file written by a script in the same format imports the same way, so the example above doubles as a template.

Import only ever adds to the account. It follows five rules:

  • Portfolios are matched by name. An existing portfolio is reused. Any other is created, including one that a campaign refers to but the portfolios list omits. A campaign with no portfolio goes to Default.
  • Campaigns already on the account are skipped — same name, underlying and created_at. Importing the same file twice therefore adds nothing the second time. A campaign renamed since the export no longer matches, and is added again as a second copy.
  • Trades arrive exactly as recorded. Dates, prices, commissions and dividend tax all come from the file. Default commissions are not applied, and a null commission on a stock or option trade is stored as $0.
  • Ids are not reused. Every imported campaign and trade is given a new one, so id and campaign_id in the file are ignored.
  • The whole file is checked before anything is written. One invalid row rejects the file, and the error names the campaign and trade at fault, as in Campaign 2 ("TLT cash-secured puts"), trade 1: price must be a non-negative number.

The file can be up to 5 MB, which is roughly 12,000 trades.

Delete your account

Irreversible, with no soft-delete and no restore. It erases the account and every campaign, trade and portfolio in it. You confirm by retyping your account email exactly — a plain "are you sure" is not enough of a speed bump for something this final. Export first.

Deleting a single campaign is the smaller version of the same thing: it cascades to that campaign's trades and also cannot be undone.

Sign-in and privacy

Sign-in is Google OAuth — the app never sees or stores a password, and it holds no broker credentials, because it does not connect to your broker. Each account sees only its own data. Full detail in the privacy policy and terms of service; when the terms change you will be asked to accept the new version before continuing.

Missing a ticker?

Underlyings come from a supported list, which also supplies the dividend yield and risk-free rate used in pricing. If the symbol you want is not there, request it on the support page — that is what the ticker-request category is for. The same page takes bug reports and ideas, and replies come back to you there.

Something missing or wrong here? Tell us on the support page.