A method comprising: providing a user interface configured to manage event access policies, each event access policy in the event access policies including at least one field identifier received via the user interface, wherein a first event access policy of the event access policies includes a first field identifier; applying each of the event access policies to incoming transactions to generate event access records, wherein: event blocks (225, 220, 230) are written to a chainable event graph, the chainable event graph for storing event blocks (200, 225, 200, 230) in a plurality of chains, for the incoming transactions, each event block including a group identifier, content, and a hash; each event access policy in the event access policies includes said at least one field identifier; and at least some of the event access records generated have field values captured from the incoming transactions for the corresponding field identifiers thereto and group identifiers generated for the incoming transactions; receiving a query with at least one query parameter; identifying an event access record responsive to the query parameter, the event access record including the group identifier and a field (255, 260) matching the query parameter; locating potential responsive blocks, the potential responsive blocks being event blocks in a chain of the chainable event graph that include the group identifier, each of the potential responsive blocks also including content and a hash of a predecessor block in the chain; identifying a first block of the potential responsive blocks that has content that includes the field matching the query parameter; and providing the first block as a response to the query. providing a user interface configured to manage event access policies, each event access policy in the event access policies including at least one field identifier received via the user interface, wherein a first event access policy of the event access policies includes a first field identifier; applying each of the event access policies to incoming transactions to generate event access records, wherein: event blocks (225, 220, 230) are written to a chainable event graph, the chainable event graph for storing event blocks (200, 225, 200, 230) in a plurality of chains, for the incoming transactions, each event block including a group identifier, content, and a hash; each event access policy in the event access policies includes said at least one field identifier; and at least some of the event access records generated have field values captured from the incoming transactions for the corresponding field identifiers thereto and group identifiers generated for the incoming transactions; event blocks (225, 220, 230) are written to a chainable event graph, the chainable event graph for storing event blocks (200, 225, 200, 230) in a plurality of chains, for the incoming transactions, each event block including a group identifier, content, and a hash; each event access policy in the event access policies includes said at least one field identifier; and at least some of the event access records generated have field values captured from the incoming transactions for the corresponding field identifiers thereto and group identifiers generated for the incoming transactions; receiving a query with at least one query parameter; identifying an event access record responsive to the query parameter, the event access record including the group identifier and a field (255, 260) matching the query parameter; locating potential responsive blocks, the potential responsive blocks being event blocks in a chain of the chainable event graph that include the group identifier, each of the potential responsive blocks also including content and a hash of a predecessor block in the chain; identifying a first block of the potential responsive blocks that has content that includes the field matching the query parameter; and providing the first block as a response to the query.