Skip to content

Trading journal

A trading journal collects every alert in one place where you review it later: when did it come, at what price, and did you trade? Bellchain writes every alert as a row into Notion, Airtable or Google Sheets. The journal comes with the Pro plan. It keeps running while your alerts are muted, and test alerts arrive with the “Test” box ticked.

Bellchain fills the columns your table has, by their name, in English or German, regardless of upper and lower case:

Column also Content
Alert ID ID, Kennung unique ID of the alert; with it, an alert never appears twice
Time Date, Zeit close of the candle on which the chain triggered
Chain Kette name of the chain
Pair Coin, Symbol, Paar such as BTC/USDT
Timeframe Interval, Zeiteinheit such as 1h
Price Kurs price at trigger time
Message Text, Nachricht the action’s message without highlighting
Values Werte such as “RSI 14: 28.7 · Price: $117,234”
Test ticked for test alerts

The first column (in Notion the title) gets the chain and pair unless it already is one of the columns above. Columns with other names stay free for your notes, such as “Traded” or “Result”.

  1. Create a database in Notion, such as “Trading journal”, with the columns from the table above: ideally Time as a date, Price as a number, Pair as a select, Alert ID as text and Test as a checkbox.

  2. Open notion.so/profile/integrations, create an internal integration, such as “Bellchain”, with the capability “Insert content”, and copy the token (starts with ntn_).

  3. Open the database, click … at the top right, then Connections, and add the “Bellchain” integration.

  4. Drag the Notion node onto the board in the editor, enter the token and the database’s address from the browser, and click Send test in the properties.

Notion stores data in the USA. Notion allows about three requests per second; beyond that Bellchain waits and tries again.

  1. Create a table in Airtable, such as “Journal”, with fields such as Time (date with time), Price (number), Pair (single select), Alert ID (text) and Message (long text).

  2. Open airtable.com/create/tokens and create a personal access token with the scopes data.records:read, data.records:write and schema.bases:read, for this base only.

  3. Drag the Airtable node onto the board in the editor, enter the token and the table’s address from the browser (it contains app… and tbl…) and click Send test.

Airtable’s Free plan has only 1,000 calls per month; every alert needs one, plus at most one per hour for the fields. Once the allowance is used up, Bellchain stops instead of trying again. Airtable stores data in the USA.

Without connecting an account, with a small script in your spreadsheet:

  1. Create a new spreadsheet in Google Sheets, such as “Trading journal”. The script writes the header row itself on the first alert.

  2. Open Extensions → Apps Script, delete the sample code and paste this script:

    function doPost(e) {
    const alert = JSON.parse(e.postData.contents);
    const lock = LockService.getScriptLock();
    lock.waitLock(20000);
    try {
    const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
    if (sheet.getLastRow() === 0) sheet.appendRow(['Alert ID', 'Time', 'Chain', 'Pair', 'Timeframe', 'Price', 'Message', 'Values', 'Test']);
    const ids = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues().flat();
    if (!ids.includes(alert.id)) {
    const values = alert.values.map((v) => v.label + ': ' + v.text).join(' · ');
    const message = alert.message.replace(/\*\*|`/g, '');
    sheet.appendRow([alert.id, new Date(alert.time), alert.chain.name, alert.pair, alert.timeframe, alert.price, message, values, alert.test]);
    }
    } finally {
    lock.releaseLock();
    }
    return ContentService.createTextOutput('ok');
    }
  3. Click Deploy → New deployment, type Web app, “Execute as: Me”, “Who has access: Anyone”, confirm the permissions and copy the address ending in /exec.

  4. Drag the Google Sheets node onto the board in the editor, enter the address and click Send test. The spreadsheet then has a row marked “Test”.

Anyone who knows the address can add rows; that is why it stays empty when you export a chain. If you change the script, you need a new deployment, and the address only stays the same if you edit the existing one under Manage deployments.

Reason in the history Meaning
notion_token_invalid, airtable_token_invalid The token is wrong or deleted.
notion_not_shared The database is not shared with the integration (step 3).
airtable_forbidden, airtable_not_found The token lacks rights or the base, or the table does not exist.
notion_invalid, airtable_invalid A value does not fit a column, such as text in a number; detail names the column.
airtable_limit Airtable’s monthly allowance is used up.
sheets_script_unavailable The deployment is missing or not shared with “Anyone”.
…_rate_limited, …_unavailable, …_network The service is slowing down or was not reachable; Bellchain tries again later, without duplicate rows.

Version 2026.10.25.16 · Changelog