Metaphase Marketing

Attribution, B2B Marketing, Lead Generation, Google Ads, Meta Ads, Offline Conversions

Full-Funnel Attribution for B2B Lead Generation

Cost per lead is a vanity metric. It looks like performance data, but it is not. A $30 CPL means nothing if 2% of those leads close. A $150 CPL means nothing if 40% close at $8,000 average deal size. The number that actually matters , cost per acquisition at revenue value , requires a completely different infrastructure to measure.

Most agencies do not build that infrastructure. They set up a pixel, count form fills, and report CPL. The client approves the campaigns based on CPL, the sales team works leads of inconsistent quality, and neither side ever knows whether the $15,000 monthly ad spend is generating $90,000 in revenue or $25,000.

Full-funnel attribution closes this gap. It connects the original ad click , the keyword someone searched, the Facebook post they saw, the audience segment they belonged to , all the way through to a closed deal, a signed contract, an activated membership, a paid invoice. The algorithm gets fed real revenue data. The client gets real ROI data. The agency gets to report on actual business outcomes instead of proxy metrics.

This is the capstone guide that ties together all the individual pieces , GCLID capture, Enhanced Conversions for Leads, Meta CAPI, call tracking, CRM integrations , into a unified attribution architecture for B2B lead generation. We cover the full data flow, the conversion event mapping, the platform-specific implementation, and the strategic framework Metaphase uses to build and sequence these systems for clients at different stages.

Full-funnel attribution model for B2B lead generation showing five stages from ad click to closed won with proxy values at each stage

Key Takeaways

  • Cost per lead is a proxy metric. Full-funnel attribution measures cost per acquisition at actual revenue value , the number that determines whether ad spend is profitable.

  • Every meaningful conversion event in your funnel (MQL, SQL, Demo, Closed Won) should be assigned a dollar value and fed back to your ad platforms with the original click ID attached.

  • The GCLID has a 90-day attribution window. B2B businesses with longer sales cycles need to import early-stage conversion events (MQL, booked meeting) that fall within the window as leading indicators of downstream revenue.

  • You should upload all CRM conversions to Google Ads , not just those you believe came from Google Ads. CLICK_NOT_FOUND errors are normal and expected; Google ignores what it cannot match and credits what it can.

  • The compounding effect of 6+ months of clean offline data produces a fundamentally different bidding outcome than pixel-only accounts starting from scratch , not incrementally better, but categorically different.

Why CPL Is a Vanity Metric

The lead metric is a measurement artifact, not a business outcome. It measures the moment when someone expressed interest, not the moment when they became a customer. The gap between those two events is where most of the actual qualification work happens , and where the algorithm has no visibility unless you build the infrastructure to provide it.

Here is what optimizing for CPL actually does: it trains your ad platform's algorithm to find people who are willing to fill out a form. That audience has some overlap with "people who will eventually buy," but it is not the same population. For many B2B advertisers, the overlap is poor , form-fill propensity correlates with certain demographic and behavioral patterns that do not consistently predict deal quality.

The algorithm learns what you tell it to learn. If you show it form fills, it gets better at finding form-fillers. If you show it closed deals at their actual revenue value, it gets better at finding buyers. The difference in business outcomes between those two optimization targets is significant and compounds over time.

The Full Attribution Stack

A complete full-funnel attribution system has the following layers:

[Ad Click]
    |
    | GCLID or fbclid appended to URL by ad platform
    v
[Landing Page]
    |
    | JavaScript captures GCLID + fbclid + UTMs in hidden form fields + cookies
    | Meta pixel fires PageView (browser-side)
    v
[Lead Form Submission]
    |
    | Form data + all attribution parameters stored in CRM
    | Meta pixel fires Lead event (browser-side)
    | Meta CAPI fires Lead event (server-side, with hashed user data)
    v
[CRM Pipeline]
    |
    | Lead moves through stages: MQL SQL Demo Proposal Closed
    | Each qualifying stage triggers a conversion upload
    v
[Google Ads]                      [Meta CAPI]
    |                                  |
    | GCLID-based import               | fbclid + hashed email/phone
    | Enhanced Conversions             | event_id for deduplication
    v                                  v
[Smart Bidding learns from real]   [Meta algorithm learns from real]
[revenue-producing clicks]         [revenue-producing audiences]
    |                                  |
    v                                  v
[Lower CPL · Higher ROAS · Better lead quality over time]
[Ad Click]
    |
    | GCLID or fbclid appended to URL by ad platform
    v
[Landing Page]
    |
    | JavaScript captures GCLID + fbclid + UTMs in hidden form fields + cookies
    | Meta pixel fires PageView (browser-side)
    v
[Lead Form Submission]
    |
    | Form data + all attribution parameters stored in CRM
    | Meta pixel fires Lead event (browser-side)
    | Meta CAPI fires Lead event (server-side, with hashed user data)
    v
[CRM Pipeline]
    |
    | Lead moves through stages: MQL SQL Demo Proposal Closed
    | Each qualifying stage triggers a conversion upload
    v
[Google Ads]                      [Meta CAPI]
    |                                  |
    | GCLID-based import               | fbclid + hashed email/phone
    | Enhanced Conversions             | event_id for deduplication
    v                                  v
[Smart Bidding learns from real]   [Meta algorithm learns from real]
[revenue-producing clicks]         [revenue-producing audiences]
    |                                  |
    v                                  v
[Lower CPL · Higher ROAS · Better lead quality over time]
[Ad Click]
    |
    | GCLID or fbclid appended to URL by ad platform
    v
[Landing Page]
    |
    | JavaScript captures GCLID + fbclid + UTMs in hidden form fields + cookies
    | Meta pixel fires PageView (browser-side)
    v
[Lead Form Submission]
    |
    | Form data + all attribution parameters stored in CRM
    | Meta pixel fires Lead event (browser-side)
    | Meta CAPI fires Lead event (server-side, with hashed user data)
    v
[CRM Pipeline]
    |
    | Lead moves through stages: MQL SQL Demo Proposal Closed
    | Each qualifying stage triggers a conversion upload
    v
[Google Ads]                      [Meta CAPI]
    |                                  |
    | GCLID-based import               | fbclid + hashed email/phone
    | Enhanced Conversions             | event_id for deduplication
    v                                  v
[Smart Bidding learns from real]   [Meta algorithm learns from real]
[revenue-producing clicks]         [revenue-producing audiences]
    |                                  |
    v                                  v
[Lower CPL · Higher ROAS · Better lead quality over time]

Every layer of this stack has to work for the system to function. A single break , GCLID not captured, CRM stage change not triggering upload, wrong conversion action name in the import , creates a silent data gap that looks fine in the reporting dashboard but is not reflected in bidding signals.

The three-tier attribution architecture showing Basic pixel-only, Advanced CAPI plus offline conversions, and Full Stack real-time bidding signals

Stage Mapping: Defining the Conversion Events That Matter

Not every pipeline stage should generate a conversion event. Import the stages that represent genuine funnel progress, assign realistic dollar values, and create separate conversion actions in your ad platforms for each.

Here is a framework for B2B lead generation attribution:

Funnel Stage

Trigger

Conversion Action Name

Value Approach

Marketing Qualified Lead

Meets lead scoring threshold or specific action

"Qualified Lead"

Fixed: estimate based on historical close rate × avg deal size

Booked Discovery Call

Calendar invite accepted / CRM stage set

"Booked Meeting"

Fixed: higher than MQL, reflecting further qualification

Sales Qualified Lead / Demo

Demo completed or SQL stage in CRM

"Demo Completed"

Fixed or dynamic from estimated pipeline value

Closed Won

Contract signed, payment received

"Closed Won"

Dynamic: actual deal amount from CRM

The fixed values at early stages should be calculated from historical data: take your average Closed Won deal size, multiply by the historical close rate from that stage forward, and use that as the estimated value. For example: $10,000 average deal, 20% close rate from MQL = $2,000 MQL value. This gives the algorithm a proportionally accurate signal at each stage.

Platform-Specific Implementation Summary

Google Ads: Enhanced Conversions for Leads

Google's current recommended approach for B2B offline conversion tracking is Enhanced Conversions for Leads. The mechanism is GCLID-based: capture the click ID when the lead arrives, store it in your CRM, and import it back to Google via the ConversionUploadService when a qualifying stage is reached. The "enhanced" layer adds hashed email and phone alongside the GCLID, improving match rates for cross-device and direct-traffic journeys.

Key requirements:

  • Auto-tagging enabled in Google Ads account settings

  • GCLID hidden field on all landing page forms, stored on every CRM contact record

  • Separate conversion action per funnel stage

  • partial_failure=True on all API upload requests

  • SHA-256 hashing of email (lowercase, Gmail dot-stripped) and phone (digits only) before uploading

Meta: Conversions API (CAPI)

Meta's standalone Offline Conversions API was permanently shut down May 14, 2025. All offline event tracking now flows through the unified Conversions API. For B2B attribution, CAPI fires on the same CRM stage triggers as Google, but matches conversions using the stored fbclid (the Meta click ID captured when the user originally clicked your Meta ad) plus hashed user data.

Key requirements:

  • fbclid captured at landing and stored in CRM

  • Deduplication via matching event_id between browser pixel and CAPI

  • Hashed email, phone, first name, last name in every CAPI payload

  • action_source set to "system_generated" for CRM-triggered offline events

  • Match quality target: 7+ out of 10 in Meta Events Manager

LinkedIn: Conversions API

For B2B advertisers running LinkedIn campaigns, LinkedIn's Conversions API (launched in 2023) follows the same pattern. Capture the LinkedIn click ID (li_fat_id) at landing, store it in your CRM, and import qualified pipeline events via LinkedIn's API. LinkedIn attribution is particularly valuable for enterprise B2B where job title, company size, and industry targeting matter , the conversion data feeds LinkedIn's Campaign Manager with the same revenue signals you are sending to Google and Meta.

Lead Quality Scoring: Filtering What Gets Sent to Ad Platforms

Not every form submission should generate a conversion event in your ad platforms. Junk leads, duplicate submissions, internal test submissions, and leads from clearly non-qualifying segments (wrong geography, wrong company size, personal email addresses on B2B forms) should be filtered before upload.

A basic lead quality filter before uploading to Google Ads or firing CAPI:

def should_upload_conversion(lead: dict) -> bool:
    """Returns True if this lead meets minimum quality standards for upload."""

    # Filter: internal/test submissions
    if lead.get("email", "").endswith(("@yourcompany.com", "@test.com")):
        return False

    # Filter: incomplete records
    if not lead.get("email") or not lead.get("gclid"):
        return False  # no attribution data to upload

    # Filter: obvious non-qualified signals
    # (implement based on your specific business logic)
    disqualifying_stages = ["Junk", "Duplicate", "Wrong Geography"]
    if lead.get("disqualification_reason") in disqualifying_stages:
        return False

    return True
def should_upload_conversion(lead: dict) -> bool:
    """Returns True if this lead meets minimum quality standards for upload."""

    # Filter: internal/test submissions
    if lead.get("email", "").endswith(("@yourcompany.com", "@test.com")):
        return False

    # Filter: incomplete records
    if not lead.get("email") or not lead.get("gclid"):
        return False  # no attribution data to upload

    # Filter: obvious non-qualified signals
    # (implement based on your specific business logic)
    disqualifying_stages = ["Junk", "Duplicate", "Wrong Geography"]
    if lead.get("disqualification_reason") in disqualifying_stages:
        return False

    return True
def should_upload_conversion(lead: dict) -> bool:
    """Returns True if this lead meets minimum quality standards for upload."""

    # Filter: internal/test submissions
    if lead.get("email", "").endswith(("@yourcompany.com", "@test.com")):
        return False

    # Filter: incomplete records
    if not lead.get("email") or not lead.get("gclid"):
        return False  # no attribution data to upload

    # Filter: obvious non-qualified signals
    # (implement based on your specific business logic)
    disqualifying_stages = ["Junk", "Duplicate", "Wrong Geography"]
    if lead.get("disqualification_reason") in disqualifying_stages:
        return False

    return True

Apply this filter at every stage of the upload pipeline. Do not send conversion events for leads that your sales team has already disqualified , doing so pollutes the algorithm's training data and undermines the quality improvement the entire system is designed to deliver.

Data Flow Options by Scale

The right upload pipeline depends on your lead volume and technical resources:

Manual CSV (Small Volume)

Ideal for fewer than 50 conversions per week. Export qualified leads from your CRM as a CSV with GCLID, conversion name, timestamp, and value. Upload in Google Ads under Tools → Conversions → Upload. Manual, but works cleanly for low-volume situations where automation is not yet worth building.

Native CRM Integrations (Mid-Scale)

HubSpot's native Google Ads integration and Salesforce's Data Manager both provide automated conversion imports triggered by CRM stage changes. Good for accounts with 50–500 conversions per month where you want automation without custom engineering. Limitations: less control over conversion timing, values, and filtering than a custom pipeline.

Webhook Automation via Make.com or Zapier (Mid-Scale)

Create a workflow in Make.com or Zapier that triggers when a CRM deal reaches a qualifying stage. The workflow calls a Google Ads conversion upload or Meta CAPI endpoint with the relevant data. More flexible than native integrations, less infrastructure than a custom API. Works well for teams without in-house engineering resources.

# Example: Make.com webhook endpoint
# Receives a POST when CRM stage changes, uploads to Google and fires CAPI

from flask import Flask, request
app = Flask(__name__)

@app.route('/conversion-webhook', methods=['POST'])
def handle_conversion():
    payload = request.json
    lead = payload.get("lead", {})

    if not should_upload_conversion(lead):
        return {"status": "skipped"}, 200

    gclid = lead.get("gclid")
    fbclid = lead.get("fbclid")
    email = lead.get("email")
    deal_value = float(lead.get("deal_amount", 500))

    if gclid:
        upload_offline_conversion(
            customer_id=GOOGLE_ADS_CUSTOMER_ID,
            conversion_action_id=STAGE_ACTION_MAP.get(lead["stage"]),
            gclid=gclid,
            conversion_value=deal_value,
            conversion_time=lead.get("stage_change_time")
        )

    if fbclid or email:
        fire_meta_capi(
            event_name="Lead",
            event_id=f"crm_{lead['id']}_{lead['stage']}",
            email=email,
            value=deal_value,
            action_source="system_generated"
        )

    return {"status": "uploaded"}, 200
# Example: Make.com webhook endpoint
# Receives a POST when CRM stage changes, uploads to Google and fires CAPI

from flask import Flask, request
app = Flask(__name__)

@app.route('/conversion-webhook', methods=['POST'])
def handle_conversion():
    payload = request.json
    lead = payload.get("lead", {})

    if not should_upload_conversion(lead):
        return {"status": "skipped"}, 200

    gclid = lead.get("gclid")
    fbclid = lead.get("fbclid")
    email = lead.get("email")
    deal_value = float(lead.get("deal_amount", 500))

    if gclid:
        upload_offline_conversion(
            customer_id=GOOGLE_ADS_CUSTOMER_ID,
            conversion_action_id=STAGE_ACTION_MAP.get(lead["stage"]),
            gclid=gclid,
            conversion_value=deal_value,
            conversion_time=lead.get("stage_change_time")
        )

    if fbclid or email:
        fire_meta_capi(
            event_name="Lead",
            event_id=f"crm_{lead['id']}_{lead['stage']}",
            email=email,
            value=deal_value,
            action_source="system_generated"
        )

    return {"status": "uploaded"}, 200
# Example: Make.com webhook endpoint
# Receives a POST when CRM stage changes, uploads to Google and fires CAPI

from flask import Flask, request
app = Flask(__name__)

@app.route('/conversion-webhook', methods=['POST'])
def handle_conversion():
    payload = request.json
    lead = payload.get("lead", {})

    if not should_upload_conversion(lead):
        return {"status": "skipped"}, 200

    gclid = lead.get("gclid")
    fbclid = lead.get("fbclid")
    email = lead.get("email")
    deal_value = float(lead.get("deal_amount", 500))

    if gclid:
        upload_offline_conversion(
            customer_id=GOOGLE_ADS_CUSTOMER_ID,
            conversion_action_id=STAGE_ACTION_MAP.get(lead["stage"]),
            gclid=gclid,
            conversion_value=deal_value,
            conversion_time=lead.get("stage_change_time")
        )

    if fbclid or email:
        fire_meta_capi(
            event_name="Lead",
            event_id=f"crm_{lead['id']}_{lead['stage']}",
            email=email,
            value=deal_value,
            action_source="system_generated"
        )

    return {"status": "uploaded"}, 200

Custom API Pipeline (Enterprise)

For high-volume accounts, enterprise CRMs with complex object models, or businesses requiring real-time uploads across multiple pipeline stages, a custom API pipeline is the right approach. This is a purpose-built service that listens for CRM events, applies quality filters, enriches records with additional data, and uploads to Google and Meta immediately. Most effective for accounts doing 500+ qualified conversions per month.

The 90-Day GCLID Window: Strategies for Long Sales Cycles

Google's GCLID attribution window is 90 days. If a deal clicked from a Google Ad and closes at day 95, the GCLID in your CRM is still there , but Google will not be able to match the conversion import to the original click. The data is too old.

This is a real problem for enterprise B2B, where six-month or longer sales cycles are common. Here are the strategies for working around it:

  • Import earlier-stage conversions: The MQL, booked meeting, or demo completed event almost always happens within 90 days of the click, even in long-cycle deals. Import these as leading-indicator conversion events. Smart Bidding uses them as proxies for downstream revenue, and they still give the algorithm a useful signal even if the final close is outside the window.

  • Enhanced Conversions for Leads: This is specifically designed for the scenario where a GCLID is not available or has expired. By sending hashed email and phone at the time of conversion, Google can attempt to probabilistically match the conversion to an ad click even when the GCLID has expired. Not a perfect solution, but it recovers some attribution that would otherwise be lost.

  • Customer match audiences from closed deals: Upload your Closed Won contact list as a customer match audience. This does not attribute revenue to specific campaigns, but it tells the algorithm what your best customers look like , and it can use that signal to find more people who match that profile going forward.

Duplicate Conversion Pitfalls

Running both browser-side and server-side tracking simultaneously creates deduplication risks. If not handled correctly, the same conversion gets reported twice , once by the pixel and once by CAPI or the API upload , inflating your reported conversion numbers and distorting your algorithm's training data.

Prevention rules:

  • For Meta CAPI: Always pass the same event_id in both the browser pixel call and the CAPI payload. Use the CRM record ID, booking ID, or order ID as the event ID , something that is unique per conversion instance. Meta deduplicates automatically within a 48-hour window when event_id values match.

  • For Google Ads: The offline import system and the browser-side conversion tag (gtag) operate separately. If you are importing conversions via the API after a CRM stage change, make sure you are not also firing a browser-side conversion tag for the same event. Import-only conversions should not have a corresponding browser tag.

  • Cross-platform deduplication: Each platform (Google, Meta, LinkedIn) operates its own attribution independently. The same conversion being reported in all three platforms is expected , they are measuring the same event through their own attribution lenses, not aggregating into a combined number.

Why You Should Upload All CRM Conversions, Not Just Google-Attributed Ones

A common mistake is filtering your Google Ads conversion uploads to include only the contacts that you believe came from Google Ads. The intention is logical: why upload conversions for leads that were not Google-generated?

The answer is that you often cannot tell with certainty which leads came from Google Ads, and filtering incorrectly systematically biases your upload data. The right approach is to upload every qualifying CRM conversion regardless of source. For conversions that do not have a matching Google click, Google returns a CLICK_NOT_FOUND error , but this does not cause any problems. Google silently ignores those records and only credits the ones it can match.

If you filter to "only Google leads" and your filtering is even slightly imperfect, you risk excluding real Google-attributed conversions from your upload, which underrepresents Google's actual contribution to revenue and misguides Smart Bidding.

Reporting: Building a Pipeline Attribution View

Once offline conversion data is flowing, build a pipeline attribution report in your CRM or BI tool that shows:

  • Leads generated by source (Google Ads campaign, Meta campaign, organic, direct)

  • MQL, SQL, and Closed Won conversion rates by source

  • Average deal size and time-to-close by source

  • Cost per acquisition (actual spend / Closed Won count) by source

  • Revenue-to-spend ratio (actual deal value / ad spend) by source

This report is the answer to "is our ad spend working." It is not CPL. It is cost per closed deal at actual revenue value. Everything else is a proxy.

The Compounding Effect: 6+ Months of Clean Data

The reason full-funnel attribution is a competitive moat is not just that it helps you make better decisions today. It is that the data accumulates and the algorithm improves over time in a way that cannot be replicated quickly by a competitor starting from scratch.

Here is what six months of clean offline data produces:

  • Months 1–2: Data starts flowing. Algorithm begins receiving real conversion signals instead of form fills. CPL may temporarily increase as junk traffic is deprioritized. This is a good sign.

  • Month 2–3: CPL drops 15–25% as Smart Bidding recalibrates toward traffic that produces real conversions. Match quality improves. CAPI-fed audiences start outperforming cold audiences.

  • Month 3–6: ROAS improves 20–40%. Target CPA bidding tightens around your actual cost per closed deal. Lookalike audiences built from CAPI-verified buyers start producing lower-CPL campaigns than previous prospecting approaches.

  • 6+ months: The algorithm has enough data to operate at near-maximum efficiency. New campaigns launch with existing buyer signals, reducing the learning phase from four to six weeks to one to two weeks. Competitors starting fresh need six months to reach your current bidding intelligence level , a gap that keeps widening as long as your data continues to flow.

This is the case Metaphase makes to every serious client. The ads are a commodity , any agency can run campaigns. The attribution stack is not. It is the infrastructure underneath the campaigns that determines whether the algorithm improves over time or stays stuck optimizing for form fills forever.

Metaphase's Three-Tier Delivery Framework

Every Metaphase engagement starts with an attribution audit that maps the gap between what your platforms are currently reporting and what is actually happening in your business. Then we close it in a sequenced implementation:

Tier 1 Audit , 1 Business Day

Full pixel health check, attribution gap analysis, GCLID capture assessment, CAPI setup review (if applicable), match quality score review, and a gap report showing estimated conversion loss by category. You will know exactly how large your attribution blind spot is and what it is costing you in bidding efficiency before we write a single line of code.

Tier 2 Implementation , 3–5 Business Days

GCLID capture on all landing page forms, Meta CAPI wiring for Lead and Purchase events, deduplication setup, first offline conversion import to Google Ads, match quality verified at 7+/10, and Enhanced Conversions enabled. This is Metaphase's standard delivery for clients who need a clean foundation quickly.

Tier 3 Full Stack , 2–6 Weeks

Everything in Tier 2 plus real-time webhook pipeline from booking software, POS, and CRM to CAPI. Dynamic conversion values passing actual revenue amounts. Custom conversions for micro-segment optimization. Lookalike audiences built from CAPI-verified buyer data. Cross-platform attribution dashboard showing Meta + Google + LinkedIn unified view. This is where clients who are scaling operate , and where the compounding gains become most dramatic.

Tier

Delivery Time

Key Deliverables

Expected Outcome

Tier 1 Audit

1 business day

Pixel audit, attribution gap report

Clear picture of what is being missed

Tier 2 Implementation

3–5 business days

CAPI wiring, GCLID capture, first offline import

15–35% CPL improvement within 60–90 days

Tier 3 Full Stack

2–6 weeks

Webhook pipeline, dynamic values, attribution dashboard

20–40% ROAS improvement, compounding gains

The Infrastructure Is the Competitive Moat

Every competitor you face in paid search and paid social is running the same ad types to the same audiences. The creative, the targeting, the bid strategy , at scale, these converge. Every competent agency knows how to set up a campaign.

What separates accounts that consistently improve over time from accounts that plateau is the quality of the signal the algorithm is working with. An account with 12 months of clean offline data , real closed deals, actual revenue values, downstream CRM events , is a fundamentally different product than an account optimizing for form fills.

The accounts that build this infrastructure in months one through three spend months four through twelve watching their cost per acquisition drop while competitors' CPLs rise. That widening gap is not random. It is compounding signal quality operating at scale.

Most agencies do not build this because it takes technical depth they do not have and clients do not ask for. The clients who do have it consistently outperform those who do not , regardless of creative quality, budget level, or targeting sophistication. The attribution stack is the advantage that does not go away.

Ready to Connect Your Ad Spend to Actual Revenue?

Metaphase builds the attribution infrastructure that closes the loop between ad click and closed deal. We start every engagement with a gap analysis , showing you exactly what your platforms are missing and what it is costing you in bidding efficiency , before we build anything.

See our Google Ads approach →

See our Meta Ads approach →

See our Salesforce capabilities →

Book a consultation

Available

Metaphase Marketing

Working Hours ( CST )

8am to 8pm

Available

Metaphase Marketing

Working Hours ( CST )

8am to 8pm

👇 Have a question? Ask below 👇

👇 Have a question? Ask below 👇

METAPHASE MARKETING

X Logo
Instagram Logo
Linkedin Logo

Let’s work together

© 2024 Metaphase Marketing. All rights reserved.

METAPHASE MARKETING


X Logo
Instagram Logo
Linkedin Logo

Let’s work together

© 2024 Metaphase Marketing. All rights reserved.

METAPHASE MARKETING

X Logo
Instagram Logo
Linkedin Logo

Let’s work together

© 2024 Metaphase Marketing. All rights reserved.