Secure by design.
From tap to payout.

Payments with JIM run on NFC – the same secure tech behind Apple Pay, digital wallets and contactless cards.

When a customer taps their card or phone on your iPhone, the sale is processed instantly* and encrypted on the spot.

No terminals. No data stored. Just a secure tap and you're paid.

Get Started

JIM processes payments.
Not personal data.

Data protection comes standard with JIM.

Card numbers, CVCs, PINs – JIM doesn’t store any of it.

Every sale is encrypted end to end and processed in real time, so your customer’s data never sticks around.

No storage. No exposure. Just fast, simple and secure transactions.

Get Started

Real-time fraud prevention behind every sale.

Fraud never gets a chance with JIM.

JIM monitors every transaction in real time, blocking shady activity before it gets near your money.

There’s nothing to set up and nothing to manage – fraud protection kicks in the moment you start selling.

You stay focused on sales. JIM takes care of the rest.

Get Started

Certified to keep you safe:
JIM’s backed by the networks you already trust

Visa. Mastercard. Amex. Discover. Apple. They trust JIM. So can you.

JIM is certified by the major card networks and approved by Apple for Tap to Pay on iPhone.


We meet the highest global standards for payment security, including PCI DSS compliance.

Behind every tap, your money moves through systems trusted by banks and built to protect your data.

Get Started

Transparency and control of every sale you make

Every sale is tracked in real time, your balance updates instantly* and your money’s ready to spend the second* you earn it.

Cancel charges, send receipts and check your full sales history – all from your phone.

And when you're ready to level up, JIM’s AI brings business insights and smart ideas to help you sell more.

You’re not just getting paid – you’re running your business with full control.

Get Started

The reviews are wild.
The results? Even better.

Works Really Well

Thought the app is seamless and really helps as a merchant being able to accept card. Was easy to sign up and start accepting payments ASAP.

CheeseHead2010

Seamless Functionality

" The app is amazing. Collecting credit card payments on your own device has never been easier. "

JohnW97

Really fast and easy to use

"This is a great app and really simple to use. I make a sale, and the money is available immediately to spend via the JIM card built into the app. If I need to check historical sales or send receipts, I can do that really easily by asking the AI chat assistant to produce that for me."

TeveTorbes1
// =========================================== // FOOTER SCRIPTS - jim.com // =========================================== // =========================================== // 1. SEARCH PARAMS COOKIE SAVER // =========================================== const saveQueryParams = () => { const setCookie = (name, value) => { const datePlus = (qtd, type, date) => { if (!type) type = "d"; if (!date) date = new Date(); const increase = { d: 0, m: 0, y: 0 }; increase[type] = qtd; return new Date( date.getFullYear() + increase.y, date.getMonth() + increase.m, date.getDate() + increase.d ); }; document.cookie = `${name}=${value}; expires=${datePlus(30)}; path=/; domain=.jim.com; secure`; }; const params = {}; const searchParams = new URLSearchParams(window.location.search); searchParams.forEach((value, key) => { if (value) { params[key] = value; } }); setCookie("search_params", JSON.stringify(params)); }; window.addEventListener("load", saveQueryParams()); // =========================================== // 2. RUDDERSTACK ANALYTICS (FIXED) // =========================================== (function () { const CLICK_ID_COOKIE_NAMES = ["_fbp", "_ttp"]; const getCookie = (name) => { const needle = name + "="; const hit = document.cookie.split("; ").find((c) => c.startsWith(needle)); return hit ? hit.slice(needle.length) : undefined; }; const getAllCookiesAsObject = () => { const obj = {}; if (!document.cookie) return obj; document.cookie.split("; ").forEach((pair) => { const idx = pair.indexOf("="); const key = idx >= 0 ? pair.slice(0, idx) : pair; const val = idx >= 0 ? pair.slice(idx + 1) : ""; obj[key] = val; }); return obj; }; // NEW: Extract UTMs from search_params cookie const getUtmsFromCookie = () => { const searchParamsCookie = getCookie("search_params"); if (!searchParamsCookie) return {}; try { const parsed = JSON.parse(decodeURIComponent(searchParamsCookie)); return parsed || {}; } catch (e) { console.error('Error parsing search_params cookie', e); return {}; } }; const browserIds = CLICK_ID_COOKIE_NAMES .map((k) => getCookie(k)) .filter(Boolean); const cookiesObj = getAllCookiesAsObject(); const utmParams = getUtmsFromCookie(); var e = (window.rudderanalytics = window.rudderanalytics || []); e.methods = [ "load", "page", "track", "identify", "alias", "group", "ready", "reset", "getAnonymousId", "setAnonymousId", "getUserId", "getUserTraits", "getGroupId", "getGroupTraits", "startSession", "endSession", ]; e.factory = function (t) { return function () { e.push([t].concat([].slice.call(arguments))); }; }; for (var i = 0; i < e.methods.length; i++) { e[e.methods[i]] = e.factory(e.methods[i]); } e.loadJS = function () { var s = document.createElement("script"); s.type = "text/javascript"; s.async = true; s.src = "https://cdn.rudderlabs.com/v1.1/rudder-analytics.min.js"; var x = document.getElementsByTagName("script")[0]; x.parentNode.insertBefore(s, x); }; e.loadJS(); e.load("2p4R4M1dTCH2cp4vzLXhSYpEikO", "https://jimussagosqd.dataplane.rudderstack.com"); // FIXED: Pass UTMs from cookie to context.campaign e.page({ browser_id: browserIds, cookies: cookiesObj, }, { campaign: { source: utmParams.utm_source || undefined, medium: utmParams.utm_medium || undefined, name: utmParams.utm_campaign || undefined, term: utmParams.utm_term || undefined, content: utmParams.utm_content || undefined, gclid: utmParams.gclid || undefined, fbclid: utmParams.fbclid || undefined, msclkid: utmParams.msclkid || undefined, } }); })(); // =========================================== // 3. RUDDERSTACK BUTTON CLICK EVENTS // =========================================== document.addEventListener('DOMContentLoaded', function() { const buttons = document.querySelectorAll('.button-glow_purple-label'); buttons.forEach(function(button) { button.addEventListener('click', function(event) { let linkUrl = null; const parentLink = event.target.closest('a'); if (parentLink && parentLink.href) { linkUrl = parentLink.href; } rudderanalytics.track('Button Click', { button_text: event.target.textContent || event.target.innerText, page_url: window.location.href, button_link: linkUrl, deeplink_name: parentLink ? parentLink.getAttribute('data-deeplink-name') : null }); }); }); }); // =========================================== // 4. ONELINK SMART SCRIPT (APPSFLYER) // =========================================== window.onload = function () { if (window.AF_SMART_SCRIPT && typeof window.AF_SMART_SCRIPT.generateOneLinkURL === "function") { var oneLinkURL = "https://jim.onelink.me/gx4L"; var webReferrer = "af_channel"; var mediaSource = { keys: ["utm_source"], defaultValue: "organic_source" }; var campaign = { keys: ["utm_name", "utm_campaign"] }; var googleClickIdKey = "af_sub1"; var afSub2 = { keys: ["fbclid"] }; var ad = { keys: ["utm_content"] }; var adSet = { keys: ["utm_term"] }; var afSub3 = { keys: ["ttclid", "click_id"] }; var afSub4 = { keys: [], defaultValue: rudderanalytics.getAnonymousId() }; var urlSemParams = (function () { try { var u = new URL(window.location.href); return u.origin + u.pathname; } catch (e) { return window.location.href.split('#')[0].split('?')[0]; } })(); var afSub5 = { keys: [], defaultValue: urlSemParams }; var custom_ss_ui = { paramKey: "af_ss_ui", defaultValue: "true" }; var result = window.AF_SMART_SCRIPT.generateOneLinkURL({ oneLinkURL: oneLinkURL, webReferrer: webReferrer, afParameters: { mediaSource: mediaSource, campaign: campaign, googleClickIdKey: googleClickIdKey, afSub2: afSub2, ad: ad, adSet: adSet, afSub3: afSub3, afSub4: afSub4, afSub5: afSub5, afCustom: [custom_ss_ui] } }); if (result) { var result_url = result.clickURL; var appStoreElements = document.querySelectorAll('[data-deeplink-name="appstore"]'); appStoreElements.forEach(function (element) { element.setAttribute('href', result_url); }); var androidLink = document.getElementById('andrd_link'); if (androidLink) { androidLink.setAttribute('href', result_url); } var iosLink = document.getElementById('ios_link'); if (iosLink) { iosLink.setAttribute('href', result_url); } } } else { console.error("AF_SMART_SCRIPT or generateOneLinkURL is not available."); } }; // =========================================== // 5. AMPLITUDE EXPERIMENTS // =========================================== console.log('[EXPERIMENT] Initializing experiment client'); window.experiment = Experiment.Experiment.initialize( 'client-H3xg7BCWy1pHmAnnSGoMnIQNFBQNBCCX', { exposureTrackingProvider: { track: (exposure) => { rudderanalytics.track('$exposure', exposure); console.log('[EXPERIMENT] Tracking exposure:', exposure); } } } ); const handleRedirectUrl = (url) => { console.log('[EXPERIMENT] Redirecting to:', url); window.location.href = url; }; const handleExperiments = async () => { console.log('[EXPERIMENT] Starting experiment handler'); if (!/\/tap-2(?:\/|$)/.test(location.pathname)) { console.log('[EXPERIMENT] Not tap-2, skipping redirect'); return; } await new Promise(resolve => { if (window.rudderanalytics.ready) { resolve(); } else { window.rudderanalytics.ready(resolve); } }); const userId = await rudderanalytics.getUserId(); const anonId = await rudderanalytics.getAnonymousId(); const user = { user_id: userId || "", device_id: anonId || "", user_properties: { origin: location.origin, href: location.href, pathname: location.pathname } }; await window.experiment.start(user); const variant = window.experiment.variant('jim-web-tap-2'); console.log('[EXPERIMENT] Variant received:', variant); if (variant?.value === 'treatment' && variant.payload?.url) { const targetUrl = new URL(variant.payload.url, location.origin).href; if (location.href !== targetUrl) { handleRedirectUrl(targetUrl); } else { console.log('[EXPERIMENT] Already on target URL, no redirect'); } } else { console.log('[EXPERIMENT] No treatment variant detected'); } }; window.addEventListener("load", () => { handleExperiments().catch(err => console.error('[EXPERIMENT] Error:', err)); }); // =========================================== // 6. APOLLO.IO // =========================================== function initApollo() { var n = Math.random().toString(36).substring(7), o = document.createElement("script"); o.src = "https://assets.apollo.io/micro/website-tracker/tracker.iife.js?nocache=" + n; o.async = true; o.defer = true; o.onload = function () { window.trackingFunctions.onLoad({ appId: "68125dac921d000019c418d9" }); }; document.head.appendChild(o); } initApollo(); // =========================================== // 7. ACTIVE CAMPAIGN // =========================================== (function(e,t,o,n,p,r,i) { e.visitorGlobalObjectAlias = n; e[e.visitorGlobalObjectAlias] = e[e.visitorGlobalObjectAlias] || function() { (e[e.visitorGlobalObjectAlias].q = e[e.visitorGlobalObjectAlias].q || []).push(arguments); }; e[e.visitorGlobalObjectAlias].l = (new Date).getTime(); r = t.createElement("script"); r.src = o; r.async = true; i = t.getElementsByTagName("script")[0]; i.parentNode.insertBefore(r, i); })(window, document, "https://diffuser-cdn.app-us1.com/diffuser/diffuser.js", "vgo"); vgo('setAccount', '92329594'); vgo('setTrackByDefault', true); vgo('process'); // =========================================== // 8. BUTTON GLOW ANIMATION // =========================================== document.addEventListener('DOMContentLoaded', () => { const buttons = document.querySelectorAll('.button-glow_purple'); const lerp = (start, end, factor) => start * (1 - factor) + end * factor; buttons.forEach(button => { let currentX = 50; let currentY = 50; let rafId = null; const updatePosition = () => { button.style.setProperty('--x', `${currentX}%`); button.style.setProperty('--y', `${currentY}%`); rafId = null; }; button.addEventListener('mousemove', (e) => { const rect = e.target.getBoundingClientRect(); const targetX = ((e.clientX - rect.left) / rect.width) * 100; const targetY = ((e.clientY - rect.top) / rect.height) * 100; currentX = lerp(currentX, targetX, 0.3); currentY = lerp(currentY, targetY, 0.3); if (!rafId) { rafId = requestAnimationFrame(updatePosition); } }); button.addEventListener('mouseleave', (e) => { currentX = 50; currentY = 50; if (!rafId) { rafId = requestAnimationFrame(updatePosition); } }); }); });