diff --git a/.vscode/settings.json b/.vscode/settings.json
index 3e31b5e..46dedec 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -18,5 +18,6 @@
   ],
   "[typescript]": {
     "editor.defaultFormatter": "denoland.vscode-deno"
-  }
+  },
+  "deno.enable": true
 }
diff --git a/supabase/functions/_db/interactions.ts b/supabase/functions/_db/interactions.ts
new file mode 100644
index 0000000..3cbf5f2
--- /dev/null
+++ b/supabase/functions/_db/interactions.ts
@@ -0,0 +1,48 @@
+import type { SupabaseClient } from "jsr:@supabase/supabase-js@2";
+import { Transaction } from "./transactions.ts";
+
+const INTERACTIONS_TABLE = "a_interactions";
+
+export const upsertInteraction = async (
+    client: SupabaseClient,
+    transaction: Pick<Transaction, "id" | "from" | "to">,
+) => {
+    const timestamp = new Date().toISOString();
+
+    // First direction: from->to
+     await client
+        .from(INTERACTIONS_TABLE)
+        .upsert(
+            {
+                transaction_id: transaction.id,
+                account: transaction.from,
+                with: transaction.to,
+                updated_at: timestamp,
+                created_at: timestamp,
+                new_interaction: true,
+            },
+            {
+                onConflict: "account,with",
+                ignoreDuplicates: false,
+            },
+        )
+        .select()
+        .single();
+
+    // Second direction: to->from
+    await client
+        .from(INTERACTIONS_TABLE)
+        .upsert({
+            transaction_id: transaction.id,
+            account: transaction.to,
+            with: transaction.from,
+            updated_at: timestamp,
+            created_at: timestamp,
+            new_interaction: true,
+        }, {
+            onConflict: "account,with",
+            ignoreDuplicates: false,
+        })
+        .select()
+        .single();
+};
diff --git a/supabase/functions/_db/transactions.ts b/supabase/functions/_db/transactions.ts
index 0166ea5..2efae2c 100644
--- a/supabase/functions/_db/transactions.ts
+++ b/supabase/functions/_db/transactions.ts
@@ -22,7 +22,7 @@ export interface TransactionWithDescription {
 
 const TRANSACTIONS_TABLE = "a_transactions";
 
-export const upsertTransaction = async (
+export const upsertTransaction = (
     client: SupabaseClient,
     transaction: Transaction,
 ) => {
@@ -35,8 +35,18 @@ export const upsertTransactionWithDescription = async (
     client: SupabaseClient,
     transaction: TransactionWithDescription,
 ) => {
-    return client.from(TRANSACTIONS_TABLE).upsert(transaction, {
-        onConflict: "id",
+    // check if exists
+    const { data: existingTransaction } = await client.from(TRANSACTIONS_TABLE)
+        .select("*").eq("id", transaction.id).maybeSingle();
+    if (existingTransaction) {
+        return client.from(TRANSACTIONS_TABLE).update({
+            description: transaction.description,
+        }).eq("id", transaction.id);
+    }
+
+    return client.from(TRANSACTIONS_TABLE).insert({
+        ...transaction,
+        hash: "",
     });
 };
 
@@ -44,6 +54,7 @@ export const getTransactionByHash = (
     client: SupabaseClient,
     hash: string,
 ): Promise<PostgrestSingleResponse<Transaction>> => {
+    // @ts-ignore: cryptic error
     return client.from(TRANSACTIONS_TABLE).select("*").eq("hash", hash)
         .maybeSingle();
 };
diff --git a/supabase/functions/process-tx-data/index.ts b/supabase/functions/process-tx-data/index.ts
index a01e176..5e73756 100644
--- a/supabase/functions/process-tx-data/index.ts
+++ b/supabase/functions/process-tx-data/index.ts
@@ -25,15 +25,15 @@ Deno.serve(async (req) => {
 
   const {
     hash,
-    extra_data,
+    data,
   } = record;
 
   // Initialize Supabase client
   const supabaseClient = getServiceRoleClient();
 
   let erc20TransferExtraData: ERC20TransferExtraData = { description: "" };
-  if (extra_data) {
-    erc20TransferExtraData = extra_data as ERC20TransferExtraData;
+  if (data) {
+    erc20TransferExtraData = data as ERC20TransferExtraData;
   }
 
   // insert transaction into db
diff --git a/supabase/functions/process-tx/index.ts b/supabase/functions/process-tx/index.ts
index 4c104c3..7a26798 100644
--- a/supabase/functions/process-tx/index.ts
+++ b/supabase/functions/process-tx/index.ts
@@ -12,6 +12,7 @@ import {
 } from "../_citizen-wallet/index.ts";
 import { getServiceRoleClient } from "../_db/index.ts";
 import { type Transaction, upsertTransaction } from "../_db/transactions.ts";
+import { upsertInteraction } from "../_db/interactions.ts";
 import { ensureProfileExists } from "../_citizen-wallet/profiles.ts";
 import {
   createOrder,
@@ -108,10 +109,16 @@ Deno.serve(async (req) => {
   }
 
   const { error } = await upsertTransaction(supabaseClient, transaction);
+
   if (error) {
     console.error("Error inserting transaction:", error);
   }
 
+  await upsertInteraction(
+    supabaseClient,
+    transaction,
+  );
+
   return new Response("notification sent", { status: 200 });
 });