Faits: A. A.a. X._ est une association de droit privé suisse inscrite au registre du commerce, sise à ... (VD) et dont le but social est l'enseignement et l'exploitation d'un institut universitaire de style américain. Au mois de mai 2009, elle a conclu un contrat d'enseignement avec Y._, citoyenne kazakhe. L'école s'engageait à fournir à l'élève une formation de deux ans ainsi qu'un logement pour le montant total de 43'365 euros. L'élève a payé d'avance 43'305 euros et a suivi les cours à partir du 14 septembre 2009. Le 19 avril 2010, l'école a adressé un décompte à l'élève. Après déduction des frais de l'année académique 2009/10, il affichait un solde de 24'204 euros en faveur de l'élève, avec la mention "refund to" (à rembourser) suivie du numéro de compte bancaire de l'élève. Le 21 juin 2010, l'école a établi un nouveau décompte pour les années académiques 2009/10 et 2010/11, laissant apparaître un solde de 3'097 euros en faveur de l'élève. Le même jour, les parties ont signé une demande de prolongation de l'autorisation de séjour pour études; le 10 août 2010, le permis de l'élève a été renouvelé pour une année. Lors de la rentrée des classes le 6 septembre 2010, l'élève ne s'est pas présentée. Cet automne-là, elle a suivi des cours de français dans un autre établissement. A.b. Par commandement de payer notifié le 29 novembre 2010, l'élève a engagé des poursuites contre l'école pour le montant de 33'159 fr. 48 plus intérêts à 5% l'an dès le 19 avril 2010, poursuites fondées sur le montant de 24'204 euros admis dans le décompte du 19 avril 2010. L'école a fait opposition totale. Le 20 janvier 2011, le Juge de paix a prononcé la mainlevée provisoire de l'opposition. L'élève a alors fait notifier une commination de faillite puis a requis le prononcé de la faillite; cette procédure est suspendue. B. B.a. Le 8 juillet 2011, l'école a ouvert action en annulation de poursuite devant le Tribunal civil de l'arrondissement de l'Est vaudois, concluant à ce qu'il soit constaté qu'elle n'était pas débitrice de l'élève pour le montant de 33'159 fr. 48 et à ce que la poursuite contre elle soit annulée. L'élève a conclu au rejet de l'action. Le Tribunal civil a rejeté l'action par jugement du 16 mai 2012. En résumé, il a retenu que le contrat d'enseignement avait été valablement résilié le 19 avril 2010, de sorte que l'école devait restituer à l'élève la part du versement anticipé qui n'avait pas encore été utilisée, à savoir 24'204 euros selon le décompte établi par l'école ce jour-là. B.b. L'école s'est pourvue en appel, soutenant que l'élève, après avoir résilié le contrat le 19 avril 2010, s'était ravisée et avait conclu un nouveau contrat en vue de poursuivre ses études, ce qui découlerait en particulier du second décompte du 21 juin 2010 et de la demande de renouvellement du permis de séjour signée par les deux parties. Sans inviter l'élève à se déterminer, la Cour d'appel civile du Tribunal cantonal vaudois, par arrêt du 9 janvier 2013, a rejeté l'appel et confirmé le jugement de première instance. C. L'école (ci-après: la recourante) saisit le Tribunal fédéral d'un recours en matière civile, concluant à ce que son action en annulation de poursuite soit admise, à ce qu'il soit constaté qu'elle n'est pas débitrice de l'élève (ci-après: l'intimée) pour le montant de 33'159 fr. 48 et à ce que la poursuite ouverte à son encontre (n o..., Office des poursuites du district de La Riviera - Pays d'Enhaut) soit annulée. L'intimée conclut principalement à l'irrecevabilité du recours, subsidiairement à son rejet. Les deux parties ont par la suite encore déposé des observations. Par ordonnance du 23 mai 2013, la présidente de la cour de céans a accordé l'effet suspensif.