diff --git a/monitor.py b/monitor.py
index f1faeb18..7ecddcb5 100644
--- a/monitor.py
+++ b/monitor.py
@@ -552,7 +552,7 @@ class EDLogs(FileSystemEventHandler):  # type: ignore # See below
                 self.state['Rebuy'] = None
                 self.state['Modules'] = None
 
-                self.state['Credits'] -= entry['ShipPrice']
+                self.state['Credits'] -= entry.get('ShipPrice', 0)
 
             elif event_type == 'ShipyardSwap':
                 self.state['ShipID'] = entry['ShipID']
@@ -604,17 +604,17 @@ class EDLogs(FileSystemEventHandler):  # type: ignore # See below
                     'Value':    entry['BuyPrice'],
                 }
 
-                self.state['Credits'] -= entry['BuyPrice']
+                self.state['Credits'] -= entry.get('BuyPrice', 0)
 
             elif event_type == 'ModuleRetrieve':
                 self.state['Credits'] -= entry.get('Cost', 0)
 
             elif event_type == 'ModuleSell':
                 self.state['Modules'].pop(entry['Slot'], None)
-                self.state['Credits'] += entry['SellPrice']
+                self.state['Credits'] += entry.get('SellPrice', 0)
 
             elif event_type == 'ModuleSellRemote':
-                self.state['Credits'] += entry['SellPrice']
+                self.state['Credits'] += entry.get('SellPrice', 0)
 
             elif event_type == 'ModuleStore':
                 self.state['Modules'].pop(entry['Slot'], None)
@@ -870,11 +870,11 @@ class EDLogs(FileSystemEventHandler):  # type: ignore # See below
                 name = self.canonicalise(entry['Name'])
                 self.state[category][name] += entry['Count']
 
-                self.state['Credits'] -= entry['Price']
+                self.state['Credits'] -= entry.get('Price', 0)
 
             elif event_type == 'SellMicroResources':
                 # Selling to a Bar Tender on-foot.
-                self.state['Credits'] += entry['Price']
+                self.state['Credits'] += entry.get('Price', 0)
                 # One event per whole sale, so it's an array.
                 for mr in entry['MicroResources']:
                     category = self.category(mr['Category'])
@@ -1197,10 +1197,10 @@ class EDLogs(FileSystemEventHandler):  # type: ignore # See below
 
             elif event_type == 'SellOrganicData':
                 for bd in entry['BioData']:
-                    self.state['Credits'] += bd['Value'] + bd['Bonus']
+                    self.state['Credits'] += bd.get('Value', 0) + bd.get('Bonus', 0)
 
             elif event_type == 'BookDropship':
-                self.state['Credits'] -= entry['Cost']
+                self.state['Credits'] -= entry.get('Cost', 0)
                 # Technically we *might* now not be OnFoot.
                 # The problem is that this event is recorded both for signing up for
                 # an on-foot CZ, and when you use the Dropship to return after the
@@ -1213,13 +1213,13 @@ class EDLogs(FileSystemEventHandler):  # type: ignore # See below
                 # event is going to be Disembark to on-foot anyway.
 
             elif event_type == 'BookTaxi':
-                self.state['Credits'] -= entry['Cost']
+                self.state['Credits'] -= entry.get('Cost', 0)
 
             elif event_type == 'CancelDropship':
-                self.state['Credits'] += entry['Refund']
+                self.state['Credits'] += entry.get('Refund', 0)
 
             elif event_type == 'CancelTaxi':
-                self.state['Credits'] += entry['Refund']
+                self.state['Credits'] += entry.get('Refund', 0)
 
             elif event_type == 'NavRoute':
                 # Added in ED 3.7 - multi-hop route details in NavRoute.json
@@ -1249,10 +1249,10 @@ class EDLogs(FileSystemEventHandler):  # type: ignore # See below
                 self.state['Cargo'][commodity] += entry.get('Count', 1)
 
                 if event_type == 'BuyDrones':
-                    self.state['Credits'] -= entry['TotalCost']
+                    self.state['Credits'] -= entry.get('TotalCost', 0)
 
                 elif event_type == 'MarketBuy':
-                    self.state['Credits'] -= entry['TotalCost']
+                    self.state['Credits'] -= entry.get('TotalCost', 0)
 
             elif event_type in ('EjectCargo', 'MarketSell', 'SellDrones'):
                 commodity = self.canonicalise(entry['Type'])
@@ -1262,10 +1262,10 @@ class EDLogs(FileSystemEventHandler):  # type: ignore # See below
                     cargo.pop(commodity)
 
                 if event_type == 'MarketSell':
-                    self.state['Credits'] += entry['TotalSale']
+                    self.state['Credits'] += entry.get('TotalSale', 0)
 
                 elif event_type == 'SellDrones':
-                    self.state['Credits'] += entry['TotalSale']
+                    self.state['Credits'] += entry.get('TotalSale', 0)
 
             elif event_type == 'SearchAndRescue':
                 for item in entry.get('Items', []):
@@ -1348,7 +1348,7 @@ class EDLogs(FileSystemEventHandler):  # type: ignore # See below
                     module['Engineering'].pop('ExperimentalEffect_Localised', None)
 
             elif event_type == 'MissionCompleted':
-                self.state['Credits'] += entry['Reward']
+                self.state['Credits'] += entry.get('Reward', 0)
 
                 for reward in entry.get('CommodityReward', []):
                     commodity = self.canonicalise(reward['Name'])
@@ -1435,74 +1435,75 @@ class EDLogs(FileSystemEventHandler):  # type: ignore # See below
 
             # Try to keep Credits total updated
             elif event_type in ('MultiSellExplorationData', 'SellExplorationData'):
-                self.state['Credits'] += entry['TotalEarnings']
+                self.state['Credits'] += entry.get('TotalEarnings', 0)
 
             elif event_type == 'BuyExplorationData':
-                self.state['Credits'] -= entry['Cost']
+                self.state['Credits'] -= entry.get('Cost', 0)
 
             elif event_type == 'BuyTradeData':
-                self.state['Credits'] -= entry['Cost']
+                self.state['Credits'] -= entry.get('Cost', 0)
 
             elif event_type == 'BuyAmmo':
-                self.state['Credits'] -= entry['Cost']
+                self.state['Credits'] -= entry.get('Cost', 0)
 
             elif event_type == 'CommunityGoalReward':
-                self.state['Credits'] += entry['Reward']
+                self.state['Credits'] += entry.get('Reward', 0)
 
             elif event_type == 'CrewHire':
-                self.state['Credits'] -= entry['Cost']
+                self.state['Credits'] -= entry.get('Cost', 0)
 
             elif event_type == 'FetchRemoteModule':
-                self.state['Credits'] -= entry['TransferCost']
+                self.state['Credits'] -= entry.get('TransferCost', 0)
 
             elif event_type == 'MissionAbandoned':
                 # Is this paid at this point, or just a fine to pay later ?
-                # self.state['Credits'] -= entry['Fine']
+                # self.state['Credits'] -= entry.get('Fine', 0)
                 pass
 
             elif event_type in ('PayBounties', 'PayFines', 'PayLegacyFines'):
-                self.state['Credits'] -= entry['Amount']
+                self.state['Credits'] -= entry.get('Amount', 0)
 
             elif event_type == 'RedeemVoucher':
-                self.state['Credits'] += entry['Amount']
+                self.state['Credits'] += entry.get('Amount', 0)
 
             elif event_type in ('RefuelAll', 'RefuelPartial', 'Repair', 'RepairAll', 'RestockVehicle'):
-                self.state['Credits'] -= entry['Cost']
+                self.state['Credits'] -= entry.get('Cost', 0)
 
             elif event_type == 'SellShipOnRebuy':
-                self.state['Credits'] += entry['ShipPrice']
+                self.state['Credits'] += entry.get('ShipPrice', 0)
 
             elif event_type == 'ShipyardSell':
-                self.state['Credits'] += entry['ShipPrice']
+                self.state['Credits'] += entry.get('ShipPrice', 0)
 
             elif event_type == 'ShipyardTransfer':
-                self.state['Credits'] -= entry['TransferPrice']
+                self.state['Credits'] -= entry.get('TransferPrice', 0)
 
             elif event_type == 'PowerplayFastTrack':
-                self.state['Credits'] -= entry['Cost']
+                self.state['Credits'] -= entry.get('Cost', 0)
 
             elif event_type == 'PowerplaySalary':
-                self.state['Credits'] += entry['Amount']
+                self.state['Credits'] += entry.get('Amount', 0)
 
             elif event_type == 'SquadronCreated':
                 # v30 docs don't actually say anything about credits cost
                 pass
 
             elif event_type == 'CarrierBuy':
-                self.state['Credits'] -= entry['Price']
+                self.state['Credits'] -= entry.get('Price', 0)
 
             elif event_type == 'CarrierBankTransfer':
-                self.state['Credits'] = entry['PlayerBalance']
+                if (newbal := entry.get('PlayerBalance')):
+                    self.state['Credits'] = newbal
 
             elif event_type == 'CarrierDecommission':
                 # v30 doc says nothing about citing the refund amount
                 pass
 
             elif event_type == 'NpcCrewPaidWage':
-                self.state['Credits'] -= entry['Amount']
+                self.state['Credits'] -= entry.get('Amount', 0)
 
             elif event_type == 'Resurrect':
-                self.state['Credits'] -= entry['Cost']
+                self.state['Credits'] -= entry.get('Cost', 0)
 
             return entry