gettickr
Startseite
Features
PreiseHilfe
Erste Schritte
Was ist gettickr.app?
Free vs. Premium
Konto erstellen
Timer konfigurieren
Countdown erstellen (Dauer)
CountTo erstellen (Datum)
Design anpassen
Vorschau vs. Countdown
Timer speichern & verwalten
Timer-Fernsteuerung
Streaming Integration
Übersicht Streaming-Plattformen
OBS Studio Integration
Streamlabs Integration
XSplit Integration
Website Integration
Übersicht Website-Einbindung
iFrame Integration
WordPress Integration
Shopify Integration
Wix / Squarespace
Eigene HTML Websites
Erweiterte Funktionen
Timer Status & Persistenz
Free vs. Premium Timer
FAQ & Troubleshooting
Häufige Fragen
Bekannte Probleme
Support kontaktieren
Hilfe-Center
/
Website-Integration
/
Custom HTML Integration

Inhaltsverzeichnis

Schnellstart-ÜberblickBasis-HTML-IntegrationCSS-Styling und LayoutStatic Site GeneratorsFramework-IntegrationPerformance-OptimierungSicherheits-Best PracticesFehlerbehebungNächste Schritte

Eigene HTML-Websites

Information
Eigene (custom-coded) Websites bieten volle Kontrolle über die Timer-Integration. Egal ob du mit reinem HTML, einem Static Site Generator oder einem Framework arbeitest – dieser Leitfaden deckt alle Methoden ab!

Eigene Websites bieten maximale Flexibilität für die Einbindung von gettickr.app Timern. Diese Anleitung richtet sich an Entwickler:innen und zeigt Integrationsmöglichkeiten von einfachem HTML bis hin zu fortgeschrittenen Framework-Lösungen.

Schnellstart-Überblick

IntegrationSchwierigkeitAm besten geeignet fürZeitaufwand
Basis-HTMLEinfachStatische Seiten2 Minuten
Responsives CSSEinfachMobile-optimierte Seiten5 Minuten
JavaScriptMittelDynamisches Nachladen10 Minuten
Static BuilderMittelJAMstack-Seiten5 Minuten
React/VueMittelSPAs, moderne Apps10 Minuten
FortgeschrittenSchwerKomplexe Integrationen30+ Minuten
Tip
Starte mit der Basis-HTML-Integration und erweitere schrittweise je nach Bedarf und Architektur deiner Seite!

Basis-HTML-Integration

Die einfachste Methode nutzt ein Standard-HTML-iFrame-Element.

Minimale Implementierung

<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Event Countdown</title>
  </head>
  <body>
    <h1>Produkt-Launch Countdown</h1>

    <iframe
      src="https://gettickr.app/r/#DEIN-TIMER-ID"
      width="800"
      height="400"
      frameborder="0"
      title="Launch Countdown Timer"
    >
    </iframe>

    <p>Verpasse nicht unseren größten Launch des Jahres!</p>
  </body>
</html>

HTML-Attribut-Referenz

AttributErforderlichBeispielwertZweck
src✅ Jahttps://gettickr.app/r/#abc123Timer-URL
width✅ Ja800 oder 100%iFrame-Breite
height✅ Ja400iFrame-Höhe
frameborder⬜ Nein0Rahmen entfernen (Legacy)
style⬜ Neinborder: none;CSS-Styling
title⬜ Ja"Countdown Timer"Barrierefreiheit
aria-label⬜ Nein"Verbleibende Zeit: 3 Stunden"Screenreader-Beschreibung
loading⬜ NeinlazyLazy Loading
allow⬜ NeinfullscreenFeature-Berechtigungen
sandbox⬜ Neinallow-scripts allow-same-originSicherheitsbeschränkungen
referrerpolicy⬜ Neinno-referrer-when-downgradeReferrer-Header-Policy

CSS-Styling und Layout

Zentrierter Timer

<style>
  .timer-container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 20px;
    text-align: center;
  }

  .timer-container iframe {
    display: block;
    margin: 0 auto;
    border: none;
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
    border-radius: 8px;
  }
</style>
<div class="timer-container">
  <h2>Event Countdown</h2>
  <iframe
    src="https://gettickr.app/r/#DEIN-TIMER-ID"
    width="100%"
    height="400"
    title="Event Timer"
  >
  </iframe>
</div>

Grid-Layout mit mehreren Timern

<style>
  .timer-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
    gap: 30px;
    padding: 20px;
    max-width: 1400px;
    margin: 0 auto;
  }

  .timer-card {
    background: #f8f9fa;
    border-radius: 12px;
    padding: 30px;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
  }

  .timer-card h3 {
    margin-top: 0;
    color: #333;
  }

  .timer-card iframe {
    width: 100%;
    border: none;
    border-radius: 8px;
  }
</style>

<div class="timer-grid">
  <div class="timer-card">
    <h3>Event 1: Produkt-Launch</h3>
    <iframe
      src="https://gettickr.app/r/#TIMER-1"
      height="300"
      title="Event 1 Timer"
    ></iframe>
  </div>

  <div class="timer-card">
    <h3>Event 2: Blitzangebot</h3>
    <iframe
      src="https://gettickr.app/r/#TIMER-2"
      height="300"
      title="Event 2 Timer"
    ></iframe>
  </div>

  <div class="timer-card">
    <h3>Event 3: Webinar</h3>
    <iframe
      src="https://gettickr.app/r/#TIMER-3"
      height="300"
      title="Event 3 Timer"
    ></iframe>
  </div>
</div>

Hero-Section-Timer

<style>
  .hero-countdown {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    color: white;
    padding: 80px 20px;
    text-align: center;
    position: relative;
    overflow: hidden;
  }

  .hero-countdown::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: url('/pattern.svg') repeat;
    opacity: 0.1;
  }

  .hero-countdown .content {
    position: relative;
    z-index: 1;
    max-width: 1200px;
    margin: 0 auto;
  }

  .hero-countdown h1 {
    font-size: 56px;
    margin: 0 0 20px 0;
    font-weight: 700;
  }

  .hero-countdown .subtitle {
    font-size: 24px;
    margin: 0 0 40px 0;
    opacity: 0.95;
  }

  .hero-countdown iframe {
    border: none;
    background: transparent;
    max-width: 100%;
  }
</style>

<section class="hero-countdown">
  <div class="content">
    <h1>🎉 Grand Opening Sale</h1>
    <p class="subtitle">Bis zu 70% Rabatt – Nicht verpassen!</p>
    <iframe
      src="https://gettickr.app/r/#DEIN-TIMER-ID"
      width="100%"
      height="500"
      title="Sale Countdown"
    >
    </iframe>
  </div>
</section>

Static Site Generators

Jekyll

<!-- _includes/countdown-timer.html -->
<div class="countdown-timer-wrapper">
  {% if include.title %}
  <h2>{{ include.title }}</h2>
  {% endif %}

  <iframe
    src="https://gettickr.app/r/#{{ include.timer_id }}"
    width="{{ include.width | default: '100%' }}"
    height="{{ include.height | default: '400' }}"
    frameborder="0"
    style="border: none; max-width: 100%;"
    title="{{ include.title | default: 'Countdown Timer' }}"
  >
  </iframe>

  {% if include.caption %}
  <p class="timer-caption">{{ include.caption }}</p>
  {% endif %}
</div>

<!-- Verwendung in Seiten/Posts -->
{% include countdown-timer.html timer_id="DEIN-TIMER-ID" title="Event Countdown"
height="500" caption="Nicht verpassen!" %}

Hugo

<!-- layouts/shortcodes/timer.html -->
{{ $timerId := .Get "id" }} {{ $width := .Get "width" | default "100%" }} {{
$height := .Get "height" | default "400" }} {{ $title := .Get "title" | default
"Countdown Timer" }}

<div class="hugo-timer-container">
  {{ if .Get "heading" }}
  <h2>{{ .Get "heading" }}</h2>
  {{ end }}

  <iframe
    src="https://gettickr.app/r/#{{ $timerId }}"
    width="{{ $width }}"
    height="{{ $height }}"
    frameborder="0"
    style="border: none; max-width: 100%;"
    title="{{ $title }}"
  >
  </iframe>
</div>

<!-- Verwendung in Content-Dateien -->
{{< timer id="DEIN-TIMER-ID" height="500" heading="Aktion endet bald!" >}}

Gatsby (React)

// src/components/CountdownTimer.js
import React from 'react';

const CountdownTimer = ({
  timerId,
  width = '100%',
  height = '400',
  title = 'Countdown Timer',
  className = '',
  style = {}
}) => {
  if (!timerId) {
    console.error('CountdownTimer: timerId prop is required');
    return null;
  }

  const iframeStyle = {
    border: 'none',
    maxWidth: '100%',
    ...style
  };

  return (
    <iframe
      src={`https://gettickr.app/r/#${timerId}`}
      width={width}
      height={height}
      title={title}
      className={className}
      style={iframeStyle}
      frameBorder="0"
      allowFullScreen
    />
  );
};

export default CountdownTimer;

// Verwendung in Seiten
import CountdownTimer from '../components/CountdownTimer';

const EventPage = () => (
  <div>
    <h1>Produkt-Launch</h1>
    <CountdownTimer
      timerId="DEIN-TIMER-ID"
      height="500"
      title="Launch Countdown"
    />
  </div>
);

Eleventy (11ty)

// _includes/timer.njk
<div class="eleventy-timer">
  {% if heading %}
  <h2>{{ heading }}</h2>
  {% endif %}

  <iframe
    src="https://gettickr.app/r/#{{ timerId }}"
    width="{{ width or '100%' }}"
    height="{{ height or '400' }}"
    frameborder="0"
    style="border: none; max-width: 100%;"
    title="{{ title or 'Countdown Timer' }}"
  >
  </iframe>
</div>

<!-- Verwendung in Templates -->
{% include "timer.njk", { timerId: "DEIN-TIMER-ID", heading: "Event Countdown",
height: "500" } %}
Tip
Erstelle wiederverwendbare Timer-Komponenten/Includes in deinem Static Site Generator, um Konsistenz zu gewährleisten und die Verwaltung der Timer auf deiner Seite zu vereinfachen!

Framework-Integration

React-Komponente

import React, { useEffect, useRef, useState } from 'react';

const TickrTimer = ({
  timerId,
  width = '100%',
  height = '400',
  title = 'Countdown Timer',
  className = '',
  loading = 'lazy',
  onLoad,
  onError
}) => {
  const iframeRef = useRef(null);
  const [isLoaded, setIsLoaded] = useState(false);
  const [hasError, setHasError] = useState(false);

  useEffect(() => {
    const iframe = iframeRef.current;
    if (!iframe) return;

    const handleLoad = () => {
      setIsLoaded(true);
      onLoad?.();
    };

    const handleError = () => {
      setHasError(true);
      onError?.();
    };

    iframe.addEventListener('load', handleLoad);
    iframe.addEventListener('error', handleError);

    return () => {
      iframe.removeEventListener('load', handleLoad);
      iframe.removeEventListener('error', handleError);
    };
  }, [onLoad, onError]);

  if (!timerId) {
    console.error('TickrTimer: timerId prop is required');
    return <div>Fehler: Timer-ID nicht angegeben</div>;
  }

  return (
    <div className={`tickr-timer-wrapper ${className}`}>
      {!isLoaded && !hasError && (
        <div className="timer-loading">Timer wird geladen...</div>
      )}
      {hasError && (
        <div className="timer-error">Timer konnte nicht geladen werden</div>
      )}
      <iframe
        ref={iframeRef}
        src={`https://gettickr.app/r/#${timerId}`}
        width={width}
        height={height}
        title={title}
        loading={loading}
        style={{ border: 'none', maxWidth: '100%' }}
        frameBorder="0"
        allowFullScreen
      />
    </div>
  );
};

export default TickrTimer;

// Verwendung
import TickrTimer from './components/TickrTimer';

function App() {
  return (
    <div>
      <h1>Produkt-Launch</h1>
      <TickrTimer
        timerId="DEIN-TIMER-ID"
        height="500"
        className="launch-timer"
        onLoad={() => console.log('Timer geladen')}
      />
    </div>
  );
}

Vue 3-Komponente

<!-- CountdownTimer.vue -->
<template>
  <div class="countdown-timer-wrapper" :class="className">
    <div v-if="loading && !loaded" class="timer-loading">
      Timer wird geladen...
    </div>
    <div v-if="error" class="timer-error">
      Timer konnte nicht geladen werden
    </div>
    <iframe
      ref="iframeRef"
      :src="`https://gettickr.app/r/#${timerId}`"
      :width="width"
      :height="height"
      :title="title"
      :loading="loadingAttr"
      frameborder="0"
      allowfullscreen
      style="border: none; max-width: 100%;"
      @load="handleLoad"
      @error="handleError"
    />
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';

const props = defineProps({
  timerId: {
    type: String,
    required: true
  },
  width: {
    type: String,
    default: '100%'
  },
  height: {
    type: String,
    default: '400'
  },
  title: {
    type: String,
    default: 'Countdown Timer'
  },
  className: {
    type: String,
    default: ''
  },
  loadingAttr: {
    type: String,
    default: 'lazy'
  }
});

const emit = defineEmits(['load', 'error']);

const iframeRef = ref(null);
const loaded = ref(false);
const error = ref(false);
const loading = ref(true);

const handleLoad = () => {
  loaded.value = true;
  loading.value = false;
  emit('load');
};

const handleError = () => {
  error.value = true;
  loading.value = false;
  emit('error');
};
</script>

<style scoped>
.countdown-timer-wrapper {
  position: relative;
}

.timer-loading,
.timer-error {
  padding: 20px;
  text-align: center;
  background: #f0f0f0;
  border-radius: 8px;
}

.timer-error {
  color: #e74c3c;
}
</style>

<!-- Verwendung -->
<template>
  <div>
    <h1>Event Countdown</h1>
    <CountdownTimer
      timer-id="DEIN-TIMER-ID"
      height="500"
      @load="onTimerLoad"
    />
  </div>
</template>

<script setup>
import CountdownTimer from './components/CountdownTimer.vue';

const onTimerLoad = () => {
  console.log('Timer erfolgreich geladen');
};
</script>

Angular-Komponente

// countdown-timer.component.ts
import { Component, Input, OnInit } from '@angular/core';
import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';

@Component({
  selector: 'app-countdown-timer',
  template: `
    <div class="countdown-timer-wrapper" [ngClass]="className">
      <div *ngIf="loading" class="timer-loading">Timer wird geladen...</div>
      <div *ngIf="error" class="timer-error">Timer konnte nicht geladen werden</div>
      <iframe
        [src]="safeUrl"
        [width]="width"
        [height]="height"
        [title]="title"
        [attr.loading]="loadingAttr"
        frameborder="0"
        allowfullscreen
        (load)="onLoad()"
        (error)="onError()"
        style="border: none; max-width: 100%;">
      </iframe>
    </div>
  `,
  styles: [`
    .countdown-timer-wrapper {
      position: relative;
    }
    .timer-loading, .timer-error {
      padding: 20px;
      text-align: center;
      background: #f0f0f0;
      border-radius: 8px;
    }
    .timer-error {
      color: #e74c3c;
    }
  `]
})
export class CountdownTimerComponent implements OnInit {
  @Input() timerId!: string;
  @Input() width: string = '100%';
  @Input() height: string = '400';
  @Input() title: string = 'Countdown Timer';
  @Input() className: string = '';
  @Input() loadingAttr: string = 'lazy';

  safeUrl!: SafeResourceUrl;
  loading: boolean = true;
  error: boolean = false;

  constructor(private sanitizer: DomSanitizer) {}

  ngOnInit() {
    if (!this.timerId) {
      console.error('CountdownTimer: timerId is required');
      this.error = true;
      this.loading = false;
      return;
    }

    const url = `https://gettickr.app/r/#${this.timerId}`;
    this.safeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);
  }

  onLoad() {
    this.loading = false;
  }

  onError() {
    this.loading = false;
    this.error = true;
  }
}

// Verwendung im Template
<app-countdown-timer
  timerId="DEIN-TIMER-ID"
  height="500"
  className="launch-timer">
</app-countdown-timer>
Information
Framework-Komponenten bieten eine bessere Integration in den Lebenszyklus deiner App, State-Management und können Lade- sowie Fehlerzustände abbilden.

Performance-Optimierung

Lazy Loading

<iframe
  src="https://gettickr.app/r/#DEIN-TIMER-ID"
  width="100%"
  height="400"
  loading="lazy"
  style="border: none;"
  title="Countdown Timer"
>
</iframe>

Kritische Timer vorladen

<!-- Im <head>-Bereich -->
<link rel="preconnect" href="https://gettickr.app" />
<link rel="dns-prefetch" href="https://gettickr.app" />

Asynchrones Laden per Script

<div id="timer-placeholder" data-timer-id="DEIN-TIMER-ID"></div>

<script>
  (function () {
    function loadTimer() {
      const placeholder = document.getElementById('timer-placeholder');
      const timerId = placeholder.dataset.timerId;

      if (!placeholder || !timerId) return;

      const iframe = document.createElement('iframe');
      iframe.src = `https://gettickr.app/r/#${timerId}`;
      iframe.width = '100%';
      iframe.height = '400';
      iframe.style.border = 'none';
      iframe.title = 'Countdown Timer';

      placeholder.appendChild(iframe);
    }

    // Laden nach vollständigem Seitenaufbau
    if (document.readyState === 'complete') {
      loadTimer();
    } else {
      window.addEventListener('load', loadTimer);
    }
  })();
</script>

Performance Best Practices

MaßnahmeUmsetzungVorteil
Lazy Loadingloading="lazy" AttributSchnellere Ladezeit
DNS Prefetch<link rel="dns-prefetch">Schnellere Verbindung
Preconnect<link rel="preconnect">Schnellere Ressourcenlade
Async JavaScriptNach Seitenaufbau ladenBlockierfreies Laden
Intersection ObserverLaden beim Scrollen in SichtVerzögertes Laden
Timer-Anzahl minimierenMax. 1-3 Timer pro SeiteBessere Performance
Passende DimensionenDesigngröße anpassenWeniger unnötiges Rendern
Unnötige Attribute wegHTML aufräumenKleinere DOM-Struktur

Sicherheits-Best Practices

Content Security Policy (CSP)

<!-- Im <head> oder als HTTP-Header -->
<meta
  http-equiv="Content-Security-Policy"
  content="default-src 'self'; frame-src https://gettickr.app; script-src 'self';"
/>

Sandbox-Attribut (falls benötigt)

<iframe
  src="https://gettickr.app/r/#DEIN-TIMER-ID"
  width="100%"
  height="400"
  sandbox="allow-scripts allow-same-origin"
  title="Countdown Timer"
>
</iframe>
Warning
Verwende das sandbox-Attribut nur, wenn es deine Sicherheitsrichtlinie explizit verlangt. Falsche Konfiguration kann die Timer-Funktionalität beeinträchtigen.

Nur HTTPS verwenden

<iframe
  src="https://gettickr.app/r/#DEIN-TIMER-ID"
  width="100%"
  height="400"
  title="Countdown Timer"
>
</iframe>
Information
Verwende immer HTTPS (https://) in Timer-URLs, niemals HTTP. Moderne Browser blockieren gemischte Inhalte (HTTP-iFrames auf HTTPS-Seiten).

Fehlerbehebung

Häufige Probleme

ProblemMögliche UrsacheLösung
Timer erscheint nichtFalsche URLTimer-ID und URL prüfen
Schwarzes/leeres iFrameNetzwerkproblemBrowser-Konsole auf Fehler prüfen
Content Security PolicyCSP blockiert iFramegettickr.app zu frame-src hinzufügen
Mixed Content WarnungHTTP auf HTTPS-Seitehttps:// in Timer-URL verwenden
Timer zu kleinContainer zu kleinContainer-Breite/Höhe anpassen
Überlappende InhalteCSS-KonflikteIsolation oder z-index nutzen
Langsames LadenKein Lazy Loadingloading="lazy" Attribut ergänzen
JavaScript-FehlerSyntaxfehler im CodeKonsole prüfen, JS validieren

Nächste Schritte

  • Weitere Integrationsmöglichkeiten findest du in den anderen Hilfeseiten.
  • Bei Fragen oder Problemen: Support kontaktieren
2026|Made by
ÄnderungshistorieImpressumDatenschutzerklärungCookie-RichtlinieAGB