Skip to main content
Beta Access RequiredPrice Change Events are currently in beta. To request early access, please contact our team by filling out our onboarding form.

Overview

Dialect offers two types of price change detection:
  1. Market-Based Price Changes: Track price movements over sliding time windows (e.g., “SOL is up 10% in 24h”)
  2. Trade-Based Price Changes: Personalized alerts relative to users’ actual trade prices (e.g., “SOL is up 50% since you bought”)
Both systems use complex threshold detection and advanced filtering to deliver only the most relevant alerts.

Market-Based Price Changes

Market-Based Price Changes are triggered by significant price movements of a token over sliding time windows using percentage change thresholds.

How It Works

Dialect continuously monitors token prices and analyzes percentage changes over sliding time windows. When a token’s price change exceeds the configured threshold within a time window, a webhook is triggered with detailed information about the price movement.

Sliding Window Analysis

Price changes are calculated using a sliding window approach:
  • Window Duration: Configurable time periods (1h, 3h, 6h, 12h, 24h, 7d)
  • Threshold: Percentage change required to trigger an event
  • Direction: Both upward and downward movements are detected

Supported Time Windows

WindowBeta StatusUse Case
1hFutureMomentum detection, immediate market shifts
3hAvailableShort-term trend confirmation
6hAvailableIntraday trend identification
12hAvailableHalf-day trend analysis
24hAvailableDaily price movement tracking
7dPlannedWeekly trend detection

Market-Based Webhook Payload

{
  "events": [
    {
      "event": "token_price_change",
      "timestamp": "2025-07-04T14:30:00Z",
      "token": {
        "symbol": "SOL",
        "address": "So11111111111111111111111111111111111111112"
      },
      "trigger": {
        "type": "sliding_window_percentage_change",
        "window": {
          "duration": "24h"
        },
        "threshold": 10.0
      },
      "change": {
        "direction": "up",
        "from": {
          "timestamp": "2025-07-03T14:30:00Z",
          "value": 154.25
        },
        "to": {
          "timestamp": "2025-07-04T14:30:00Z",
          "value": 171.85
        },
        "absolute": 17.6,
        "percentage": 11.42
      }
    }
  ]
}

Market-Based Field Details

Event Metadata
  • event: token_price_change
  • timestamp: ISO 8601 UTC timestamp when event was generated
Token Information
  • symbol: Token ticker symbol
  • address: Token mint address on Solana
Trigger Details
  • type: sliding_window_percentage_change
  • window: Sliding window configuration
    • duration: Time window used for the calculation (e.g., 1h, 3h, 6h, 12h, 24h, 7d)
  • threshold: The percentage change that must be crossed within the window to trigger the event
Change Information
  • direction: up for price increases, down for decreases
  • from: Price and timestamp at the start of the window
  • to: Price and timestamp at the end of the window
  • absolute: Raw price difference (to.value - from.value)
  • percentage: Percentage change over the window ((to.value - from.value) / from.value * 100)

Trade-Based Price Changes (Last Trade)

Trade-Based Price Changes are triggered by significant price movements of a token relative to a user’s actual trading history. They offer a more personalized approach to price change alerts, providing alerts based on a user’s buy/sell behavior rather than market-wide price movements.

How It Works

Please note that during the beta, we only support buy transactions that happened after the wallet was registered.
  1. Registration: Wallets must be explicitly registered to receive last trade events
  2. Trade Detection: System monitors all swap transactions for the wallet
  3. Anchor Points: Last buy price becomes the baseline for percentage calculations
  4. Threshold Monitoring: Price changes are evaluated against market cap-specific thresholds
  5. Event Triggering: Alerts fire when thresholds are crossed in either direction

Registration Process

Wallets must be explicitly registered to receive last trade events. During beta:
  • Get in touch with us by using our contact form
  • Projects provide wallet lists to Dialect for monitoring
  • No backfill of historical trades (monitoring starts from registration)

Trade-Based Threshold System

Thresholds are determined based on token market capitalization at the time of initial tracking:

Standard Position Thresholds

Market Cap RangeUptrend TriggersDowntrend Triggers
Large Cap (>$1B)+5%, +10%, then every +10%-5%, -10%, then every -10%
Mid Cap (50M50M-500M)+20%, +50%, then 2x, 3x, 4x…-20%, -30%, then every -10% until -90%
Small Cap (<$50M)+50%, then 2x, 3x, 4x…-20%, -30%, then every -10% until -90%
Micro Cap (<$1M)+50%, 2x, then every 1x-30%, -50%, -70%, -90%

Post-Exit Thresholds

After a full sell (100% position exit), different thresholds apply:
Market Cap RangeUptrend TriggerDowntrend Trigger
Large Cap (>$1B)+30%-30%
Mid Cap (50M50M-500M)2x-50%
Small Cap (<$50M)3x-50%
Micro Cap (<$1M)5x-70%

Event Triggering Rules

Threshold Crossing

  • Events trigger when price fully crosses a threshold
  • Same threshold cannot trigger twice consecutively
  • Price must cross another threshold before original can trigger again

Round Trip Detection

  • System tracks when price returns to previous thresholds
  • Generates contextual alerts like “TOKEN back to +50% from 2x”
  • Helps users understand retracement patterns

Multiple Threshold Handling

  • If multiple thresholds crossed in 5-minute window, only most significant triggers
  • Prioritizes largest movement (highest for uptrend, lowest for downtrend)

Trade-Based Webhook Payload

{
  "events": [
    {
      "event": "token_last_trade_price_change",
      "timestamp": "2025-09-17T16:03:10.259Z",
      "token": {
        "symbol": "TOKEN",
        "address": "TokenMintAddress..."
      },
      "walletAddress": "UserWalletAddress...",
      "trigger": {
        "type": "trade_percentage_change",
        "trade": {
          "type": "buy",
          "timestamp": "2024-01-15T10:00:00.000Z",
          "transactionId": "TxSignature...",
          "balance": {
            "before": 0,
            "after": 1000,
            "change": 1000
          }
        },
        "threshold": 50
      },
      "changes": {
        "triggerTrade": {
          "type": "trade_change",
          "trade": {
            "type": "buy",
            "timestamp": "2024-01-15T10:00:00.000Z",
            "transactionId": "TxSignature...",
            "balance": {
              "before": 0,
              "after": 1000,
              "change": 1000
            }
          },
          "change": {
            "direction": "up",
            "from": {
              "timestamp": "2024-01-15T10:00:00.000Z",
              "value": 1.00
            },
            "to": {
              "timestamp": "2025-09-17T16:03:10.259Z",
              "value": 1.50
            },
            "absolute": 0.50,
            "percentage": 50.0
          }
        },
        "lastTrade": {
          "type": "trade_change",
          "trade": {
            "type": "buy",
            "timestamp": "2024-01-15T10:00:00.000Z",
            "transactionId": "TxSignature...",
            "balance": {
              "before": 0,
              "after": 1000,
              "change": 1000
            }
          },
          "change": {
            "direction": "up",
            "from": {
              "timestamp": "2024-01-15T10:00:00.000Z",
              "value": 1.00
            },
            "to": {
              "timestamp": "2025-09-17T16:03:10.259Z",
              "value": 1.50
            },
            "absolute": 0.50,
            "percentage": 50.0
          }
        },
        "lastPeak": {
          "type": "peak_change",
          "change": {
            "direction": "down",
            "from": {
              "timestamp": "2025-09-17T12:00:00.000Z",
              "value": 2.00
            },
            "to": {
              "timestamp": "2025-09-17T16:03:10.259Z",
              "value": 1.50
            },
            "absolute": -0.50,
            "percentage": -25.0
          }
        }
      }
    }
  ]
}

Trade-Based Field Descriptions

Event Metadata
  • event: token_last_trade_price_change
  • timestamp: ISO 8601 UTC timestamp when event was generated
  • walletAddress: The wallet being monitored for this event
Token Information
  • symbol: Token ticker symbol
  • address: Token mint address on Solana
Trigger Details
  • type: trade_percentage_change
  • trade: The anchor trade (last buy or sell) used for calculations
    • type: buy or sell
    • timestamp: When the trade occurred
    • transactionId: Blockchain transaction signature
    • balance: Token balance changes
      • before: Balance before trade
      • after: Balance after trade
      • change: Net change (positive for buys, negative for sells)
  • threshold: The percentage threshold that was crossed
Change Information
  • triggerTrade: Price change from the anchor trade
  • lastTrade: Price change from most recent trade
  • lastPeak: Price change from previous alert threshold (optional)
    • Each contains:
      • direction: up or down
      • from/to: Start and end prices with timestamps
      • absolute: USD price difference
      • percentage: Percentage change

Edge Cases

Partial Sells

  • Last buy price remains the anchor
  • Partial sells don’t reset calculation baseline
  • Allows tracking performance of remaining position
  • If a subsequent buy occurs after a partial sell, that new buy immediately replaces the anchor; thresholds reset from the new buy price
  • When multiple trades happen within the same 5‑minute time window, lastTrade always refers to the chronologically latest trade

SOL Handling

  • Trade‑based SOL price changes are muted in MVP
  • SOL is treated as an investment vehicle rather than a tracked asset for trade‑based alerts
  • Market‑based SOL price change alerts remain available and are unaffected

Multiple Buys (DCA)

  • Only most recent buy price is used as anchor
  • No averaging across multiple purchases
  • We do not average across buys. Any new buy supersedes the prior anchor and restarts threshold tracking

Implementation Examples

Market-Based Price Change Handler

app.post('/webhook/price-events', (req, res) => {
  const event = req.body;

  // Send push notification to users holding this token
  sendPushNotification({
    title: `${event.token.symbol} ${event.change.direction === 'up' ? '📈' : '📉'} ${event.change.percentage.toFixed(1)}%`,
    body: `${event.token.symbol} moved ${event.change.percentage.toFixed(1)}% in the last ${event.trigger.window.duration}`,
    data: {
      tokenAddress: event.token.address,
      priceChange: event.change.percentage
    }
  });

  res.status(200).send('OK');
});

Trade-Based Price Change Handler

app.post('/webhook/last-trade-events', async (req, res) => {
  const { events } = req.body;

  for (const event of events) {
    const { walletAddress, token, trigger, changes } = event;

    // Determine alert message based on context
    let message;
    if (trigger.trade.type === 'buy' && !changes.lastPeak) {
      // Simple price change from buy
      message = `${token.symbol} is ${changes.triggerTrade.change.direction} ` +
        `${Math.abs(changes.triggerTrade.change.percentage).toFixed(1)}% ` +
        `since you bought`;
    } else if (changes.lastPeak) {
      // Round trip from previous threshold
      message = `${token.symbol} is back to ` +
        `${changes.triggerTrade.change.percentage > 0 ? '+' : ''}` +
        `${Math.abs(changes.triggerTrade.change.percentage).toFixed(1)}% ` +
        `from ${changes.lastPeak.change.percentage > 0 ? '+' : ''}` +
        `${Math.abs(changes.lastPeak.change.percentage).toFixed(1)}%`;
    }

    // Send personalized notification
    await sendUserNotification(walletAddress, {
      title: `${token.symbol} Price Alert`,
      body: message,
      data: {
        tokenAddress: token.address,
        currentPrice: changes.triggerTrade.change.to.value
      }
    });
  }

  res.status(200).send('OK');
});
I