Sachverhalt:
A.
Die A._ GmbH (Beschwerdeführerin) und die B._ GmbH (Beschwerdegegnerin) schlossen am 24. April 2007 einen Vertrag. Darin verpflichtete sich die A._ GmbH, zum Preis von Fr. 4'040.-- (nebst Mehrwertsteuer) Werbung in Form des Firmensignets der B._ GmbH herzustellen und während der Vertragsdauer von fünf Jahren auf einem vertraglich näher bezeichneten Fahrzeug zu platzieren. Der Vertrag sah eine automatische Verlängerung um jeweils eine weitere Periode vor, sofern nicht bis sechs Monate vor Ablauf der Laufzeit eine Kündigung erfolgt. In Ziff. 3 lit. g der Allgemeinen Geschäftsbedingungen (nachfolgend: AGB) der A._ GmbH heisst es:
"Soweit nicht gesondert schriftlich festgehalten, ist ein bestimmter Ersterscheinungstermin nicht vereinbart. Die Bearbeitungszeit beträgt max. 12 Monate nach Vertragserteilung. Kann diese Frist nicht eingehalten werden, ist der Vertraggeber [die B._ GmbH] verpflichtet eine Nachfrist von 2 Monaten zu setzen, die ab Eingang beim Vertragnehmer [die A._ GmbH] zu laufen beginnt."
Ziff. 16 AGB lautet:
"Voraussetzung für die Durchführung des Vertrages und somit Geschäftsgrundlage und Bedingung dieses Anzeigenvertrages ist, dass es dem Vertragnehmer gelingt, das Fahrzeug stets ausreichend mit Werbeträgern zu belegen."
Am 18. Juli 2017 leitete die A._ GmbH gegen die B._ GmbH eine Betreibung über Fr. 4'363.20 nebst Zins und Mahngebühren ein. Die B._ GmbH erhob Rechtsvorschlag.
B.
Am 5. März 2018 reichte die A._ GmbH beim Bezirksgericht Meilen eine Klage ein. Sie verlangte, die B._ GmbH sei zu verurteilen, ihr Fr. 4'363.20 nebst Zins zu 5 % seit 4. Januar 2017 und zuzüglich Verfahrenskosten zu bezahlen. Ferner sei der Rechtsvorschlag in der Betreibung Nr. xxx des Betreibungsamts U._ aufzuheben.
Mit Urteil vom 13. Juni 2018 wies das Bezirksgericht die Klage ab.
Die A._ GmbH focht dieses Urteil mit Beschwerde beim Obergericht des Kantons Zürich an. Dieses wies die Beschwerde mit Urteil vom 12. März 2019 ab, soweit es darauf eintrat.
C.
Die A._ GmbH verlangt mit Beschwerde in Zivilsachen und subsidiärer Verfassungsbeschwerde, das Urteil des Obergerichts sei aufzuheben. In der Sache wiederholt sie ihre vor Bezirksgericht gestellten Anträge. Im Eventualstandpunkt beantragt sie die Rückweisung der Sache zur Neubeurteilung an die Vorinstanz.
Das Obergericht verzichtete auf Vernehmlassung. Die Beschwerdegegnerin beantragt, auf die Beschwerde sei nicht einzutreten, eventualiter sei sie abzuweisen. Die Beschwerdeführerin hat eine Replik eingereicht.

Erwägungen:
1.
1.1. Das angefochtene Urteil des Obergerichts ist ein Endentscheid (<ref-law>) einer Vorinstanz im Sinne von <ref-law>.
1.2.
1.2.1. Der Streitwert erreicht die Grenze von Fr. 30'000.-- gemäss <ref-law> nicht. Unter diesen Umständen ist die Beschwerde in Zivilsachen nach <ref-law> dennoch zulässig, wenn sich eine Rechtsfrage von grundsätzlicher Bedeutung stellt. Die Beschwerdeführerin macht geltend, dies sei der Fall.
1.2.2. Eine Rechtsfrage von grundsätzlicher Bedeutung liegt vor, wenn ein allgemeines und dringendes Interesse besteht, dass eine umstrittene Frage höchstrichterlich geklärt wird, um eine einheitliche Anwendung und Auslegung des Bundesrechts herbeizuführen und damit eine erhebliche Rechtsunsicherheit auszuräumen (<ref-ruling> E. 1 S. 165; <ref-ruling> E. 1.2; <ref-ruling> E. 1.2 S. 210; je mit weiteren Hinweisen). Der Begriff der Rechtsfrage von grundsätzlicher Bedeutung ist restriktiv auszulegen. Soweit es bei der aufgeworfenen Frage lediglich um die Anwendung von Grundsätzen der Rechtsprechung auf einen konkreten Fall geht, handelt es sich nicht um eine Rechtsfrage von grundsätzlicher Bedeutung (<ref-ruling> E. 1.3 S. 4 mit weiteren Hinweisen). Wenn geltend gemacht wird, dass von den unteren Instanzen viele gleichartige Fälle zu beurteilen sein werden, muss die zu beurteilende Streitsache überdies geeignet sein, die Frage auch mit Bezug auf die anderen Fälle zu klären (<ref-ruling> E. 4 S. 343).
Ist eine Beschwerde nur unter der Voraussetzung zulässig, dass sich eine Rechtsfrage von grundsätzlicher Bedeutung stellt, so ist in der Beschwerde auszuführen, warum diese Voraussetzung erfüllt ist (<ref-law>).
1.2.3. Die Beschwerdeführerin trägt vor, es stelle sich die Rechtsfrage, "ob sich aus dem Stillschweigen bzw. Nichttätigwerden zweier Parteien überhaupt ein normativer Konsens zur Begründung eines Vertragsverhältnisses ableiten" lasse. Die Vorinstanz habe dies zu Unrecht bejaht und das Vorliegen eines durch "beidseitiges Stillschweigen" zustande gekommenen Aufhebungsvertrags bejaht, was der Rechtssicherheit abträglich sei. Die Frage sei für den "alltäglichen Rechtsverkehr" von allgemeiner Tragweite.
Damit vermag die Beschwerdeführerin nicht aufzuzeigen, dass sich eine Rechtsfrage von grundsätzlicher Bedeutung stellt. In der Sache kritisiert sie vielmehr, die Vorinstanz habe dem nach dem Vertrauensprinzip ausgelegten Verhalten der Parteien eine unrichtige Bedeutung zugemessen. Damit beanstandet sie die falsche Anwendung von Grundsätzen der Rechtsprechung (siehe <ref-ruling> E. 5a; sodann <ref-ruling> E. 5.2.3, 43 E. 3.3 und Urteil 4A_589/2011 vom 5. April 2012 E. 8.1, nicht publ. in: <ref-ruling>; je mit Hinweisen) auf den vorliegenden Sachverhalt. Daran ändert auch die Behauptung nichts, das vorinstanzliche, für den konkreten Fall gefundene Auslegungsergebnis führe zu einer erheblichen Rechtsunsicherheit. Die Beschwerde in Zivilsachen ist nicht zulässig.
2.
2.1. Folglich steht die von der Beschwerdeführerin ebenfalls erhobene subsidiäre Verfassungsbeschwerde im Sinne der Art. 113-119 BGG offen.
2.2. Mit der Verfassungsbeschwerde kann die Verletzung von verfassungsmässigen Rechten gerügt werden (<ref-law>). Diesbezüglich gilt eine qualifizierte Rügepflicht. Die Verletzung von Grundrechten prüft das Bundesgericht nicht von Amtes wegen, sondern nur insofern, als eine solche Rüge in der Beschwerde vorgebracht und begründet worden ist (Art. 117 in Verbindung mit <ref-law>). Dies bedeutet, dass klar und detailliert anhand der Erwägungen des angefochtenen Entscheids darzulegen ist, inwiefern verfassungsmässige Rechte verletzt worden sein sollen (<ref-ruling> E. 1.2; <ref-ruling> E. 3.2; je mit weiteren Hinweisen).
Macht die beschwerdeführende Partei eine Verletzung des Willkürverbots geltend, genügt es nicht, wenn sie einfach behauptet, der angefochtene Entscheid sei willkürlich (<ref-ruling> E. 3 S. 352; <ref-ruling> E. 5.5). Willkür liegt nicht schon dann vor, wenn eine andere Lösung ebenfalls in Betracht zu ziehen oder gar vorzuziehen wäre, sondern bloss, wenn der angefochtene Entscheid offensichtlich unhaltbar ist, mit der tatsächlichen Situation in klarem Widerspruch steht, eine Norm oder einen unumstrittenen Rechtsgrundsatz krass verletzt oder in stossender Weise dem Gerechtigkeitsgedanken zuwiderläuft (<ref-ruling> E. 4.1; <ref-ruling> E. 2.1; je mit Hinweisen). Dass die von Sachgerichten gezogenen Schlüsse nicht mit der eigenen Darstellung der beschwerdeführenden Partei übereinstimmen, belegt keine Willkür (<ref-ruling> E. 2.3 S. 266 mit Hinweisen). Erforderlich ist zudem, dass der Entscheid nicht nur in der Begründung, sondern auch im Ergebnis willkürlich ist (BGE <ref-ruling> E. 2.1 S. 19 mit Hinweisen).
2.3. Das Bundesgericht legt seinem Urteil den Sachverhalt zugrunde, den die Vorinstanz festgestellt hat (<ref-law>). Es kann davon nur abweichen, wenn die Sachverhaltsfeststellung unter Verletzung eines verfassungsmässigen Rechts zustande gekommen ist (Art. 118 Abs. 2 und <ref-law>), was die beschwerdeführende Partei mit einer genügenden Begründung geltend zu machen hat (<ref-ruling> E. 2.2; <ref-ruling> E. 3.2 S. 445 mit Hinweis). Soweit die beschwerdeführende Partei den Sachverhalt ergänzen will, hat sie zudem mit präzisen Aktenhinweisen darzulegen, dass sie entsprechende rechtsrelevante Tatsachen und taugliche Beweismittel bereits bei den Vorinstanzen prozesskonform eingebracht hat (<ref-ruling> E. 2 S. 90). Genügt die Kritik diesen Anforderungen nicht, können Vorbringen mit Bezug auf einen Sachverhalt, der vom angefochtenen Entscheid abweicht, nicht berücksichtigt werden (BGE <ref-ruling> E. 1.3.1 S. 18 mit weiteren Hinweisen).
Die Beschwerdeführerin kann daher insoweit nicht gehört werden, als sie in ihrer Beschwerde den streitgegenständlichen Sachverhalt und die Prozessgeschichte aus eigener Sicht darstellt und dabei von den tatsächlichen Feststellungen im angefochtenen Urteil abweicht, ohne im Einzelnen hinreichend begründete Sachverhaltsrügen gemäss den eben dargelegten Grundsätzen zu formulieren.
3.
Das Bezirksgericht prüfte, ob die Parteien die Vereinbarung vom 24. April 2007 vertraglich aufgehoben hatten. Es erwog zusammengefasst, dass die Erklärungen der Parteien nach dem Vertrauensprinzip auszulegen seien, da deren tatsächlicher Wille nicht festgestellt werden könne. Die vereinbarte fünfjährige Werbelaufzeit habe am 5. Februar 2008 begonnen. Mangels Kündigung habe sich der Vertrag nach Ablauf dieser Laufzeit - das heisst ab dem 5. Februar 2013 - automatisch verlängert. In der Folge sei die Beschwerdegegnerin indes von der Beschwerdeführerin nicht kontaktiert und die Werbung nicht zur Auslieferung gebracht worden. Die Beschwerdegegnerin habe deshalb spätestens nach Ablauf von 36 Monaten (also am 5. Februar 2016) davon ausgehen müssen, dass entweder nicht genügend Interessenten für Werbeflächen gefunden worden seien (womit ein Fall von Ziff. 16 AGB eingetreten und der Vertrag dahingefallen wäre) oder die Beschwerdeführerin an der Weiterführung des Vertrags vom 24. April 2007 nicht mehr interessiert sei. Die Beschwerdegegnerin habe dieses Verhalten nur als Offerte zur Vertragsaufhebung verstehen können und diese nach zwei weiteren Monaten stillschweigend akzeptiert. Folglich sei der Aufhebungsvertrag spätestens am 5. April 2016 zustande gekommen und fehle es an einer Grundlage für die eingeklagte Forderung. Das Obergericht schloss sich diesen Erwägungen an.
4.
Die Beschwerdeführerin rügt eine Verletzung des Anspruchs auf rechtliches Gehör (<ref-law>).
Zur Begründung stellt sie verschiedene rechtliche Argumente in den Raum, mit denen sich die Vorinstanz nicht auseinandergesetzt habe. Soweit sie nicht mit präzisen Aktenhinweisen darlegt, dass sie diese bereits vor Obergericht vorgebracht hat, ist sie von vornherein nicht zu hören.
In der Sache geht ihr Vorwurf ins Leere. Im Kern begründet sie diesen nämlich damit, dass das Obergericht ihrer Rechtsauffassung nicht folgte. Dies stellt keine Gehörsverletzung dar (siehe etwa Urteil 4A_36/2019 vom 21. Februar 2019 E. 5.4). So greift sie die vorinstanzliche Erwägung an, wonach das Verhalten der Parteien nach Vertragsabschluss für die Auslegung nach dem Vertrauensprinzip nicht von Bedeutung sei. Damit - so die Beschwerdeführerin - verkenne das Obergericht, dass aus dem nachträglichen Parteiverhalten "Rückschlüsse auf die Willenslage bei Vertragsschluss zu ziehen" seien. Die in diesem Zusammenhang stehenden Vorbringen seien von der Vorinstanz in Verletzung von <ref-law> nicht berücksichtigt worden. Damit übt die Beschwerdeführerin Kritik an der vorinstanzlichen Rechtsanwendung, erhebt aber keine Verfassungsrüge. Gleich verhält es sich, wenn sie behauptet, das Obergericht habe den ersten Satz von Ziff. 3 lit. g AGB nicht (in ihrem Sinn) berücksichtigt. Sowohl das Bezirks- als auch das Obergericht haben sich eingehend mit Ziff. 3 lit. g AGB beschäftigt, daraus indes andere Schlüsse gezogen, als dies die Beschwerdeführerin tut. Eine Verletzung des Anspruchs auf rechtliches Gehör ist nicht auszumachen.
5.
Schliesslich meint die Beschwerdeführerin, das angefochtene Urteil sei willkürlich.
5.1. Sie führt aus, es sei offensichtlich unhaltbar, dass die Vorinstanz "bei zwei stillschweigenden Parteien einen Vertragsaufhebungsvertrag" konstruiere, "obwohl nicht einmal konkludente Handlungen" vorlägen. Dies laufe "dem Gedanken und Prinzip der Rechtssicherheit" zuwider und verletze die Art. 6 und Art. 18 OR "in krasser Weise".
5.2. Zum Abschluss eines Vertrags ist die übereinstimmende gegenseitige Willensäusserung der Parteien erforderlich (<ref-law>). Sie kann eine ausdrückliche oder stillschweigende sein (<ref-law>). Es ist unter Willkürgesichtspunkten nicht zu beanstanden, wenn die Vorinstanz diese Grundsätze auch auf den Aufhebungsvertrag angewandt hat (siehe Urteile 4A_145/2016 vom 19. Juli 2016 E. 3.2; 4A_125/2009 vom 2. Juni 2009 E. 3.3; je mit Hinweisen).
5.3.
5.3.1. Im schweizerischen Vertragsrecht gilt bei Fragen des Konsenses und der Auslegung der Grundsatz des Primats des subjektiv übereinstimmend Gewollten vor dem objektiv Erklärten, subjektiv aber unterschiedlich Verstandenen. Kann der tatsächliche Wille der erklärenden Partei nicht festgestellt werden, so ist ihre Erklärung nach dem Vertrauensprinzip auszulegen. Die Partei hat danach ihre Erklärung so gelten zu lassen, wie sie von der Adressatin nach ihrem Wortlaut und Zusammenhang sowie den gesamten Umständen nach Treu und Glauben verstanden werden durfte und musste (<ref-ruling> E. 5.2.3, 43 E. 3.3; <ref-ruling> E. 1.2.2; <ref-ruling> E. 4.2.1 S. 666; je mit Hinweisen). Dabei entscheidet das Vertrauensprinzip auch darüber, ob überhaupt eine Willenserklärung vorliegt (Urteil 4A_456/2009 vom 3. Mai 2010 E. 3.3.1 mit Hinweisen).
5.3.2. Die Beschwerdeführerin legt ihre eigene Interpretation der massgeblichen Vertragsklauseln und des Verhaltens der Parteien dar, womit sie die Begründung des Obergerichts nicht als willkürlich auszuweisen vermag. So verhält es sich namentlich mit ihrem wiederholten Hinweis, der Wille zur Vertragsaufhebung sei von den Parteien nicht "klar zum Ausdruck" gebracht worden, ihrer freien Auseinandersetzung mit Ziff. 3 lit. g sowie Ziff. 16 AGB und ihrer Behauptung, sie sei in der fraglichen Zeit nicht untätig geblieben, sondern habe "ein Fahrzeug für die zweite Vertragsperiode organisiert und zahlreiche Neukunden akquiriert", ohne hinreichend darzulegen, inwiefern diese Vorkehren für die Beschwerdegegnerin überhaupt erkennbar gewesen wären. Das Obergericht durfte vielmehr ohne in Willkür zu verfallen berücksichtigen, dass nicht ein einseitiger Erlass einer Schuld, sondern die Aufhebung eines ganzen Vertragsverhältnisses in Frage steht, die sowohl die Pflicht der Beschwerdeführerin, Werbemassnahmen zu treffen, als auch die Pflicht der Beschwerdegegnerin, ein Entgelt zu erbringen, betrifft. Weiter legte es seinen Überlegungen den Umstand zugrunde, dass an ununterbrochenen Werbemassnahmen ein besonderes Interesse besteht. Es hält vor dem Willkürverbot stand, wenn das Schweigen der Parteien in diesem Lichte gewürdigt wird. Die Vorinstanz leitete sodann willkürfrei aus Ziff. 3 lit. g AGB ab, dass sich die Beschwerdeführerin innert der "Bearbeitungszeit" von höchstens 12 Monaten ab Vertragsverlängerung bei der Beschwerdegegnerin hätte melden müssen und die Beschwerdegegnerin ihrerseits gehalten gewesen wäre, die Beschwerdeführerin nach Ablauf dieser Zeit abzumahnen und eine zweimonatige Frist anzusetzen. Vor diesem Hintergrund ist die Folgerung nicht offensichtlich unhaltbar, die Beschwerdegegnerin habe aus dem über 36 Monate dauernden Schweigen der Beschwerdeführerin nach Treu und Glauben auf einen Willen zur Aufhebung des Vertrags vom 24. April 2007 schliessen dürfen. Gleich verhält es sich betreffend das Schweigen der Beschwerdegegnerin, die ebenfalls entgegen dem in Ziff. 3 lit. g AGB vorgesehenen Prozedere nicht reagierte. Schliesslich liegt auch keine Willkür vor, wenn das Obergericht das Verhalten der Parteien nach dem 5. April 2016 bei der Auslegung nach dem Vertrauensprinzip nicht berücksichtigte (siehe <ref-ruling> E. 3.1 mit Hinweisen).
5.4. Zusammengefasst ist es jedenfalls nicht verfassungswidrig, wenn die Vorinstanz den Abschluss eines Aufhebungsvertrags bejaht und die Klageabweisung daher geschützt hat.
6.
Die Beschwerde ist abzuweisen, soweit darauf eingetreten werden kann. Dem Ausgang des Verfahrens entsprechend wird die Beschwerdeführerin kosten- und entschädigungspflichtig (siehe Art. 66 Abs. 1 sowie Art. 68 Abs. 1 und 2 BGG).

Demnach erkennt das Bundesgericht:
1.
Die Beschwerde wird abgewiesen, soweit darauf einzutreten ist.
2.
Die Gerichtskosten von Fr. 2'000.-- werden der Beschwerdeführerin auferlegt.
3.
Die Beschwerdeführerin hat die Beschwerdegegnerin für das bundesgerichtliche Verfahren mit Fr. 2'500.-- zu entschädigen.
4.
Dieses Urteil wird den Parteien und dem Obergericht des Kantons Zürich, I. Zivilkammer, schriftlich mitgeteilt.
Lausanne, 23. September 2019
Im Namen der I. zivilrechtlichen Abteilung
des Schweizerischen Bundesgerichts
Die Präsidentin: Kiss
Der Gerichtsschreiber: Stähle