Faits :
A.
Le 26 octobre 2018, sur requête de A._ Sàrl, l'Office des poursuites de la Gruyère a notifié à B._ Sàrl un commandement de payer (poursuite n° xxxxxx) la somme de 12'532 fr. 45 en capital, plus intérêts à 5% l'an dès le 24 juillet 2018. Etait indiqué sous la rubrique " Titre et date de la créance ou cause de l'obligation " : " facture finale no xxxx xxxx-x du 2 juillet 2018 ".
La poursuivie a formé opposition totale.
Par décision du 21 février 2019, le Président du Tribunal civil de l'arrondissement de la Gruyère a refusé de prononcer la mainlevée de l'opposition requise le 8 novembre 2018 par A._ Sàrl.
Statuant le 25 juin 2019, la II e Cour d'appel civil du Tribunal cantonal de l'Etat de Fribourg a rejeté, dans la mesure de sa recevabilité, le recours formé par A._ Sàrl contre ce prononcé. Elle a en substance admis que la poursuivie avait rendu vraisemblable le moyen libératoire tiré de l'existence de défauts des fenêtres livrées.
B.
Par écriture du 27 août 2019 postée le 29 août suivant, A._ Sàrl interjette un recours constitutionnel subsidiaire au Tribunal fédéral. Elle conclut à la mainlevée provisoire de l'opposition à concurrence de 12'532 fr. 45, avec intérêts à 5% dès le 24 juillet 2018, plus les frais du commandement de payer, à la mise des frais de première et de seconde instance à la charge de la poursuivie et au renvoi de la cause à l'instance inférieure s'agissant de la fixation des dépens des deux instances cantonales.
L'intimée propose le rejet du recours dans la mesure où il est recevable. L'autorité cantonale déclare ne pas avoir d'observations à formuler.

Considérant en droit :
1.
Le présent recours est dirigé en temps utile (<ref-law>) contre une décision finale (<ref-law>; <ref-ruling> consid. 1.1; <ref-ruling> consid. 1.4) prise par un tribunal supérieur statuant sur recours (art. 75 al. 1 et 2 LTF). La décision attaquée est en principe susceptible de recours en matière civile (<ref-law>). Toutefois, vu l'insuffisance de la valeur litigieuse (<ref-law>) et en l'absence de question juridique de principe (<ref-law>), le recours constitutionnel subsidiaire est seul ouvert en l'occurrence (art. 113, 114 et 117 LTF). La recourante, qui a succombé devant la juridiction précédente, possède un intérêt juridique à l'annulation ou à la modification de la décision attaquée (<ref-law>).
2.
2.1. Le recours constitutionnel ne pouvant être formé que pour violation des droits constitutionnels (<ref-law>), le Tribunal fédéral ne corrige l'application des dispositions de droit matériel que si celle-ci est arbitraire au sens de l'art. 9 Cst. Tel est le cas lorsqu'elle viole gravement une norme ou un principe juridique clair et indiscuté, ou contredit de manière choquante le sentiment de la justice et de l'équité. Une motivation n'est pas arbitraire du seul fait qu'une autre solution que celle de l'autorité cantonale apparaît concevable ou même préférable (<ref-ruling> consid. 7.3; <ref-ruling> consid. 2.1). Le Tribunal fédéral ne recherche pas quelle est l'interprétation correcte que l'autorité cantonale aurait dû donner de la disposition légale, mais il se borne à dire si l'interprétation qui a été faite est défendable (<ref-ruling> consid. 2; <ref-ruling> consid. 5.1). Pour être qualifiée d'arbitraire, la décision doit également être insoutenable dans son résultat (<ref-ruling> consid. 7.1, 170 consid. 7.3; <ref-ruling> consid. 4.3). Le Tribunal fédéral n'examine en outre que les griefs expressément soulevés et motivés de façon claire et détaillée par le recourant (" principe d'allégation "; art. 106 al. 2 et 117 LTF; <ref-ruling> consid. 1.5 et les références).
2.2. Le Tribunal fédéral statue sur la base des faits établis par l'autorité précédente (<ref-law>). Il peut néanmoins rectifier ou compléter les constatations de cette autorité si les faits ont été constatés en violation d'un droit constitutionnel (art. 118 al. 2 et 116 LTF), soit en particulier s'ils ont été établis de manière arbitraire (arrêt 2D_58/2013 du 24 septembre 2014 consid. 2.2 non publié in <ref-ruling> mais in Pra 2015 p. 165). L'appréciation des preuves et l'établissement des faits sont arbitraires lorsque le juge s'est manifestement mépris sur le sens et la portée d'un moyen de preuve, lorsqu'il a omis, sans raison sérieuse, de tenir compte d'un moyen important propre à modifier la décision attaquée, ou encore lorsqu'il a tiré des déductions insoutenables à partir des éléments recueillis (<ref-ruling> consid. 4.2). La critique de l'état de fait retenu est soumise au principe strict de l'allégation énoncé par l'<ref-law> (par renvoi de l'<ref-law>; cf. supra, consid. 2.1).
3.
La recourante se plaint d'une application insoutenable (art. 9 Cst.) des <ref-law> et 370 CO. Elle soutient que l'autorité cantonale a versé dans l'arbitraire en considérant que l'intimée avait rendu vraisemblable l'existence de défauts et le signalement de ceux-ci en temps utile. Elle lui reproche d'avoir fait " rétroagir " les courriels du 17 juillet 2018 au 20 juin 2018, date de l'envoi de messages dont elle avait pourtant jugé qu'ils " n'établiss[ai]ent pas grand-chose ".
3.1.
3.1.1. Conformément à l'<ref-law>, le poursuivi peut faire échec à la mainlevée en rendant immédiatement vraisemblable sa libération. Il peut se prévaloir de tous les moyens de droit civil - exceptions ou objections - qui infirment la reconnaissance de dette (<ref-ruling> consid. 4.1). Il n'a pas à apporter la preuve absolue (ou stricte) de ses moyens libératoires, mais seulement à les rendre vraisemblables, en principe par titre (<ref-law>; <ref-ruling> précité et les références).
Le juge n'a pas à être persuadé de l'existence des faits allégués; il doit, en se fondant sur des éléments objectifs, avoir l'impression qu'ils se sont produits, sans exclure pour autant la possibilité qu'ils se soient déroulés autrement (<ref-ruling> consid. 4.1.2).
3.1.2. Selon la jurisprudence, la mainlevée provisoire fondée sur un contrat synallagmatique doit être prononcée si le débiteur qui fait valoir un défaut soumis à un avis ne rend pas vraisemblable qu'il a donné cet avis dans le délai (<ref-ruling>, consid. 4.3.1; arrêts 5A_1008/2014 du 1er juin 2015 consid. 3.4.2; 5A_630/2010 et 631/2010 du 1er septembre 2011 consid. 2.2, publié in Pra 2012 no 32 p. 223 [vente]; 5A_19/2016 du 6 septembre 2016 consid. 2.6 [contrat d'entreprise]).
3.2. En l'espèce, le Tribunal cantonal fribourgeois a jugé que, si l'échange de messages du 20 juin 2018 et les photos des fenêtres produits par la poursuivie ne fondaient pas à eux seuls l'existence de défauts, les deux courriels adressés à la poursuivante le 17 juillet 2018 démontraient, à tout le moins au stade de la vraisemblance, que la marchandise livrée présentait effectivement des défauts. Il a en outre considéré que la poursuivie avait rendu vraisemblable qu'elle avait donné l'avis des défauts dans les délais. Il a retenu à cet égard que l'échange de messages du 20 juin 2018 recoupé avec les courriels du 17 juillet 2018 établissaient que la poursuivante avait été informée de l'existence de défauts seulement quelques jours après la livraison de la marchandise intervenue le 15 juin 2018. Il a aussi admis que, dans la mesure où la poursuivie exigeait dans son courriel du 17 juillet 2018 que la poursuivante vienne récupérer l'ensemble des objets livrés, elle avait quantifié à satisfaction de droit sa prétention en réduction. Il en a donc conclu que la poursuivie avait rendu vraisemblable sa libération.
3.3. Ces considérations résistent au grief d'arbitraire. Les messages du 20 juin 2018 envoyés quelques jours après la livraison indiquent ce qui suit : " 12:35 Salut tu as fait quoi pour la fenêtre il faut trouver une solution merci " " 21:01 Y'a des nouvelles pour les fenêtres ". R : " 21:05 Viens au des alpes ". Il faut admettre, ce qui ne semble pas être contesté, que ces derniers, de même que les photos de cadres de fenêtre prétendument défectueux produits par l'intimée, ne constituent pas à eux seuls un avis des défauts. Cela étant, l'autorité cantonale pouvait toutefois, sans commettre d'arbitraire, inférer des messages précités que des discussions avaient vraisemblablement eu lieu entre les parties à cette date, puisque cela est corroboré par les courriels du 17 juillet 2018, dont l'un, faisant référence à l'admission " au début " d'une erreur de fabrication par la recourante, impartit à cette dernière un délai pour venir récupérer la marchandise et l'autre confirme l'accord qu'elle a donné à la suite d'une conversation téléphonique entre les parties le même jour. Que la recourante conteste avoir admis l'existence " d'une erreur de fabrication " n'y change rien. Dans ces conditions, et étant au demeurant rappelé que l'avis des défauts n'est en tout état soumis à aucune forme (<ref-ruling> consid. 1a), la conclusion de l'autorité cantonale selon laquelle l'intimée a rendu vraisemblable qu'elle avait signalé les défauts en temps utile n'apparaît pas insoutenable. Le grief tiré de l'arbitraire soulevé par la recourante doit dès lors être rejeté.
3.4. Il sera cependant relevé que le juge de la mainlevée provisoire n'examine pas la validité de la prétention déduite en poursuite (<ref-ruling> consid. 4.1.1 et la jurisprudence citée; arrêt 5A_450/2012 du 23 janvier 2013 consid. 3.2, publié in SJ 2013 I 345). La recourante pourra ainsi agir en reconnaissance de dette (<ref-law>) pour faire trancher définitivement la question, au terme d'une instruction complète (cf. sur la nature de la procédure de mainlevée: <ref-ruling> consid. 2.3, et les arrêts cités).
4.
Vu ce qui précède, le recours doit être rejeté. La recourante, qui succombe, supportera les frais et les dépens de la procédure (art. 66 al. 1 et 68 al. 1 et 2 LTF).

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté.
2.
Les frais judiciaires, arrêtés à 1'500 fr., sont mis à la charge de la recourante.
3.
Une indemnité de 2'000 fr., à verser à l'intimée à titre de dépens, est mise à la charge de la recourante.
4.
Le présent arrêt est communiqué aux parties et à la IIe Cour d'appel civil du Tribunal cantonal de l'Etat de Fribourg.
Lausanne, le 28 juillet 2020
Au nom de la IIe Cour de droit civil
du Tribunal fédéral suisse
Le Juge présida nt : La Greffière :
Marazzi Jordan