diff --git a/app/layout.tsx b/app/layout.tsx index 0ddae53..963f792 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -2,21 +2,24 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; import { Providers } from "./providers"; +import { GoogleAnalytics } from "@/components/GoogleAnalytics"; +import { + GoogleTagManager, + GoogleTagManagerNoscript, +} from "@/components/GoogleTagManager"; import { JsonLd } from "@/components/JsonLd"; import { Matomo } from "@/components/Matomo"; +import { MicrosoftClarity } from "@/components/MicrosoftClarity"; const inter = Inter({ subsets: ["latin"] }); const SITE_URL = "https://songs2vid.com"; const SITE_NAME = "Songs2VID"; const DEFAULT_TITLE = - "Songs2VID - Fast Audio to Video Converter for YouTube | TunesToTube Alternative"; + "Songs2VID - Automated Audio to Video Pipeline for Content Creators"; const DEFAULT_DESCRIPTION = - "Convert MP3, WAV, and audio files into YouTube videos instantly. The fastest, privacy-focused online tool to upload music, beats, and podcasts directly to YouTube."; -const OG_TITLE = "Songs2VID - Fast Audio to Video Converter for YouTube"; -const OG_DESCRIPTION = - "Convert MP3 & audio files into YouTube videos instantly without heavy editing."; -const TWITTER_DESCRIPTION = "Convert MP3 & audio files into YouTube videos instantly."; + "Convert MP3/WAV tracks and cover art into YouTube-ready videos instantly. Automated, Docker-ready, and lightweight pipeline."; +const OG_IMAGE = "https://songs2vid.com/og-image.png"; export const metadata: Metadata = { metadataBase: new URL(SITE_URL), @@ -26,7 +29,16 @@ export const metadata: Metadata = { }, description: DEFAULT_DESCRIPTION, keywords: [ + "upload mp3 to youtube", + "upload flac to youtube", + "upload wav to youtube", + "mp3 to youtube hd", + "jpg to video", "mp3 to youtube", + "mp3 to youtube converter", + "upload mp3", + "mp3 uploader", + "youtube upload", "audio to video converter", "upload audio to youtube", "tunestotube alternative", @@ -42,26 +54,26 @@ export const metadata: Metadata = { canonical: SITE_URL, }, openGraph: { - title: OG_TITLE, - description: OG_DESCRIPTION, + title: DEFAULT_TITLE, + description: DEFAULT_DESCRIPTION, url: SITE_URL, siteName: SITE_NAME, type: "website", locale: "en_US", images: [ { - url: "/logo.png", - width: 512, - height: 512, + url: OG_IMAGE, + width: 1200, + height: 630, alt: SITE_NAME, }, ], }, twitter: { card: "summary_large_image", - title: OG_TITLE, - description: TWITTER_DESCRIPTION, - images: ["/logo.png"], + title: DEFAULT_TITLE, + description: DEFAULT_DESCRIPTION, + images: [OG_IMAGE], }, robots: { index: true, @@ -83,9 +95,15 @@ export default function RootLayout({ }>) { return ( + + + + + + {children} diff --git a/app/privacy/page.tsx b/app/privacy/page.tsx index c3b6377..e74669b 100644 --- a/app/privacy/page.tsx +++ b/app/privacy/page.tsx @@ -64,45 +64,71 @@ export default function PrivacyPage() { uploaded MP3 files to help prefill fields
  • Playlist titles and IDs when you create or attach YouTube playlists through the Service
  • +
  • + Optional job callback URLs (webhookUrl) you provide for automation (for + example n8n or Make) - see section 3.5 +
  • 3.3 Usage, API, and technical data

    • - Plan type, monthly credit allocation, credits used, purchased extra credits, quota reset + Plan type (Bedroom Producer / Independent Producer / Developer & Automation / + Enterprise), monthly credit allocation, credits used, purchased extra credits, quota reset dates, lifetime successful video render count (used for Free-tier watermark policy), and job processing status
    • - Quota reset / extension and API rate-limit extension request history (Pro) when you submit - a request + Quota reset / extension request history for paid plans, and API rate-limit extension + request history for Developer & Automation / Enterprise when you submit a request
    • - API key material for Pro users: we store a cryptographic hash and a short non-secret - prefix; the full key is shown once at creation and is not stored in plaintext + API key material for Developer & Automation and Enterprise users: we store a + cryptographic hash and a short non-secret prefix; the full key is shown once at creation + and is not stored in plaintext
    • IP address, browser type, device information, and request logs
    • Error reports and operational diagnostics
    • Website and product analytics events collected via Matomo (self-hosted at - analytics.atakanozban.com) to understand traffic and improve the Service — see section - 10 + analytics.atakanozban.com), Google Analytics (GA4 measurement IDs G-9XCHRS7LJR and G-2V3FSMMPQX), + Google Tag Manager (container GTM-PZL4HXBR), Microsoft Clarity (project y4hxg6t7s6), and + Google Search Console search-performance reports to understand traffic and improve the + Service - see section 10

    3.4 Payment data

    - If you purchase a Pro subscription or Free-plan extra credits, payment processing is handled - by Stripe. We do not store full payment card details on our servers. We may receive and store - billing status, Stripe customer and subscription identifiers, Checkout session or payment - references, purchase amounts, and credit pack size for fulfilled top-ups. + If you purchase an Independent Producer subscription, a Developer & Automation + subscription, an Enterprise arrangement, or Free-plan extra credits, payment processing is + handled by Stripe. We do not store full payment card details on our servers. We may receive + and store billing status, Stripe customer and subscription identifiers, Checkout session or + payment references, plan identifiers, purchase amounts, and credit pack size for fulfilled + top-ups. +

    + +

    3.5 Job webhooks and automation callbacks

    +

    + On Developer & Automation and Enterprise plans (and self-hosted deployments where + enabled), you may supply an absolute HTTP(S) callback URL when creating a render job. We + store that URL with the job record and, when encoding or upload reaches a terminal state, + may POST a JSON payload to it. Typical fields include event type, job and item identifiers, + status, optional YouTube video ID, error message, and completion timestamp. +

    +

    + You choose the destination (for example your n8n webhook, Make scenario, or your own + server). We do not control how that endpoint stores or shares the payload. Only set URLs you + own or are authorized to use. Delivery is best-effort; we do not guarantee receipt or + retention by the receiving system.

    4. Why we process your data

    • Contract performance: to provide video encoding, metadata handling, - playlist actions, API access, and YouTube upload features you request + playlist actions, API access, webhook notifications, and YouTube upload features you + request
    • Legitimate interests: to secure our service, prevent abuse, improve @@ -145,18 +171,73 @@ export default function PrivacyPage() { storage
    • - Stripe: Pro subscriptions, Free-plan credit top-ups, and related billing - webhooks ( + Stripe: Independent Producer and Developer & Automation + subscriptions, Free-plan credit top-ups, and related billing webhooks ( Stripe Privacy Policy )
    • +
    • + Your webhook endpoints: if you configure a job webhookUrl, + we send job status JSON to that URL as described in section 3.5 +
    • Matomo (self-hosted analytics): privacy-friendly analytics we operate at analytics.atakanozban.com to measure visits and improve Songs2VID. Analytics data stays on infrastructure we control; we do not sell it to advertising networks.
    • +
    • + Google Analytics: Google LLC processes aggregated usage analytics for our + sites under Google's terms when the GA4 tags (G-9XCHRS7LJR and G-2V3FSMMPQX) load. See{" "} + + Google's Privacy Policy + + . +
    • +
    • + Google Tag Manager: Google LLC loads our tag container{" "} + GTM-PZL4HXBR, which may deploy Google Analytics and other measurement tags we + configure. See{" "} + + Google's Privacy Policy + + . +
    • +
    • + Google Search Console: Google LLC provides search indexing and + performance reports (queries, impressions, clicks, coverage) for songs2vid.com and related + properties we verify. Search Console is a webmaster tool, not a visitor-facing tracker on + every page. See{" "} + + Google's Privacy Policy + + . +
    • +
    • + Microsoft Clarity: Microsoft Corporation processes usage analytics and + anonymized session recordings and heatmaps (project y4hxg6t7s6). See{" "} + + Microsoft's Privacy Statement + + . +

    These providers process data only as necessary to deliver their services and under @@ -186,8 +267,9 @@ export default function PrivacyPage() {

    We do not sell, share, transfer, or disclose Google user data obtained via Google OAuth / YouTube APIs to third parties, except as needed to operate the Service infrastructure under - our control or when required by law. Google / YouTube themselves process data when we call - their APIs on your behalf to perform actions you initiate. + our control, when required by law, or when you explicitly configure a job webhook that may + include a YouTube video ID you caused to be published. Google / YouTube themselves process + data when we call their APIs on your behalf to perform actions you initiate.

    You can revoke Songs2VID's access to your Google account at any time in{" "} @@ -196,7 +278,7 @@ export default function PrivacyPage() { target="_blank" rel="noopener noreferrer" > - Google Account → Security → Third-party access + Google Account - Security - Third-party access . After revocation (or when tokens can no longer be refreshed), we will stop using those credentials and delete or invalidate stored YouTube OAuth tokens and related connection data @@ -208,18 +290,24 @@ export default function PrivacyPage() {

    • Uploaded source files and generated outputs are retained only as long as needed to complete - your jobs (typically removed after successful processing/upload or when no longer required) + your jobs (typically removed after successful YouTube upload or when no longer required for + retries) +
    • +
    • + Job metadata (status, titles, YouTube IDs, errors, optional webhookUrl) is + kept while your account remains active and may be purged on account deletion, subject to + short-term backups and troubleshooting logs
    • Account data is kept while your account remains active
    • Billing records may be retained as required by law
    • Logs are retained for a limited period for security and troubleshooting
    • - API key hashes are removed when you revoke the key, downgrade from Pro (where applicable), - or delete your account + API key hashes are removed when you revoke the key, leave Developer & Automation / + Enterprise (where applicable), or delete your account

    - You may delete your account from Dashboard → Settings (account deletion + You may delete your account from Dashboard - Settings (account deletion control) or by emailing{" "} {LEGAL_OPERATOR.email}. Deletion removes account and connection data from active systems subject to legal retention obligations @@ -245,7 +333,7 @@ export default function PrivacyPage() {

  • Withdraw consent where processing is consent-based
  • Lodge a complaint with a supervisory authority (in Hungary, the Nemzeti Adatvédelmi és - Információszabadság Hatóság — NAIH) + Információszabadság Hatóság - NAIH)
  • @@ -262,11 +350,43 @@ export default function PrivacyPage() {

    We also use Matomo, a self-hosted analytics tool on{" "} - analytics.atakanozban.com, on our website (including the landing page and - dashboard) and documentation site. Matomo helps us understand how people use Songs2VID so we - can improve functionality, reliability, and content. Typical data includes pages viewed, - approximate location derived from IP, device/browser type, referring site, and interaction - events. We configure Matomo for our domains under *.songs2vid.com. + analytics.atakanozban.com, Google Analytics 4 (measurement + IDs G-9XCHRS7LJR and G-2V3FSMMPQX), and{" "} + Microsoft Clarity (project y4hxg6t7s6) on our website + (including the landing page and dashboard) and documentation site. These tools help us + understand how people use Songs2VID so we can improve functionality, reliability, and + content. Typical data includes pages viewed, approximate location derived from IP, + device/browser type, referring site, interaction events, and (for Clarity) anonymized + session recordings and heatmaps. We configure Matomo for our domains under{" "} + *.songs2vid.com. Google Analytics is provided by Google LLC; see{" "} + + Google's Privacy Policy + + . Microsoft Clarity is provided by Microsoft Corporation; see{" "} + + Microsoft's Privacy Statement + + . +

    +

    + We also use Google Tag Manager (container GTM-PZL4HXBR) to + load and manage measurement tags on our website, including Google Analytics. Tag Manager is + a delivery mechanism; tags it loads may set cookies or collect usage data as described in + this section. +

    +

    + We use Google Search Console to verify site ownership and review search + indexing and performance reports (such as queries, impressions, and clicks) for + songs2vid.com. Search Console is operated by Google LLC and is not a page-level visitor + tracking pixel.

    We collect this analytics data to improve the Service, not to sell personal profiles to @@ -280,17 +400,18 @@ export default function PrivacyPage() {

    11. Security

    We implement appropriate technical and organizational measures to protect your data, - including encryption in transit, encrypted storage of YouTube OAuth tokens at rest, access - controls, and isolated processing environments. No method of transmission or storage is - 100% secure. + including encryption in transit, encrypted storage of YouTube OAuth tokens at rest, hashed + API keys, access controls, and isolated processing environments. No method of transmission + or storage is 100% secure.

    12. International transfers

    If data is transferred outside your country, we ensure appropriate safeguards such as standard contractual clauses or equivalent mechanisms where required by law. Google, Stripe, - and infrastructure providers may process data in other countries as described in their - policies. + Microsoft, and infrastructure providers may process data in other countries as described in + their policies. Webhook destinations you configure may also receive data in other countries + under your control.

    13. Children

    diff --git a/components/GoogleAnalytics.tsx b/components/GoogleAnalytics.tsx new file mode 100644 index 0000000..470ab7f --- /dev/null +++ b/components/GoogleAnalytics.tsx @@ -0,0 +1,28 @@ +import Script from "next/script"; + +/** Primary GA4 property (songs2vid.com). */ +const GA_MEASUREMENT_ID = "G-9XCHRS7LJR"; +/** Additional GA4 property — both must remain configured. */ +const GA_MEASUREMENT_ID_SECONDARY = "G-2V3FSMMPQX"; + +/** + * Google Analytics 4 (gtag.js) for songs2vid.com / songs2yt.com. + * Loaded once from the root layout; both measurement IDs stay active. + */ +export function GoogleAnalytics() { + return ( + <> + + + ); +} diff --git a/components/GoogleTagManager.tsx b/components/GoogleTagManager.tsx new file mode 100644 index 0000000..0710a07 --- /dev/null +++ b/components/GoogleTagManager.tsx @@ -0,0 +1,34 @@ +import Script from "next/script"; + +const GTM_ID = "GTM-PZL4HXBR"; + +/** + * Google Tag Manager container GTM-PZL4HXBR. + * Place in as early as possible (beforeInteractive). + */ +export function GoogleTagManager() { + return ( + + ); +} + +/** GTM noscript iframe — immediately after opening . */ +export function GoogleTagManagerNoscript() { + return ( +