[{"data":1,"prerenderedAt":412},["ShallowReactive",2],{"cms-page:audit-trail":3,"icon:alert-triangle":226,"icon:arrows-exchange":237,"icon:chart-bar":244,"icon:clipboard-check":257,"icon:file-text":267,"icon:flag":283,"icon:forms":290,"icon:gauge":309,"icon:message-report":322,"icon:microscope":332,"icon:notebook":354,"icon:refresh":364,"icon:route":371,"icon:school":381,"icon:signature":388,"icon:truck":392,"icon:user-shield":402},{"slug":4,"seo":5,"sections":8},"\u002Faudit-trail",{"title":6,"description":7},"Audit Trail & E-Signature Software | QAbility","An append-only audit trail with before-and-after values, and e-signatures that re-authenticate the signer and hash the signing details with SHA-256.",[9,23,93,182,202,220],{"type":10,"id":11,"eyebrow":12,"title":13,"highlight":14,"blurb":15,"actions":16},"hero","top","Audit trail & e-signatures","Changes are appended, never edited.","Signatures say what they mean.","Changes to quality records land in an audit trail the database will not let anyone edit or delete: who, when, which record, and the value before and after. At every sign-off point in the app, the signer re-enters an e-signature PIN, and the signature records its meaning.",[17,20],{"label":18,"href":19},"Book a demo","\u002Fcontact",{"label":21,"href":22},"See pricing","\u002Fpricing",{"type":24,"name":25,"id":26,"eyebrow":27,"title":28,"blurb":29,"data":30},"signature","anatomy","entry","Anatomy of an entry","One entry, taken apart","A real update to a nonconformance in the demo tenant, drawn as the audit log draws it. Each numbered part is a column on the audit row.",{"kind":26,"specimen":31,"callouts":48,"pipelineLabel":72,"pipeline":73,"statement":87,"answer":90},{"caption":32,"action":33,"record":34,"recordType":35,"actor":36,"at":37,"field":38,"before":39,"after":40,"hidden":41},"Audit log › NC-1227","Update","NC-1227","Nonconformance","Astrid Lindqvist","29 Sept 2026, 18:56","Description","Cosmetic defect above acceptance limit on Type I Borosilicate Vial 2R lot V2R-2478 Detected during routine operations at Uppsala Manufacturing. Immediate assessment performed and the affected material identified.","Cosmetic defect above acceptance limit on Type I Borosilicate Vial 2R lot V2R-2478 Detected during routine operations at Uppsala Manufacturing. Immediate assessment performed and the affected material identified. Update: 100% visual re-inspection of the 2,000-unit AQL sample found 41 units with airlines and 6 with stones (limit: 0 critical, 10 major); the defects cluster on two mould numbers (M07, M12), which points to the supplier forming line rather than transport damage.",[42,45],{"column":43,"label":44},"ip_address","The IP address the change came from",{"column":46,"label":47},"company_id","Your company",[49,53,57,61,65,69],{"label":50,"column":51,"text":52},"What happened","action","Create, update or delete, or a named step such as Close, Cancel or Approve when a status change maps to one.",{"label":54,"column":55,"text":56},"Which record","entity_type · entity_id","The record type and the record, shown by its number and linked to the record itself.",{"label":58,"column":59,"text":60},"Who","performed_by","The signed-in user whose session made the change. When a scheduled job changes a record, the entry is kept and reads “System”.",{"label":62,"column":63,"text":64},"When","performed_at","The server’s clock when the entry is written, just after the change commits. Never the user’s device clock.",{"label":66,"column":67,"text":68},"Before and after","old_value_json · new_value_json","The tracked fields as they were and as they became. For a nonconformance that is status, title, description, owner, site and department.",{"label":70,"column":43,"text":71},"Where from","Stored on every entry. It is not drawn in this view, but it goes into the CSV export and the printed record.","How the entry gets written",[74,77,81,84],{"label":75,"detail":76},"The record changes","From a screen, the API or a scheduled job. The table carries its own audit trigger.",{"label":78,"detail":79,"enforcedBy":80},"The entry is queued with it","The trigger queues the entry inside the same database transaction, so a change that rolls back leaves no entry behind.","db",{"label":82,"detail":83},"The worker writes it","Just after the change commits. Ids in the values are resolved to readable names where it can, and secrets such as passwords are redacted.",{"label":85,"detail":86,"enforcedBy":80},"It can only be read","An update or delete on an audit entry is refused by a trigger on the audit table.",{"label":88,"text":89,"enforcedBy":80},"Append-only, stated exactly","Entries are added and never altered. The audit table refuses every update and every delete, whoever sends it.",{"q":91,"a":92},"Is the trail hash-chained?","No. Entries are not cryptographically chained to one another, and we do not call the trail tamper-proof. What protects them is the database refusing any update or delete on the audit table, and the absence of any edit screen or write API for it. Signatures carry their own SHA-256 hash of the signing context, which is a separate thing.",{"type":24,"name":25,"id":24,"eyebrow":94,"title":95,"blurb":96,"data":97},"Anatomy of a signature","Prove it is you, say what you mean, and it is written against one record","Approving a document, closing a CAPA or nonconformance, disposing of a retain sample, recording a calibration and approving a log entry all open the same signature step.",{"kind":98,"steps":99,"row":133},"sequence",[100,107,120,127],{"title":101,"detail":102,"points":103,"enforcedBy":106},"Re-authenticate","The app asks the signer for their e-signature PIN, a secret separate from their login password. Being signed in is not enough to sign.",[104,105],"Five wrong PINs lock PIN signing for that user for 15 minutes","The signature service can also verify a password or a Google or Microsoft token","server",{"title":108,"detail":109,"chipsLabel":110,"chips":111},"State the meaning","The signature records what it asserts, in its own column, set by the action being signed: closing an NC signs Closed, a disposal signs Disposed, a calibration signs Performed.","Meanings in use",[112,113,114,115,116,117,118,119],"Approved","Rejected","Reviewed","Verified","Closed","Cancelled","Disposed","Performed",{"title":121,"detail":122,"points":123},"Write the row","One row in the signature ledger: the signer, the meaning, the time, the IP address and browser, and a SHA-256 hash of that signing context. It names exactly one thing it was given for.",[124,125,126],"The hash covers the signing context, not the record’s content","The signature row is itself audited: signer, meaning, time, hash and subject","Revoking a signature marks it revoked with a reason; the trail records the revoke",{"title":128,"detail":129,"points":130},"See it on the record","The record’s audit history shows the approval. Printed records carry an Approvals & Signatures block, built from those approval entries: action, signer, date and IP.",[131,132],"The printout appends the record’s recent audit history","A copy printed by someone without audit-trail access says the block was withheld, so it is never mistaken for an unsigned record",{"title":134,"table":135,"fields":136,"subject":164,"note":181},"One row in the signature ledger","signatures",[137,142,147,151,155,160],{"column":138,"label":139,"detail":140,"step":141},"user_id","Signer","The re-authenticated user.",1,{"column":143,"label":144,"detail":145,"step":146},"meaning","Meaning","What the signature asserts.",2,{"column":148,"label":149,"detail":150},"signed_at","Signed at","Server time at signing.",{"column":152,"label":153,"detail":154},"ip_address · user_agent","From","The IP address and browser it came from.",{"column":156,"label":157,"detail":158,"step":159},"payload_hash","Hash","SHA-256 of the signer, meaning, time, IP and, for most subject types, the subject.",3,{"column":161,"label":162,"detail":163},"is_revoked · revoked_reason","Revocation","A revoked signature stays on the row, marked, with its reason.",{"label":165,"detail":166,"columns":167,"enforcedBy":80},"Exactly one subject","Every row names one, and only one, of these. A row naming none, or two, is refused.",[168,169,170,171,172,173,174,175,176,177,178,179,180],"nc_id","capa_id","change_request_id","quality_event_id","specification_id","sampling_plan_id","retain_sample_id","equipment_id","record_id","field_record_revision_id","assignment_instance_id","task_instance_id","workflow_instance_step_id","Not in the ledger: training completions, which are verified by a manager on the training record. Only the audit trail is append-only; see the FAQ.",{"type":183,"id":183,"eyebrow":184,"title":185,"items":186},"faq","Straight answers","What auditors and IT ask first",[187,190,193,196,199],{"q":188,"a":189},"What does this do for 21 CFR Part 11?","It supplies technical controls that Part 11 addresses for audit trails and electronic signatures: an append-only trail with before-and-after values, and signatures with re-authentication, a recorded meaning and the signer’s identity on the record. Whether your system meets Part 11 depends on how you validate and operate it. Software alone cannot make that claim for you.",{"q":191,"a":192},"Are reads logged?","No. The trail records changes (creates, updates and deletes) on the tables that carry an audit trigger. Opening or viewing a record is not an audit event.",{"q":194,"a":195},"Is every field of every table in the trail?","No. Each audited table tracks a configured set of fields, the ones that matter for that record, and ignores housekeeping timestamps. Secrets such as passwords, tokens and assessment answer keys are redacted: the trail shows that they changed, not their values.",{"q":197,"a":198},"Is every action signed, with a reason for change?","No. Signatures are taken at defined sign-off points such as approvals, closures, disposals, calibrations and log entry reviews. Ordinary edits are captured in the audit trail with their before-and-after values rather than a mandatory reason for change.",{"q":200,"a":201},"Can a signature be deleted?","There is no delete action for signatures. A signature can be revoked by its signer or the company owner, with a written reason; the row stays, marked revoked, and the revoke is written to the audit trail. The signatures table does not carry the database trigger that the audit table does, so we describe only the audit trail as append-only.",{"type":203,"id":203,"eyebrow":204,"title":205,"rules":206},"ledger","The rules","What the trail and the ledger refuse",[207,210,213,216],{"rule":208,"detail":209,"enforcedBy":80},"Edit or delete an audit entry","A trigger on the audit table refuses every update and delete. There is no edit screen for the trail.",{"rule":211,"detail":212,"enforcedBy":106},"Write an audit entry by hand","The app’s GraphQL API exposes no insert, update or delete on the audit table. Entries come from the audit triggers.",{"rule":214,"detail":215,"enforcedBy":80},"A signature that names no record, or two","A check on the signatures table requires exactly one subject column to be set on every row.",{"rule":217,"detail":218,"enforcedBy":219},"Who reads and exports the trail","Reading the audit trail and exporting a record’s history to CSV are separate permissions you grant by role.","configure",{"type":221,"id":222,"eyebrow":223,"title":224,"action":225},"ctaPanel","cta","Walk into any audit ready","Show an auditor who changed it, and who signed it.",{"label":18,"href":19},[227,231,234],[228,229],"path",{"d":230},"M12 9v4",[228,232],{"d":233},"M10.363 3.591l-8.106 13.534a1.914 1.914 0 0 0 1.636 2.871h16.214a1.914 1.914 0 0 0 1.636 -2.87l-8.106 -13.536a1.914 1.914 0 0 0 -3.274 0",[228,235],{"d":236},"M12 16h.01",[238,241],[228,239],{"d":240},"M7 10h14l-4 -4",[228,242],{"d":243},"M17 14h-14l4 4",[245,248,251,254],[228,246],{"d":247},"M3 13a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v6a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -6",[228,249],{"d":250},"M15 9a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v10a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -10",[228,252],{"d":253},"M9 5a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v14a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -14",[228,255],{"d":256},"M4 20h14",[258,261,264],[228,259],{"d":260},"M9 5h-2a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2 -2v-12a2 2 0 0 0 -2 -2h-2",[228,262],{"d":263},"M9 5a2 2 0 0 1 2 -2h2a2 2 0 0 1 2 2a2 2 0 0 1 -2 2h-2a2 2 0 0 1 -2 -2",[228,265],{"d":266},"M9 14l2 2l4 -4",[268,271,274,277,280],[228,269],{"d":270},"M14 3v4a1 1 0 0 0 1 1h4",[228,272],{"d":273},"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2",[228,275],{"d":276},"M9 9l1 0",[228,278],{"d":279},"M9 13l6 0",[228,281],{"d":282},"M9 17l6 0",[284,287],[228,285],{"d":286},"M5 5a5 5 0 0 1 7 0a5 5 0 0 0 7 0v9a5 5 0 0 1 -7 0a5 5 0 0 0 -7 0v-9",[228,288],{"d":289},"M5 21v-7",[291,294,297,300,303,306],[228,292],{"d":293},"M12 3a3 3 0 0 0 -3 3v12a3 3 0 0 0 3 3",[228,295],{"d":296},"M6 3a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3",[228,298],{"d":299},"M13 7h7a1 1 0 0 1 1 1v8a1 1 0 0 1 -1 1h-7",[228,301],{"d":302},"M5 7h-1a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h1",[228,304],{"d":305},"M17 12h.01",[228,307],{"d":308},"M13 12h.01",[310,313,316,319],[228,311],{"d":312},"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",[228,314],{"d":315},"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",[228,317],{"d":318},"M13.41 10.59l2.59 -2.59",[228,320],{"d":321},"M7 12a5 5 0 0 1 5 -5",[323,326,329],[228,324],{"d":325},"M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12",[228,327],{"d":328},"M12 8v3",[228,330],{"d":331},"M12 14v.01",[333,336,339,342,345,348,351],[228,334],{"d":335},"M5 21h14",[228,337],{"d":338},"M6 18h2",[228,340],{"d":341},"M7 18v3",[228,343],{"d":344},"M9 11l3 3l6 -6l-3 -3l-6 6",[228,346],{"d":347},"M10.5 12.5l-1.5 1.5",[228,349],{"d":350},"M17 3l3 3",[228,352],{"d":353},"M12 21a6 6 0 0 0 3.715 -10.712",[355,358,361],[228,356],{"d":357},"M6 4h11a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-11a1 1 0 0 1 -1 -1v-14a1 1 0 0 1 1 -1m3 0v18",[228,359],{"d":360},"M13 8l2 0",[228,362],{"d":363},"M13 12l2 0",[365,368],[228,366],{"d":367},"M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4",[228,369],{"d":370},"M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4",[372,375,378],[228,373],{"d":374},"M3 19a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",[228,376],{"d":377},"M19 7a2 2 0 1 0 0 -4a2 2 0 0 0 0 4",[228,379],{"d":380},"M11 19h5.5a3.5 3.5 0 0 0 0 -7h-8a3.5 3.5 0 0 1 0 -7h4.5",[382,385],[228,383],{"d":384},"M22 9l-10 -4l-10 4l10 4l10 -4v6",[228,386],{"d":387},"M6 10.6v5.4a6 3 0 0 0 12 0v-5.4",[389],[228,390],{"d":391},"M3 17c3.333 -3.333 5 -6 5 -8c0 -3 -1 -3 -2 -3s-2.032 1.085 -2 3c.034 2.048 1.658 4.877 2.5 6c1.5 2 2.5 2.5 3.5 1l2 -3c.333 2.667 1.333 4 3 4c.53 0 2.639 -2 3 -2c.517 0 1.517 .667 3 2",[393,396,399],[228,394],{"d":395},"M5 17a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",[228,397],{"d":398},"M15 17a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",[228,400],{"d":401},"M5 17h-2v-11a1 1 0 0 1 1 -1h9v12m-4 0h6m4 0h2v-6h-8m0 -5h5l3 5",[403,406,409],[228,404],{"d":405},"M6 21v-2a4 4 0 0 1 4 -4h2",[228,407],{"d":408},"M22 16c0 4 -2.5 6 -3.5 6s-3.5 -2 -3.5 -6c1 0 2.5 -.5 3.5 -1.5c1 1 2.5 1.5 3.5 1.5",[228,410],{"d":411},"M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0",241564436]