Faits :
A.
A.a. A._ SA, anciennement A1._ Sàrl, est une société ayant pour but le développement, la distribution et l'installation de produits technologiques.
B._ Sàrl est une société dont le but consiste notamment en l'achat, la vente et le négoce de biens immobiliers, ainsi que la fourniture de services et d'investissements dans l'immobilier en tant que propriétaire, sous-traitant ou entreprise générale.
A.b. Le 23 novembre 2015, alors que B._ Sàrl agissait en qualité d'entreprise générale dans le cadre d'un projet de construction situé à xxx, elle a conclu avec A._ SA un contrat portant sur la vente et l'installation de six ascenseurs à voitures. Ces derniers consistaient en deux plateformes superposées: pour y installer son véhicule, l'utilisateur devait d'abord " faire sortir " de terre la plateforme inférieure, puis, après y avoir placé son véhicule, la faire redescendre sous terre.
Le contrat prévoyait le respect de la Directive 2006/42/CE du Parlement européen et du Conseil du 17 mai 2006 relative aux machines (ci-après: Directive 2006/42/CE). Il mentionnait également la fourniture de certains documents, dont un certificat CE. Le prix forfaitaire convenu s'élevait à 300'000 fr. Il devait intervenir en trois acomptes; le dernier, de 75'000 fr., était exigible dans les trente jours suivant la fin de l'installation et des tests.
S'agissant de l'obtention du permis de construire, le contrat indiquait " ce qui reste à prévoir: permis de construire [...]. "
Les conditions générales de vente (ci-après: CGV) de A._ SA ont été intégrées au contrat. L'art. 16 CGV était libellé comme suit:
" Les réclamations doivent être annoncées par écrit dans les 2 semaines à compter de la réception de la marchandise et avant leur [sic] transformation. Lors de la réception de la livraison, l'acheteur doit contrôler que la livraison est complète et d'une qualité suffisante. Les différences ou défauts éventuels doivent être mentionnés sur les documents de livraison. Si des écarts sont constatés par rapport à la facture établie, les réclamations doivent être formulées par écrit au plus tard une semaine à compter de la réception de la facture. Dans le cas contraire, la marchandise et la facture sont considérées comme acceptées. [...] "
A.c. Le permis de construire avait été délivré préalablement le 8 juin 2015 par le Département des constructions du canton de Bâle-Ville (ci-après: le Département). Le chiffre 11 du permis disposait notamment que des parapets, garde-corps ou mains courantes devaient être construits selon la norme SIA 358, conformément à la situation de risque correspondante.
A.d. B._ Sàrl s'est acquittée du premier acompte le 26 novembre 2015 et du deuxième le 25 avril 2016.
A.e. A._ SA a installé les six ascenseurs à voitures et les a terminés en date du 23 février 2017. C._, directeur de A._ SA, et D._, associé gérant de B._ Sàrl, ont déclaré lors de leur audition devant le tribunal de première instance que la remise des installations avait eu lieu fin janvier-début février 2017. D._ a précisé qu'au cours de l'inspection du bâtiment effectuée le 1er février 2017 par les parties en présence d'un inspecteur du Département, ce dernier avait émis des doutes concernant la sécurité des plateformes. B._ Sàrl avait alors demandé à A._ SA si elle pouvait lui certifier que les normes de sécurité étaient respectées. A._ SA n'avait pas fourni de document à cet égard pouvant être remis à l'inspecteur. D._ a ajouté qu'après l'inspection du 1er février 2017, il n'y avait pas eu réception des ascenseurs par le Département.
A.f. Le 24 février 2017, A._ SA a fait parvenir à B._ Sàrl une facture relative à la dernière tranche de paiement de 75'000 fr. Le 16 mars 2017, B._ Sàrl s'est acquittée de la moitié de cette somme, soit 37'500 fr. Le 17 mars 2017, A._ SA a envoyé une nouvelle facture concernant des frais de déplacement et d'hébergement pour un montant de 9'349 fr. 35. B._ Sàrl ne l'a pas payée.
A.g. Le 23 mars 2017, A._ SA a adressé à B._ Sàrl un courriel auquel étaient annexés un certificat de garantie et une déclaration de conformité. Cette dernière indiquait que l'ouvrage avait été fabriqué en conformité aux normes harmonisées en vigueur, soit notamment la norme DIN EN 14010.
A.h. Par courriel du 16 mai 2017, A._ SA a relancé B._ Sàrl quant au règlement des deux factures restées en souffrance.
Le lendemain, B._ Sàrl a répondu qu'elle attendait de recevoir certains montants des propriétaires.
A.i. Le 18 mai 2017, B._ Sàrl a indiqué à A._ SA que le système ne fonctionnait pas depuis deux jours.
C._ s'est alors rendu à xxx le 20 mai 2017 pour procéder à la réparation du système d'une des plateformes. Un fil s'était débranché du connecteur.
A.j. Le Département a mandaté E._ afin de procéder à une inspection des ascenseurs à voitures. Celle-ci s'est déroulée le 8 septembre 2017.
Le 12 septembre 2017, le Département a ordonné la mise hors service immédiate de l'installation jusqu'à la suppression de tous les défauts constatés et dans l'attente du rapport de E._, faute de sécurité suffisante au sens des normes d'aménagement du territoire du canton de Bâle-Ville. Il s'agissait des art. 59 et 60 al. 1 let. a BPG ( Bau- und Planungsgesetz du 17 novembre 1999; SG 730.100) et les art. 33 al. 4, 63 al. 2 et 64 BPV ( Bau- und Planungsverordnung du 19 décembre 2000; SG 730.110).
A.k. Par courriels des 16 et 22 septembre 2017, B._ Sàrl a signalé à A._ SA que la construction posait des problèmes de sécurité et que les plateformes devaient être bloquées en position haute.
Le 25 septembre 2017, A._ SA s'est rendue sur place afin d'immobiliser les plateformes. Elle a ensuite adressé une facture à B._ Sàrl d'un montant de 929 fr. 45 pour le déplacement et la sécurisation des plateformes.
A.l. E._ a rendu son rapport le 29 septembre 2017. Elle a déclaré qu'il y avait notamment des problèmes de sécurité dès lors qu'un trottoir public longeait le côté des ascenseurs à voitures. Elle a rappelé les prescriptions techniques et de sécurité applicables à l'installation, en faisant référence à la déclaration de conformité remise par A._ SA. En particulier, elle a relevé qu'à teneur de l'art. 5.10.5 de la norme DIN EN 14010, l'accès à l'installation devait être limité aux personnes autorisées. Elle a encore mentionné différentes dispositions applicables prévues par la Directive 2006/42/CE et la norme DIN EN 14010, en indiquant " Pourquoi n'a-t-on pas mis en pratique ces exigences de sécurité? ". En conclusion, elle ne recommandait pas la poursuite de l'exploitation de l'installation dans cet état. Les personnes concernées devaient convenir des mesures à prendre pour améliorer la sécurité. En outre, le fabricant du système devait notamment être tenu de respecter toutes les informations énumérées dans la déclaration de conformité.
A.m. Le 28 novembre 2017, le Département a adressé un courriel à B._ Sàrl, dont il ressort en substance que la mise en place de barrières et de portes coulissantes autour des ascenseurs à voitures assurerait une sécurité suffisante pour permettre la remise en fonction des installations. Il a relevé l'absence tant de plans de modification que d'une liste complète des mesures nécessaires à mettre en oeuvre pour garantir la sécurité des installations (travaux d'entretien notamment).
A.n. Par courriel du 4 décembre 2017, B._ Sàrl a demandé à A._ SA si elle approuvait la solution préconisée par le Département. Elle a joint des plans pour la construction de barrières entre les plateformes et le trottoir, ainsi qu'une offre pour un coût total de 21'600 fr.
Par courriel du 6 décembre 2017, A._ SA a répondu que la solution des barrières était bonne selon l'inspecteur, contacté par téléphone. Elle a refusé de prendre à sa charge les coûts d'installation, en indiquant que ce point n'avait jamais été abordé au cours du projet et n'avait pas été calculé dans l'offre initiale.
A.o. A._ SA a procédé, entre le 22 et le 23 janvier 2018, à plusieurs améliorations en vue de remédier à d'autres problèmes de sécurité soulevés par le rapport de E._.
A.p. Par lettre du 9 mai 2018, B._ Sàrl a informé A._ SA que le coût total de mise en place des barrières était estimé à 81'000 fr. Si A._ SA n'entendait pas exécuter elle-même les travaux en question, B._ Sàrl les réaliserait à sa place.
Après le refus de A._ SA tant d'effectuer les travaux que d'en assumer les coûts, B._ Sàrl lui a adressé une mise en demeure formelle le 22 mai 2018, sans succès.
A.q. B._ Sàrl a fait exécuter les travaux nécessaires à la mise en conformité de l'installation, soit la mise en place d'une grille avec portails autour des plateformes. Le coût total s'est élevé à 73'283 fr. 35.
B.
B.a. Le 14 septembre 2018, au bénéfice d'une autorisation de procéder, A._ SA a saisi le Tribunal civil d'arrondissement de La Côte d'une demande dirigée contre B._ Sàrl en vue d'obtenir le paiement des montants de 37'500 fr., 9'349 fr. 35 et 929 fr. 45, avec intérêts.
Par jugement du 1er octobre 2019, le tribunal a rejeté la demande formée par A._ SA. Il a jugé que l'ouvrage présentait un défaut grave consistant en la non-conformité aux prescriptions de sécurité générale. B._ Sàrl avait respecté ses incombances en vue de l'exercice de son droit à la garantie. Les conditions générales préalables à cet exercice étaient ainsi réalisées. Dès lors, il y avait lieu d'admettre la compensation du préjudice économique subi par B._ Sàrl avec les créances que A._ SA avait envers elle.
B.b. Statuant le 29 septembre 2020, la Cour d'appel civile du Tribunal cantonal vaudois a rejeté l'appel formé par A._ SA et a confirmé le jugement attaqué.
C.
A._ SA (ci-après: la recourante) a exercé un recours en matière civile au Tribunal fédéral, en concluant principalement à la réforme de l'arrêt attaqué en ce sens que B._ Sàrl (ci-après: l'intimée) soit condamnée à lui payer les montants de 37'500 fr., 9'349 fr. 35 et 929 fr. 45, avec intérêts. A titre subsidiaire, elle a conclu à l'annulation de l'arrêt attaqué et au renvoi de la cause à l'autorité précédente pour nouvelle décision.
B._ Sàrl (ci-après: l'intimée) a conclu principalement à l'irrecevabilité du recours, subsidiairement à son rejet.
La cour cantonale s'est référée aux considérants de l'arrêt attaqué.

Considérant en droit :
1.
Les conditions de recevabilité du recours en matière civile sont réalisées sur le principe, notamment celles afférentes à la valeur litigieuse minimale de 30'000 fr. (<ref-law>) et au délai de recours (art. 45 al. 1 et 100 al. 1 LTF).
2.
2.1. Le recours peut être formé pour violation du droit fédéral (<ref-law>). Le Tribunal fédéral applique le droit d'office (<ref-law>). Eu égard, toutefois, à l'exigence de motivation qu'impose l'<ref-law>, sous peine d'irrecevabilité (<ref-law>), il n'examine que les griefs invoqués, sauf en cas d'erreurs juridiques manifestes (<ref-ruling> consid. 2).
2.2. Le Tribunal fédéral statue sur la base des faits établis par l'autorité précédente (<ref-law>). Il ne peut rectifier ou compléter les constatations de l'autorité précédente que si elles sont manifestement inexactes ou découlent d'une violation du droit au sens de l'<ref-law> (<ref-law>). " Manifestement inexactes " signifie ici " arbitraires " (<ref-ruling> consid. 2; <ref-ruling> consid. 1.5). Encore faut-il que la correction du vice soit susceptible d'influer sur le sort de la cause (<ref-law>).
La critique de l'état de fait retenu est soumise au principe strict de l'allégation énoncé par l'<ref-law> (<ref-ruling> consid. 2.3 et les références). La partie qui entend attaquer les faits constatés par l'autorité précédente doit expliquer clairement et de manière circonstanciée en quoi les conditions précitées seraient réalisées. Si la critique ne satisfait pas à ces exigences, les allégations relatives à un état de fait qui s'écarterait de celui de la décision attaquée ne pourront pas être prises en considération (<ref-ruling> consid. 1.3.1 et les références citées).
3.
Tout d'abord, la recourante reproche à la cour cantonale d'avoir considéré de manière arbitraire que l'ouvrage présentait un défaut qui lui était imputable.
3.1. L'entrepreneur est tenu de livrer un ouvrage sans défaut. L'ouvrage livré est défectueux au sens de l'<ref-law> lorsqu'il diverge du contrat, ne possède pas les qualités promises ou les qualités auxquelles le maître pouvait s'attendre d'après les règles de la bonne foi (<ref-ruling> consid. 5a/aa; arrêts 4A_231/2016 du 12 juillet 2016 consid. 2.2; 4A_261/2015 du 30 octobre 2015 consid. 4.3).
3.2. La cour cantonale a constaté que la recourante s'était engagée à fournir des ascenseurs à voitures répondant aux exigences fixées dans son offre, parmi lesquelles figurait le respect de la Directive 2006/42/CE. La recourante avait ensuite produit une déclaration de conformité attestant que l'installation correspondait notamment à cette Directive et à la norme DIN EN 14010. Or, selon la cour cantonale, l'art. 5.5.3 de cette norme prévoyait qu'il était impératif qu'une barrière d'au moins un mètre de hauteur avec main courante soit érigée à la limite de l'installation litigieuse lorsque celle-ci se situait au bord d'un espace public, comme en l'espèce. Ainsi, si le contrat conclu entre les parties ne prévoyait pas expressément la pose de cette barrière, voire si elle n'était pas du ressort de la recourante, cette dernière se devait, en tant que spécialiste s'étant engagée à respecter les normes de sécurité, d'indiquer au maître de l'ouvrage qu'une telle barrière était indispensable d'un point de vue sécuritaire. La conformité aux normes applicables avait été promise par la recourante. Cela constituait une qualité qui pouvait être attendue de bonne foi par le maître de l'ouvrage.
La cour cantonale a encore relevé que la non-conformité aux normes sécuritaires en la matière avait été démontrée. Elle a fait référence à la décision du 12 septembre 2017 du Département et au rapport de E._ du 29 septembre 2017.
3.3. La recourante soutient que la cour cantonale a retranscrit l'art. 5.5.3 précité de manière erronée puisqu'il ne faisait pas mention de l'espace public. Elle reproche aux juges précédents d'avoir retenu que le défaut " consist[ait] précisément dans l'obligation de séparer l'espace privé de l'espace public " et d'avoir mis cette obligation à sa charge.
3.4. La recourante effectue toutefois une lecture partielle de l'arrêt attaqué. La cour cantonale n'a pas jugé que le défaut consistait en l'absence de séparation de l'espace privé de l'espace public. Elle a retenu que le défaut résidait dans le non-respect des normes sécuritaires applicables à l'installation litigieuse.
Certes, l'art. 5.5.3 précité ne mentionne pas l'espace public; il concerne cependant une problématique de sécurité, puisqu'il prévoit ce qui suit: " s'il existe un risque qu'un utilisateur ou un passager puisse tomber d'une hauteur supérieure à 1 m par rapport à la surface du porte-charges, un dispositif de protection d'une hauteur minimale de 1 m doit être prévu comprenant une main courante, une lisse intermédiaire et une plaque de protection d'une hauteur minimale de 0,05 m [...]. "
Ainsi, si la cour cantonale a retranscrit cette disposition de manière imprécise, cela n'a pas d'influence sur le sort du litige. En effet, cet article a clairement trait à la sécurité de l'installation, par la pose notamment d'une main courante, ce qui n'a pas été réalisé dans le présent cas.
La recourante allègue encore, en lien avec la décision rendue par le Département, qu'elle n'était pas responsable de s'assurer de la sécurité au sens des normes bâloises sur l'aménagement du territoire. Toutefois, cette décision fait référence à des dispositions prévoyant de manière générale que les installations doivent être sûres (art. 59 et 60 al. 1 let. a BPG) et réglant les compétences de l'inspecteur du Département (en particulier, art. 33 al. 4 et 64 BPV). Dès lors, il n'y a pas lieu d'examiner plus avant l'argument de la recourante à cet égard.
La recourante se prévaut également des indications quant aux barrières mentionnées dans le permis de construire délivré au préalable. Elle soutient que l'intimée savait qu'elle était tenue de mettre en place des barrières et qu'elle ne l'avait pas informée de cette obligation. La recourante ne critique toutefois pas le raisonnement adopté par la cour cantonale à cet égard, soit qu'en tant que professionnelle des installations de surélévation des véhicules motorisés, la recourante devait elle-même s'assurer que les normes de sécurité seraient respectées sans que l'intimée ait un devoir d'information à cet égard. L'appréciation de l'autorité inférieure n'apparaît pas critiquable.
Ainsi, c'est sans violer le droit fédéral que la cour cantonale a retenu que l'ouvrage n'était pas conforme aux prescriptions de sécurité générale et présentait un défaut imputable à la recourante.
4.
Ensuite, dans une argumentation mêlant les faits et le droit, la recourante dénonce une violation des <ref-law> et 370 CO. Elle reproche à la cour cantonale d'avoir considéré l'intimée comme une profane " pour justifier de la tardiveté du respect de ses incombances ". La recourante soutient que l'intimée savait, en sa qualité d'entreprise générale et au vu de la teneur du permis de construire, qu'elle avait l'obligation d'installer des barrières. L'intimée pouvait vérifier la conformité de l'ouvrage aux qualités promises et, cas échéant, en aviser la recourante. Il ne s'agissait pas d'un défaut caché.
4.1. Le Code des obligations prévoit qu'après la livraison de l'ouvrage, le maître doit en vérifier l'état aussitôt qu'il le peut d'après la marche habituelle des affaires, et en signaler les défauts à l'entrepreneur, s'il y a lieu (<ref-law>). Si les défauts ne se manifestent que plus tard, le maître doit les signaler aussitôt qu'il en a connaissance (<ref-law>).
Le maître doit procéder (ou faire procéder) aux " vérifications usuelles "; il doit faire preuve de l'attention que l'on peut exiger d'un connaisseur moyen, compte tenu du type d'ouvrage considéré, afin de s'assurer que l'ouvrage présente les qualités attendues ou promises (PETER GAUCH, Der Werkvertrag, 6e éd. 2019, n. 2122; TERCIER/BIERI/CARRON, Les contrats spéciaux, 5e éd. 2016, n. 3806).
On distingue les défauts apparents des défauts cachés. Les défauts apparents sont ceux qui ont été ou qui pouvaient être décelés lors de la vérification régulière et diligente de l'ouvrage; quant aux défauts cachés, ce sont ceux qui n'étaient pas reconnaissables lors de la réception (cf. <ref-law>; <ref-ruling> consid. 2; arrêt 4A_297/2008 du 6 octobre 2008 consid. 4.2).
L'avis des défauts apparents doit être donné aussitôt après leur découverte, c'est-à-dire sans délai, à l'instar de la réglementation sur l'avis des défauts cachés (arrêt précité 4A_231/2016 consid. 2.2). Le maître peut prendre un bref délai de réflexion, mais il doit se décider rapidement. Les circonstances du cas concret, et notamment la nature du défaut, sont déterminantes pour apprécier s'il a agi en temps utile (<ref-ruling> consid. 7.2; <ref-ruling> consid. 3b; arrêt 4A_251/2018 du 11 septembre 2018 consid. 3.3).
Il y a découverte d'un défaut lorsque le maître en constate l'existence avec certitude, de manière à pouvoir formuler une réclamation suffisamment motivée. Cela suppose qu'il puisse en mesurer l'importance et l'étendue (arrêt précité 4A_251/2018 consid. 3.3 et les références).
L'omission de vérifier l'ouvrage et d'aviser l'entrepreneur (<ref-law>), respectivement d'aviser immédiatement l'entrepreneur en cas de défaut caché (<ref-law>), entraîne dans l'un et l'autre cas une présomption irréfragable d'acceptation de l'ouvrage avec ses défauts. L'acceptation de l'ouvrage implique que l'entrepreneur est déchargé de toute responsabilité (<ref-law>), tandis que les droits du maître découlant de la garantie des défauts sont périmés (arrêt précité 4A_231/2016 consid. 2.2 et la référence).
4.2. Les premiers juges ont considéré que la réception de l'ouvrage avait eu lieu le 8 septembre 2017, étant donné que tous les ascenseurs n'étaient pas encore achevés lors de l'inspection du 1er février 2017. Selon les premiers juges, la non-conformité aux prescriptions de sécurité devait être considérée comme un défaut caché dès lors qu'elle n'était pas patente pour l'intimée au moment de la première inspection technique, le 1er février 2017. Cette inspection ne portait pas précisément sur l'examen de la sécurité des installations, de sorte que l'intimée, en tant que profane, ne pouvait pas constater le défaut. Même en admettant qu'elle aurait dû avoir connaissance du défaut au moment de cette première inspection, elle avait démontré qu'après avoir pris connaissance des doutes émis par l'inspecteur concernant la sécurité des installations, elle avait aussitôt demandé à la recourante de certifier le respect des normes de sécurité. La recourante lui avait alors fait parvenir une déclaration de conformité et le certificat de garantie, que l'intimée, en tant que profane, n'avait aucune raison de remettre en question.
La cour cantonale a confirmé le raisonnement des premiers juges. Elle a précisé qu'il ressortait du but statutaire de l'intimée qu'elle était spécialisée dans l'achat, la vente et le négoce de biens immobiliers. Elle n'était en revanche pas spécialisée dans le développement et la fabrication d'ascenseurs à voitures, contrairement à la recourante. Dès lors, l'intimée ne pouvait pas se rendre compte que l'installation des ascenseurs présentait des défauts de sécurité. Ce d'autant plus que la recourante lui avait remis un certificat de garantie et une déclaration de conformité en ce sens. Dans ces conditions, il y avait lieu d'admettre que ce n'était qu'à la réception de la décision du Département du 12 septembre 2017, prononçant la mise hors service des installations faute de sécurité suffisante, que l'intimée avait eu connaissance des défauts de sécurité. L'intimée avait reçu cette décision au plus tôt le 13 septembre 2017 et avait formulé l'avis des défauts par courriel du 16 septembre 2017. Il n'était dès lors pas tardif.
4.3. Le degré d'expérience du cocontractant est une constatation de fait (<ref-ruling> consid. 5d), qui ne peut être corrigée que si elle se révèle arbitraire. Or la recourante se contente d'opposer sa propre appréciation à celle de la cour cantonale, sans démontrer que cette dernière aurait sombré dans l'arbitraire en retenant que l'intimée n'avait pas d'expérience en la matière. Il convient donc de se fonder sur cette dernière constatation. Ainsi, les considérations de la cour cantonale, selon lesquelles l'intimée, non spécialiste, ne pouvait se rendre compte d'elle-même des défauts d'un ouvrage technique - malgré une vérification régulière -, ne sont pas critiquables. La recourante fait grand cas des doutes quant à la sécurité de l'ouvrage émis par l'inspecteur le 1er février 2017. Au vu des circonstances particulières du cas d'espèce, ils ne sauraient être pris en considération. En effet, selon les constatations de l'autorité précédente, liant le Tribunal fédéral, après avoir pris connaissance de ces doutes, l'intimée a demandé à la recourante de lui certifier que les normes de sécurité étaient bien respectées. La recourante lui a alors transmis une déclaration de conformité en ce sens, que l'intimée a, de bonne foi, tenue pour véridique.
Par ailleurs, la recourante ne peut être suivie lorsqu'elle conteste qu'il s'agit d'un défaut caché, en soutenant qu'il était immédiatement décelable et qu'il n'est pas apparu " plus tard " au sens de l'<ref-law>. La notion de défaut caché n'est pas limitée aux défauts apparaissant " plus tard ", mais concerne ceux que le maître n'a pas pu constater par une vérification régulière de l'ouvrage (cf. consid. 4.1 supra), comme en l'espèce.
A l'instar de la cour cantonale, on doit retenir que ce n'est qu'à la réception de la décision du 12 septembre 2017 du Département, ordonnant la mise hors service immédiate de l'installation pour des motifs de sécurité, que l'intimée a eu connaissance du défaut avec certitude.
L'intimée a reçu cette décision au plus tôt le 13 septembre 2017. Ainsi, en signalant le défaut caché à la recourante par courriel du 16 septembre 2017, soit trois jours après avoir eu connaissance de son existence avec certitude, l'intimée n'a pas agi de manière tardive.
5.
La recourante se prévaut encore d'une violation des art. 16, 19, et 370 CO, dans la mesure où la cour cantonale n'a pas tenu compte des conditions contractuelles relatives au délai de vérification de l'ouvrage, ainsi qu'au délai et aux modalités d'avis des défauts. En outre, la recourante soutient que la motivation de l'arrêt entrepris ne permet pas de comprendre pour quelle raison ces dispositions contractuelles ont été écartées et dénonce une violation de l'art. 29 Cst.
5.1. Les art. 367 et 370 CO sont de droit dispositif; les parties peuvent donc prévoir des dérogations au système légal (arrêts 4A_256/2018 du 10 septembre 2018 consid. 3.2.1 et 4C.346/2003 du 26 octobre 2004 consid. 4.1.1).
5.2. Le droit d'être entendu garanti par les art. 29 al. 2 Cst. et 53 CPC, qui ont à cet égard la même portée, comprend notamment l'obligation pour l'autorité de motiver sa décision, afin que le justiciable puisse la comprendre et exercer son droit de recours à bon escient. Pour satisfaire à cette exigence, il lui suffit d'exposer, au moins brièvement, les motifs qui l'ont guidée et sur lesquels elle a fondé son raisonnement. Elle n'a pas l'obligation d'exposer et de discuter tous les faits, moyens de preuve et griefs invoqués par les parties, mais peut au contraire se limiter à ceux qui, sans arbitraire, peuvent être tenus pour pertinents (<ref-ruling> consid. 4.2 et les références citées).
5.3.
5.3.1. En l'espèce, dans la partie " en fait " de son arrêt, la cour cantonale a retenu que les conditions générales de vente de la recourante avaient été intégrées au contrat. Elle a retranscrit certaines dispositions de celles-ci.
Certes, la cour cantonale n'a pas fait mention de ces conditions générales de vente dans son raisonnement, contrairement à l'autorité de première instance. Devant le Tribunal fédéral, la recourante n'a toutefois pas allégué avoir soulevé ce moyen dans son mémoire d'appel.
Par ailleurs, les quelques lignes que la recourante a consacrées à ce grief dans son appel sont insuffisamment motivées. Au surplus, la recourante n'a pas invoqué, ou du moins pas suffisamment, que ses conditions générales de vente s'appliqueraient également en cas de défaut caché. Dès lors, l'autorité cantonale n'a pas violé l'art. 29 al. 2 Cst. en ne discutant pas de l'application de ces dernières.
5.3.2. Devant le Tribunal fédéral, la recourante n'a pas non plus soutenu, ou du moins pas suffisamment, que ses conditions générales de vente seraient aussi applicables en présence d'un défaut caché.
Les éléments qu'elle invoque en lien avec la date de livraison de l'ouvrage, qu'elle fixe au 23 février 2017, la facture du 24 février 2017 et les modalités de l'avis des défauts ne sont dès lors pas pertinents, puisqu'ils se fondent sur les conditions générales de vente.
Par surabondance, s'agissant des modalités de l'avis des défauts, la recourante ne détaille pas explicitement en quoi l'<ref-law> serait violé. Il y a lieu de préciser que la forme de l'avis des défauts convenue par les parties ne constitue pas une condition de validité présumée de cet avis; l'<ref-law> ne s'applique pas à la forme de l'avis des défauts (GAUCH, op. cit., n. 2146 et le renvoi à n. 1947; cf. également <ref-ruling> consid. 2b/aa).
6.
Au vu de ce qui précède, c'est sans violer le droit fédéral que la cour cantonale a retenu que l'ouvrage livré par la recourante présentait un défaut caché imputable à cette dernière et que l'intimée avait respecté ses incombances en vue de l'exercice de son droit à la garantie.
7.
En définitive, le recours doit être rejeté, dans la mesure où il est recevable.
La recourante, qui succombe, prendra en charge les frais judiciaires (<ref-law>). Elle versera en outre une indemnité de dépens à l'intimée (art. 68 al. 1 et 2 LTF).

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté dans la mesure où il est recevable.
2.
Les frais judiciaires, arrêtés à 2'500 fr., sont mis à la charge de la recourante.
3.
La recourante versera à l'intimée une indemnité de 3'000 fr. à titre de dépens.
4.
Le présent arrêt est communiqué aux parties et à la Cour d'appel civile du Tribunal cantonal du canton de Vaud.
Lausanne, le 6 avril 2021
Au nom de la Ire Cour de droit civil
du Tribunal fédéral suisse
La Présidente : Hohl
La Greffière : Raetz