[{"data":1,"prerenderedAt":405},["ShallowReactive",2],{"cms-page:security":3,"icon:alert-triangle":219,"icon:arrows-exchange":230,"icon:chart-bar":237,"icon:clipboard-check":250,"icon:file-text":260,"icon:flag":276,"icon:forms":283,"icon:gauge":302,"icon:message-report":315,"icon:microscope":325,"icon:notebook":347,"icon:refresh":357,"icon:route":364,"icon:school":374,"icon:signature":381,"icon:truck":385,"icon:user-shield":395},{"slug":4,"seo":5,"sections":8},"\u002Fsecurity",{"title":6,"description":7},"Security — controls, evidence and limits","The security controls in QAbility, how each one works, where to see it in the product, and where it stops. Plus the things we don’t offer yet.",[9,23,179,211],{"type":10,"id":11,"eyebrow":12,"title":13,"highlight":14,"blurb":15,"layout":16,"primary":17,"secondary":20},"pageHero","top","Security","Every control, with its evidence","and its limit.","Written for the person answering the vendor questionnaire. Each control below is in the product today, with where to see it and what it doesn’t cover.","buttons",{"label":18,"href":19},"Request the security pack","\u002Fcontact",{"label":21,"href":22},"Read the Part 11 checklist","\u002Fresources\u002Fpart-11-checklist",{"type":24,"id":25,"eyebrow":26,"title":27,"muted":28,"jumpLabel":29,"columns":30,"domains":35},"controlTable","controls","Control inventory","Controls by domain.","How each works, where to see it, and where it stops.","Jump to a domain",{"control":31,"how":32,"evidence":33,"limit":34},"Control","How it works","Where to see it","Limit",[36,69,93,113,138,156],{"id":37,"title":38,"summary":39,"media":40,"caption":41,"controls":42},"identity","Identity and sign-in","Who can get in, and how they prove it.","security.hero","Settings › Organization Security",[43,49,55,60,64],{"name":44,"how":45,"evidence":46,"enforcedBy":47,"limit":48},"Sign-in methods","Email and password, Google, or Microsoft. An admin chooses which are allowed, and the server refuses a sign-in by a method you have turned off.","Organization Security › Login methods","configure","Single sign-on to your own identity provider is not described here. Ask us.",{"name":50,"how":51,"evidence":52,"enforcedBy":53,"limit":54},"Password policy and lockout","Your policy sets length, character mix, a strength score, reuse history and expiry. Repeated wrong passwords lock the account for a set time.","Organization Security › Password policy","server","The known-breach check calls a public breach list and is skipped if that service can’t be reached.",{"name":56,"how":57,"evidence":58,"enforcedBy":53,"limit":59},"Multi-factor authentication","An authenticator app, with one-time recovery codes. Authenticator secrets are encrypted before they are stored.","Organization Security › MFA policy","Emailed codes are not offered as a second factor, because a mailbox is usually the password-reset channel too.",{"name":61,"how":62,"evidence":58,"enforcedBy":47,"limit":63},"MFA policy","Optional, required for admins, or required for everyone, with a grace period to enroll. It is checked at sign-in.","Optional until you set it.",{"name":65,"how":66,"evidence":67,"enforcedBy":53,"limit":68},"Session limits","Idle and absolute timeouts per company (30 minutes and 12 hours by default). People see their own sessions and sign-in history and can end them.","Organization Security › Sessions; Security › Active sessions","A “remember me” sign-in lasts longer; you can turn it off.",{"id":70,"title":71,"summary":72,"controls":73},"access","Access control","What each person may do once they are in.",[74,82,88],{"name":75,"how":76,"evidence":77,"enforcedBy":53,"limit":78,"link":79},"Roles by module, action and scope","A role grants actions per module, each at a scope: own, department, site or company-wide. The server asks one permission function in the database before acting.","Settings › Roles","Own, department and site scopes exist only where the record carries that field.",{"label":80,"href":81},"Governance","\u002Fgovernance",{"name":83,"how":84,"evidence":85,"enforcedBy":86,"limit":87},"Permission change ledger","Each grant, revoke, scope change or new admin is written with the actor, old and new scope, reason and IP. The database refuses edits and deletes to it.","Roles › Access history","db","Grants written by initial setup or App Builder promotion are not ledger events.",{"name":89,"how":90,"evidence":91,"enforcedBy":47,"limit":92},"Admin security actions","Admins can unlock an account, reset its MFA, force a password reset or sign-out, and suspend or reactivate a user. Sign-in events are append-only.","Settings › Security Center","Deciding when to use them is part of your access procedure.",{"id":94,"title":95,"summary":96,"controls":97},"isolation","Tenant isolation and transport","Keeping one company’s records away from another’s.",[98,103,108],{"name":99,"how":100,"evidence":101,"enforcedBy":53,"limit":102},"Company scoping on the server","Each company-scoped request resolves your company from the session, checks your membership, and scopes its queries to that company.","Server checks, shown in a technical walkthrough","A server-side check. The row-level policies below add a second layer on the GraphQL path.",{"name":104,"how":105,"evidence":106,"enforcedBy":86,"limit":107},"Row-level security","The GraphQL data layer runs as a restricted database role, under PostgreSQL row-level security policies on company-scoped tables.","Database policies, shown in a technical walkthrough","REST endpoints rely on the server checks above. Row-level security is not switched on for that path by default.",{"name":109,"how":110,"evidence":111,"enforcedBy":53,"limit":112},"Encrypted in transit","The app is served over HTTPS; plain HTTP is redirected.","Your browser’s certificate details","We don’t publish encryption-at-rest or key-management claims yet.",{"id":114,"title":115,"summary":116,"media":117,"caption":118,"controls":119},"records","Records and audit trail","What happens to a record after it is written.","audit-trail.tamperEvident","Audit Logs › NC-1227 · Update",[120,128,133],{"name":121,"how":122,"evidence":123,"enforcedBy":86,"limit":124,"link":125},"Change capture","A database trigger on each company-scoped table queues every insert, update and delete, with the user and IP, as part of the change. A worker then writes the entry with the before and after values.","Audit Logs; each record’s history","Records the fields tracked for each table, not every column. Reads are not logged. The entry is written just after the change.",{"label":126,"href":127},"Audit trail","\u002Faudit-trail",{"name":129,"how":130,"evidence":131,"enforcedBy":86,"limit":132},"Append-only audit log","The database refuses any update or delete to an audit entry.","An entry has no edit or delete control","Entries are not hash-chained.",{"name":134,"how":135,"evidence":136,"enforcedBy":86,"limit":137},"Lifecycle guards","Nonconformances, CAPAs, change requests, documents, quality events, complaints and audits move only along their own states. The database refuses any other move.","Ask to see a refused move in a demo","The guards cover the status, not the content of other fields.",{"id":139,"title":140,"summary":141,"media":142,"caption":143,"narrow":144,"controls":145},"signatures","Electronic signatures","Proving who signed, and what they meant.","home.refuse.signature","E-signature · PIN re-entry",true,[146,151],{"name":147,"how":148,"evidence":149,"enforcedBy":53,"limit":150},"Re-authentication with a signature PIN","At every sign-off point in the app, the signer re-enters a signature PIN that is separate from the login password and stored only as a hash. Five wrong PINs lock signing for 15 minutes.","The signing dialog","Keeping PINs personal is part of your signature procedure.",{"name":152,"how":153,"evidence":154,"enforcedBy":86,"limit":155},"The signature record","Each signature stores its meaning, time, IP, browser and a SHA-256 hash of the signing details. A database constraint binds it to exactly one record.","The record’s approvals and its printed copy","The hash covers who, what, when and where, not the record’s content, and isn’t re-checked automatically. A signature can be revoked with a reason; nothing in the app deletes one.",{"id":157,"title":158,"summary":159,"controls":160},"external","People outside your company","Auditors, suppliers and integrations.",[161,166,174],{"name":162,"how":163,"evidence":164,"enforcedBy":53,"limit":165},"Protected share links","A shared record opens only with the link plus a one-time code sent to the address on the share. Codes last 10 minutes and burn after five wrong tries; links last 30 days.","Settings › Shared Records","Anyone who controls that mailbox can open the share.",{"name":167,"how":168,"evidence":169,"enforcedBy":86,"limit":170,"link":171},"Supplier logins","Supplier users are invited with no roles, and see their own supplier’s requests and documents plus what you share with them.","A supplier’s Users tab","Someone with user-management rights can still give a supplier login a role.",{"label":172,"href":173},"Suppliers","\u002Fsuppliers",{"name":175,"how":176,"evidence":177,"enforcedBy":47,"limit":178},"Service accounts for integrations","An integration uses an API key owned by a service account, which has its own roles, no email and no password. Its changes are attributed to it in the audit trail.","Settings › Service Accounts","No published public API reference yet.",{"type":180,"id":181,"eyebrow":182,"title":183,"muted":184,"items":185,"note":210},"controlGaps","not-offered","Straight answers","What we don’t offer (yet).","Better you read it here than find it in a review.",[186,189,192,195,198,201,204,207],{"title":187,"detail":188},"SOC 2 or ISO 27001 attestation","We have no audit engagement today.",{"title":190,"detail":191},"A third-party penetration test report","None to share yet.",{"title":193,"detail":194},"Backup and disaster-recovery commitments","We don’t publish recovery point or recovery time objectives.",{"title":196,"detail":197},"An uptime figure or SLA","We don’t publish one.",{"title":199,"detail":200},"Encryption-at-rest and key-management statements","Not published. Transport is HTTPS, as above.",{"title":202,"detail":203},"Self-hosted or dedicated deployment","QAbility runs as a shared, multi-company service.",{"title":205,"detail":206},"Automated user provisioning (SCIM)","Accounts are invited and managed in the app.",{"title":208,"detail":209},"A public API reference and outbound webhooks","Integrations run through service accounts we set up with you.","No dates are promised here. Single sign-on to your own identity provider is a conversation: ask us where it stands for your setup.",{"type":212,"id":213,"title":214,"muted":215,"primary":216,"secondary":217},"ctaBand","cta","Request the security pack.","Tell us what your review needs to see.",{"label":18,"href":19},{"label":218,"href":19},"Book a demo",[220,224,227],[221,222],"path",{"d":223},"M12 9v4",[221,225],{"d":226},"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",[221,228],{"d":229},"M12 16h.01",[231,234],[221,232],{"d":233},"M7 10h14l-4 -4",[221,235],{"d":236},"M17 14h-14l4 4",[238,241,244,247],[221,239],{"d":240},"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",[221,242],{"d":243},"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",[221,245],{"d":246},"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",[221,248],{"d":249},"M4 20h14",[251,254,257],[221,252],{"d":253},"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",[221,255],{"d":256},"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",[221,258],{"d":259},"M9 14l2 2l4 -4",[261,264,267,270,273],[221,262],{"d":263},"M14 3v4a1 1 0 0 0 1 1h4",[221,265],{"d":266},"M17 21h-10a2 2 0 0 1 -2 -2v-14a2 2 0 0 1 2 -2h7l5 5v11a2 2 0 0 1 -2 2",[221,268],{"d":269},"M9 9l1 0",[221,271],{"d":272},"M9 13l6 0",[221,274],{"d":275},"M9 17l6 0",[277,280],[221,278],{"d":279},"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",[221,281],{"d":282},"M5 21v-7",[284,287,290,293,296,299],[221,285],{"d":286},"M12 3a3 3 0 0 0 -3 3v12a3 3 0 0 0 3 3",[221,288],{"d":289},"M6 3a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3",[221,291],{"d":292},"M13 7h7a1 1 0 0 1 1 1v8a1 1 0 0 1 -1 1h-7",[221,294],{"d":295},"M5 7h-1a1 1 0 0 0 -1 1v8a1 1 0 0 0 1 1h1",[221,297],{"d":298},"M17 12h.01",[221,300],{"d":301},"M13 12h.01",[303,306,309,312],[221,304],{"d":305},"M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0",[221,307],{"d":308},"M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0",[221,310],{"d":311},"M13.41 10.59l2.59 -2.59",[221,313],{"d":314},"M7 12a5 5 0 0 1 5 -5",[316,319,322],[221,317],{"d":318},"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",[221,320],{"d":321},"M12 8v3",[221,323],{"d":324},"M12 14v.01",[326,329,332,335,338,341,344],[221,327],{"d":328},"M5 21h14",[221,330],{"d":331},"M6 18h2",[221,333],{"d":334},"M7 18v3",[221,336],{"d":337},"M9 11l3 3l6 -6l-3 -3l-6 6",[221,339],{"d":340},"M10.5 12.5l-1.5 1.5",[221,342],{"d":343},"M17 3l3 3",[221,345],{"d":346},"M12 21a6 6 0 0 0 3.715 -10.712",[348,351,354],[221,349],{"d":350},"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",[221,352],{"d":353},"M13 8l2 0",[221,355],{"d":356},"M13 12l2 0",[358,361],[221,359],{"d":360},"M20 11a8.1 8.1 0 0 0 -15.5 -2m-.5 -4v4h4",[221,362],{"d":363},"M4 13a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4",[365,368,371],[221,366],{"d":367},"M3 19a2 2 0 1 0 4 0a2 2 0 0 0 -4 0",[221,369],{"d":370},"M19 7a2 2 0 1 0 0 -4a2 2 0 0 0 0 4",[221,372],{"d":373},"M11 19h5.5a3.5 3.5 0 0 0 0 -7h-8a3.5 3.5 0 0 1 0 -7h4.5",[375,378],[221,376],{"d":377},"M22 9l-10 -4l-10 4l10 4l10 -4v6",[221,379],{"d":380},"M6 10.6v5.4a6 3 0 0 0 12 0v-5.4",[382],[221,383],{"d":384},"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",[386,389,392],[221,387],{"d":388},"M5 17a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",[221,390],{"d":391},"M15 17a2 2 0 1 0 4 0a2 2 0 1 0 -4 0",[221,393],{"d":394},"M5 17h-2v-11a1 1 0 0 1 1 -1h9v12m-4 0h6m4 0h2v-6h-8m0 -5h5l3 5",[396,399,402],[221,397],{"d":398},"M6 21v-2a4 4 0 0 1 4 -4h2",[221,400],{"d":401},"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",[221,403],{"d":404},"M8 7a4 4 0 1 0 8 0a4 4 0 0 0 -8 0",241564436]