Opus Clip;</script><script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script><link href="https://cdn.prod.website-files.com/6388604483b03a9ecb34d695/64351a9e4e9223f5e0f46d64_ico-final.png" rel="shortcut icon" type="image/x-icon"/><link href="https://cdn.prod.website-files.com/6388604483b03a9ecb34d695/6435197bfb1d6e486e04c37b_webclip.png" rel="apple-touch-icon"/><!-- Clip & Webflow cookie-based language consistency -->
<script
async
src="https://cdn.prod.website-files.com/6388604483b03a9ecb34d695/693a9e565021b9843e6d530f_Clip%20%26%20Webflow%20cookie-based%20language%20consistency%2012112025.txt"
type="text/javascript"
></script>
<!-- Clip & Webflow message-based language consistency -->
<script
defer
src="https://cdn.prod.website-files.com/6388604483b03a9ecb34d695/693aa26372f9259bd205e8a5_Clip%20%26%20Webflow%20message-based%20language%20consistency%2012112025.txt"
type="text/javascript"
></script>
<!-- Statsig Sidecar ~ 10/28/24 -->
<script src="https://cdn.jsdelivr.net/npm/statsig-sidecar/dist/index.min.js?apikey=client-ECxX0UGYv9w3jWKTO7e2doE79AWuSCSygX0RzesRzEs"></script>
<!-- End of Statsig Sidecar -->
<!-- don't index Spanish pages or URLs with ? -->
<script>
'use strict'
;(function () {
const url = window.location.href
//const isSpanishPage = url.includes('es-es')
const hasQueryParam = url.includes('?')
const hasHashInUrl = url.includes('#')
if (hasQueryParam || hasHashInUrl) {
const noIndexMetaTag = document.createElement('meta')
noIndexMetaTag.name = 'robots'
noIndexMetaTag.content = 'noindex'
document.head.appendChild(noIndexMetaTag)
}
//console.log('isSpanishPage is' + ' ' + isSpanishPage)
console.log('hasQueryParam is' + ' ' + hasQueryParam)
console.log('hasHashInUrl is' + ' ' + hasHashInUrl)
})()
</script>
<script>
/* "use strict";
(function () {
const isSpanishPage = window.location.href.includes('es-es');
if (isSpanishPage) {
const noIndexMetaTag = document.createElement('meta');
noIndexMetaTag.name = 'robots';
noIndexMetaTag.content = 'noindex';
document.head.appendChild(noIndexMetaTag);
}
})();
*/
</script>
<!-- preconnect to required origins -->
<link rel="preconnect" href="https://uploads-ssl.webflow.com" />
<link rel="dns-prefetch" href="https://uploads-ssl.webflow.com" />
<link rel="preconnect" href="https://assets-global.website-files.com" />
<link rel="dns-prefetch" href="https://assets-global.website-files.com" />
<!-- Geofencing by Jay -->
<script type="application/javascript">
function fetchApiBlockAdvicePromise() {
return fetch('https://api.opus.pro/api/client-access-control?q=ipRisk')
.then((resp) => resp.json())
.then((json) => {
// set opusIPInfo (oIP)
window._oIP ||= json.data.detail
window.dispatchEvent(new CustomEvent('ipInfoLoaded', json.data.detail))
return json.data.shouldBlock && json.data.blockReason == 'country'
})
}
const getCtas = () => document.querySelectorAll('.a_header_form-block,.a_nav_form-block')
function onBlockAdvice(shouldBlockByIp) {
const allowedUaRegex =
/Googlebot|Bingbot|Slurp|DuckDuckBot|facebot|facebookexternalhit|Applebot|LinkedInBot|Twitterbot/i
const exemptPaths = [
'/terms-of-service',
'/privacy-policy',
'/not-available',
'/supported-countries',
'/pricing-early',
'/pricing',
'/no-capacity',
]
const countryAllowed = !shouldBlockByIp
const pageAllowed = exemptPaths.includes(location.pathname)
const uaAllowed = allowedUaRegex.test(navigator.userAgent)
if (countryAllowed || pageAllowed || uaAllowed) return
getCtas().forEach((it) => (it.style.visibility = 'hidden'))
window.location.replace('/not-available')
}
fetchApiBlockAdvicePromise().then(onBlockAdvice)
const fallbackBlockList = ['CN', 'TW', 'HK']
function countryip(data) {
onBlockAdvice(fallbackBlockList.includes(data.country))
}
</script>
<!-- DO NOT remove JSONP script below -->
<script src="//get.geojs.io/v1/ip/country.js" async></script>
<!-- End of Geofencing -->
<!-- Google Tag Manager | Installed by Lirian&Parker on 2.23.24 -->
<script>
function gtag() {
dataLayer.push(arguments)
}
;(function (w, d, s, l, i) {
w[l] = w[l] || []
w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' })
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != 'dataLayer' ? '&l=' + l : ''
j.async = true
j.src = 'https://a.opus.pro/gtm/init.js?id=' + i + dl
f.parentNode.insertBefore(j, f)
})(window, document, 'script', 'dataLayer', 'GTM-5B6S625')
</script>
<!-- End of Google Tag Manager -->
<!-- NCF Filter+Search Plugin | Installed by Parker on 12.22.22 -->
<script
src="https://code.jquery.com/jquery-3.6.0.min.js"
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous"
></script>
<script async src="https://cdn.nocodeflow.net/tools/nocode.js"></script>
<script async src="https://cdn.nocodeflow.net/tools/filter.js"></script>
<!-- End of NCF Filter+Search Plugin -->
<style>
/** customized style */
.rich-text.overwrite-font p {
font-family: Gilroy;
}
body {
overflow-wrap: break-word;
}
.force-hide {
display: none !important;
}
</style>
<style>
/* Studio navbar white styles */
.a_studio-navbar_component.white {
background-color: white;
}
/* Links and dropdown toggle */
.a_studio-navbar_component.white .a_studio-navbar_nav-link,
.a_studio-navbar_component.white .a_studio-navbar_dropdown-toggle {
color: #24235e;
}
.a_studio-navbar_component.white .a_studio-navbar_nav-link:hover,
.a_studio-navbar_component.white .a_studio-navbar_dropdown-toggle.w--open {
color: #6723ff;
}
/* Logo */
.a_studio-navbar_component.white .a_studio-navbar_logo-white {
opacity: 0;
}
.a_studio-navbar_component.white .a_studio-navbar_logo-color {
opacity: 1;
}
/* Button */
.a_studio-navbar_component.white .a_button.is-studio-nav {
background-color: #6723ff;
}
.a_studio-navbar_component.white .a_button.is-studio-nav:hover {
background-color: #3600ae;
color: white;
}
/* Burger */
.a_studio-navbar_component.white .a_studio-navbar_menu-btn-line {
background-color: #24235e;
}
/* Mobile menu */
@media (max-width: 991px) {
.a_studio-navbar_component.white .a_studio-navbar_menu.w-nav-menu {
background-color: white;
}
}
/* Add text highlighter */
::-moz-selection {
/* Code for Firefox */
color: white;
background: #27272a;
}
::selection {
color: white;
background: #27272a;
}
</style>
<!-- install mixpanel script -->
<script type="text/javascript" async>
;(function (f, b) {
if (!b.__SV) {
var e, g, i, h
window.mixpanel = b
b._i = []
b.init = function (e, f, c) {
function g(a, d) {
var b = d.split('.')
2 == b.length && ((a = a[b[0]]), (d = b[1]))
a[d] = function () {
a.push([d].concat(Array.prototype.slice.call(arguments, 0)))
}
}
var a = b
'undefined' !== typeof c ? (a = b[c] = []) : (c = 'mixpanel')
a.people = a.people || []
a.toString = function (a) {
var d = 'mixpanel'
'mixpanel' !== c && (d += '.' + c)
a || (d += ' (stub)')
return d
}
a.people.toString = function () {
return a.toString(1) + '.people (stub)'
}
i =
'disable time_event track track_pageview track_links track_forms track_with_groups add_group set_group remove_group register register_once alias unregister identify name_tag set_config reset opt_in_tracking opt_out_tracking has_opted_in_tracking has_opted_out_tracking clear_opt_in_out_tracking start_batch_senders people.set people.set_once people.unset people.increment people.append people.union people.track_charge people.clear_charges people.delete_user people.remove'.split(
' ',
)
for (h = 0; h < i.length; h++) g(a, i[h])
var j = 'set set_once union unset remove delete'.split(' ')
a.get_group = function () {
function b(c) {
d[c] = function () {
call2_args = arguments
call2 = [c].concat(Array.prototype.slice.call(call2_args, 0))
a.push([e, call2])
}
}
for (
var d = {}, e = ['get_group'].concat(Array.prototype.slice.call(arguments, 0)), c = 0;
c < j.length;
c++
)
b(j[c])
return d
}
b._i.push([e, f, c])
}
b.__SV = 1.2
e = f.createElement('script')
e.type = 'text/javascript'
e.async = !0
e.src =
'undefined' !== typeof MIXPANEL_CUSTOM_LIB_URL
? MIXPANEL_CUSTOM_LIB_URL
: 'file:' === f.location.protocol &&
'//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js'.match(/^\/\//)
? 'https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js'
: '//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js'
g = f.getElementsByTagName('script')[0]
g.parentNode.insertBefore(e, g)
}
})(document, window.mixpanel || [])
// Register browser language after Mixpanel loads
document.addEventListener('DOMContentLoaded', () => {
/**
* navigator.languages and navigator.language are not supported in all browsers.
*
* Returns the value of Accept-Languages (HTTP header) as a nsTArray of
* languages. The value is set in the preference by the user ("Content
* Languages").
*
* "en", "en-US" and "i-cherokee" and "" are valid languages tokens.
*
* If there is no valid language, the value of getWebExposedLocales is
* used to ensure that locale spoofing is honored and to reduce
* fingerprinting.
*
* See RFC 7231, Section 9.7 "Browser Fingerprinting" and
* RFC 2616, Section 15.1.4 "Privacy Issues Connected to Accept Headers"
* for more detail.
*/
const browserLanguage =
document.documentElement.lang ||
(navigator.languages?.[0] || navigator.language || 'en').split('-')[0]
mixpanel.register({ browserLanguage })
})
</script>
<!-- Start Func to render iFrame -->
<script>
const CLIP_APP_URL = 'https://clip.opus.pro'
const DEFAULT_LANG = 'en'
let random = undefined
function throttleTrack(ratio, cb) {
if (!random) {
random = Math.random()
}
if (random < ratio) {
cb && cb()
}
}
function normalizeLangCode(langCode) {
if (!langCode) return DEFAULT_LANG
const parts = langCode.split('-')
if (parts.length === 2) {
return `${parts[0].toLowerCase()}-${parts[1].toUpperCase()}`
}
return langCode.toLowerCase()
}
function getCurrentLang() {
const [, lang] = window.location.pathname.match(/\/([a-z]{2}-[a-z]{2})(\/|$)/) || []
const detectedLang = lang || DEFAULT_LANG
return normalizeLangCode(detectedLang)
}
function renderEmbedIframe(mergedParams) {
const updatedUrl = new URL(window.location.href)
for (const [key, value] of Object.entries(mergedParams)) {
updatedUrl.searchParams.set(key, value)
}
console.log('pathname', updatedUrl.pathname)
let iframe = document.createElement('iframe')
const iframeUrl = new URL('/lp-embed', CLIP_APP_URL)
// Current Page UTM Parameters
updatedUrl.searchParams.forEach((value, key) => {
iframeUrl.searchParams.set(key, value)
})
// lang
iframeUrl.searchParams.set('lang', getCurrentLang())
// documentReferrer
if (document.referrer) {
iframeUrl.searchParams.set('documentReferrer', encodeURIComponent(document.referrer))
}
iframe.src = iframeUrl.toString()
iframe.style.display = 'none'
iframe.style.visibility = 'hidden'
document.body.appendChild(iframe)
console.log('iframe rendered', iframe.src)
throttleTrack(0.1, () => {
const url = new URL(window.location.href)
const searchParams = url.searchParams
const paramsObject = {}
searchParams.forEach((value, key) => {
paramsObject[key] = value
})
mixpanel.track('webflow-embed-iframe', {
type: 'init',
webflowHref: window.location.href,
...paramsObject,
})
})
}
</script>
<!-- End Fuc to render iFrame -->
<!-- Start Populate mixpanel event when we click calculate price button -->
<script async>
document.addEventListener('DOMContentLoaded', (event) => {
// Select the calculate button by anchor element using the data attribute
const calculateButton = document.querySelector('a[data-element="calculate-button"]')
// Add an event listener to the anchor element for the 'click' event
calculateButton.addEventListener('click', (event) => {
// Extract URL parameters and convert them to an object
const url = new URL(window.location.href)
const searchParams = url.searchParams
const paramsObject = {}
searchParams.forEach((value, key) => {
paramsObject[key] = value
})
// Track the event with Mixpanel
mixpanel.track('price-calculate', {
webflowHref: window.location.href,
...paramsObject,
})
})
})
</script>
<!-- End Populate mixpanel event when we click calculate price button -->
<!-- Start of Keep URL parameters in users session -->
<script>
'use strict'
const SUPPORTED_DOMAINS = ['opusclip-staging.webflow.io', 'www.opus.pro', 'clip.opus.pro']
const isSessionStorageSupported = () => {
try {
return !!window.sessionStorage
} catch (error) {
return false
}
}
const getUrlParameters = () => {
const params = {}
const queryString = window.location.search.substring(1)
const pairs = queryString.split('&')
for (const pair of pairs) {
const [key, value] = pair.split('=')
if (key && value) {
params[key] = decodeURIComponent(value)
}
}
return params
}
const storeParameters = (params) => {
if (isSessionStorageSupported()) {
delete params['tag']
sessionStorage.setItem('storedUrlParams', JSON.stringify(params))
}
}
const retrieveParameters = () => {
if (isSessionStorageSupported()) {
const storedUrlParams = sessionStorage.getItem('storedUrlParams')
return storedUrlParams ? JSON.parse(storedUrlParams) : {}
}
return {}
}
const processLocationParams = (mergedParams) => {
storeParameters(mergedParams)
const updatedUrl = new URL(window.location.href)
for (const [key, value] of Object.entries(mergedParams)) {
updatedUrl.searchParams.set(key, value)
}
window.history.replaceState({}, '', updatedUrl)
}
const processHrefParams = (mergedParams) => {
const currentDomain = window.location.hostname
const domainRegex = new RegExp(SUPPORTED_DOMAINS.join('|'), 'i')
const matchingElements = []
document.querySelectorAll('[href]').forEach((element) => {
const href = element.getAttribute('href')
if (href) {
const absoluteHref = href.startsWith('/')
? `${window.location.protocol}//${currentDomain}${href}`
: href
if (domainRegex.test(absoluteHref)) {
matchingElements.push({ element, href: absoluteHref })
}
}
})
// print all matching elements where href is "https://clip.opus.pro/dashboard"
console.log(
'Matching elements',
matchingElements.filter(({ href }) => href === 'https://clip.opus.pro/dashboard'),
)
for (const { element, href } of matchingElements) {
const url = new URL(href, window.location.href)
for (const [key, value] of Object.entries(mergedParams)) {
url.searchParams.set(key, value)
}
element.setAttribute('href', url.href)
}
}
const currentParams = getUrlParameters()
const storedParams = retrieveParameters()
const mergedParams = { ...storedParams, ...currentParams }
// process location url
// processLocationParams(mergedParams)
$(function () {
renderEmbedIframe(mergedParams)
processHrefParams(mergedParams)
})
</script>
<!-- End of Keep URL parameters in users session -->
<!-- Start PostCrossDomainMessage login status -->
<script>
function toggleDashBoardButton(isLogin) {
if (isLogin) {
$('#sign-in').addClass('force-hide')
$('#sign-in-mobile').addClass('force-hide')
$('#start-free-trial').addClass('force-hide')
$('#my-dashboard').removeClass('force-hide')
$('#my-dashboard-mobile').removeClass('force-hide')
sessionStorage.setItem('logged_in', 'yes')
} else {
$('#sign-in').removeClass('force-hide')
$('#sign-in-mobile').removeClass('force-hide')
$('#start-free-trial').removeClass('force-hide')
$('#my-dashboard').addClass('force-hide')
$('#my-dashboard-mobile').addClass('force-hide')
sessionStorage.removeItem('logged_in')
}
}
if (sessionStorage.getItem('logged_in') === 'yes') {
toggleDashBoardButton(true)
}
window.addEventListener('message', function (event) {
if (event.origin === CLIP_APP_URL) {
if (event.data) {
if (event.data.type === 'embed-success') {
throttleTrack(0.1, () => {
mixpanel.track('webflow-embed-iframe', {
type: 'success',
webflowHref: window.location.href,
...event.data.content,
})
})
}
}
if (event.data && event.data === 'CLIP_LOGGED_IN') {
toggleDashBoardButton(true)
}
if (event.data && event.data === 'CLIP_LOGGED_OUT') {
toggleDashBoardButton(false)
}
}
})
</script>
<!-- End PostCrossDomainMessage login status -->
<!-- [Attributes by Finsweet] Accessibility -->
<script defer src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-a11y@1/a11y.js"></script>
<!-- Init GIS -->
<script async defer src="https://accounts.google.com/gsi/client"></script>
<script>
const GSI_MAX_TRIES = 120;
const GSI_DELAY_MS = 80;
let gsiInited = false;
function gsiBuildRedirectUrl(idToken) {
const sp = new URLSearchParams(window.location.search);
const existingState = sp.get('state');
if (existingState) {
return `${CLIP_APP_URL}/auth/callback?id_token=${encodeURIComponent(idToken)}&state=${existingState}`;
}
const backTo = sp.get('back_to') || `${CLIP_APP_URL}/dashboard`;
const returnTo = `${CLIP_APP_URL}/auth/callback?back_to=${encodeURIComponent(backTo)}`;
const stateObj = { returnTo, provider: 'GoogleOAuth' };
const stateEnc = encodeURIComponent(JSON.stringify(stateObj));
return `${CLIP_APP_URL}/auth/callback?id_token=${encodeURIComponent(idToken)}&state=${stateEnc}`;
}
function gsiHandleIdToken(resp) {
const idToken = resp?.credential;
mixpanel.track('google-onetap-click', {
hasIdToken: Boolean(idToken),
})
if (!idToken) return;
const url = gsiBuildRedirectUrl(idToken);
window.location.assign(url);
}
function gsiInit(clientId) {
if (window.location.pathname !== '/') return;
if (gsiInited || !window.google?.accounts?.id) return;
google.accounts.id.initialize({
client_id: clientId,
callback: gsiHandleIdToken,
use_fedcm_for_prompt: true,
context: 'signin',
});
gsiInited = true;
}
function gsiPrompt() {
if (!gsiInited) return;
google.accounts.id.prompt((n) => {
console.log('notDisplayed:', n.getNotDisplayedReason?.());
console.log('skipped:', n.getSkippedReason?.());
console.log('dismissed:', n.getDismissedReason?.());
mixpanel.track('google-onetap-prompt', {
notDisplayed: n.getNotDisplayedReason?.(),
skipped: n.getSkippedReason?.(),
dismissed: n.getDismissedReason?.()
})
});
}
function gsiWhenReady(cb) {
let tries = 0;
const t = setInterval(() => {
if (window.google?.accounts?.id) {
clearInterval(t);
cb();
return;
}
tries += 1;
if (tries >= GSI_MAX_TRIES) {
clearInterval(t);
console.error(`[GSI] Not available after ${tries} tries (~${Math.round((tries * GSI_DELAY_MS)/100)/10}s).`);
}
}, GSI_DELAY_MS);
}
window.addEventListener('message', (event) => {
const data = event?.data;
if (!data || typeof data !== 'object') return;
// Initialize only; do not auto-prompt
if (data.type === 'gsi_init' && data.content?.clientId) {
const { clientId } = data.content;
gsiWhenReady(() => {
gsiInit(clientId);
});
}
// If you want to show the One Tap later, send a separate gsi_login
if (data.type === 'gsi_login') {
if (gsiInited) {
gsiPrompt();
} else if (data.content?.clientId) {
const { clientId } = data.content;
gsiWhenReady(() => {
gsiInit(clientId);
gsiPrompt();
});
}
}
});
</script>
<!-- Bing Webmaster Tools verification tag -->
<meta name="msvalidate.01" content="5F9BFB02371FD8AE86D18D398F88387F" />
<link href="https://www.opus.pro" rel="canonical">
<meta content="https://cdn.prod.website-files.com/6388604483b03a9ecb34d695/6893fad68d6058a917d7f3c6_mainpage_thumbnail.jpg)
Extension RoundMar 2025
Extension Round — Opus Clip
Overview
Sign up to unlock funding details
Create a free account — 25 credits a month to unlock amounts, dates, and investors.
Create a free account — 25 credits a month to unlock amounts, dates, and investors.