Glossary/Metrics and growth
K-factor
Definition
K-factor is the average number of new users each existing user generates through invitations, calculated as invitations sent per user multiplied by the conversion rate of those invitations.
The term is borrowed from epidemiology, where it describes how many people each infected person infects. Above 1.0, growth compounds without acquisition spend; below 1.0, referrals amplify other channels but cannot sustain growth alone. Almost every app is below 1.0, and a K of 0.4 is genuinely valuable — the useful framing is amplification, not self-sustaining virality.
The formula, and what each half costs to move
K equals invitations sent per user multiplied by the conversion rate per invitation. Both factors are usually small, and their product is smaller still — which is why the arithmetic is worth doing before a referral programme is scoped.
| Invites per user | Conversion rate | K-factor | Amplification (1 / (1 − K)) |
|---|---|---|---|
| 2 | 5% | 0.10 | 1.11× |
| 4 | 10% | 0.40 | 1.67× |
| 6 | 15% | 0.90 | 10.0× |
| 8 | 12.5% | 1.00 | Unbounded in theory |
| 10 | 15% | 1.50 | Explosive, and unsustainable |
The amplification column is the number that matters for planning. At K = 0.4, every 1,000 paid installs eventually produce roughly 1,667 total users, which means your true cost per user is 60% of your nominal CPI — a direct input into effective CPI. The jump between K = 0.4 and K = 0.9 is enormous, which is why marginal improvements matter far more as you approach 1.
K above 1 is not a steady state
Sustained K above 1 implies unbounded growth, which no product achieves for long because the addressable pool saturates and the earliest adopters are always the most enthusiastic inviters. Products that briefly exceed 1 fall back as they penetrate their market. Treat a measured K above 1 as a signal to check the measurement window before celebrating.
Cycle time is the other half of the story
K tells you how much amplification you eventually get; viral cycle time tells you how fast. Two products with identical K grow at wildly different rates if one completes an invite loop in a day and the other in a month, and cycle time is usually the cheaper of the two to improve.
| Cycle time | Cycles in 30 days | Total users | Notes |
|---|---|---|---|
| 1 day | 30 | ~2,000 | Effectively converged to the 2× ceiling |
| 7 days | 4.3 | ~1,940 | Nearly there |
| 30 days | 1 | 1,500 | Only one generation has completed |
| 90 days | 0.33 | ~1,170 | Most amplification is still pending |
Cycle time is dominated by friction in the invite loop, and the largest single component is usually the recipient's journey. An invite link that opens a web page asking someone to find the app in the store loses most of its clicks before install — which is where deferred deep linking is not a nicety but the mechanism that determines the conversion half of K itself.
Measuring it honestly
The measurement needs three linked events: the invite sent, the invite clicked, and the resulting install joined back to the inviter. Without a referral identifier that survives the store, the last join is impossible and K becomes a guess.
-- K is a product of two rates. Reporting only K hides which one moved.
WITH inviters AS (
SELECT
DATE_TRUNC(DATE(installed_at), WEEK(MONDAY)) AS cohort_week,
user_id
FROM installs
),
invites AS (
SELECT inviter_user_id AS user_id, COUNT(*) AS invites_sent
FROM referral_invites
GROUP BY inviter_user_id
),
converted AS (
-- An install is referred only when the referral code survived to first open.
SELECT r.inviter_user_id AS user_id, COUNT(DISTINCT i.user_id) AS referred_installs
FROM installs i
JOIN referral_invites r ON r.referral_code = i.referral_code
GROUP BY r.inviter_user_id
)
SELECT
c.cohort_week,
COUNT(*) AS cohort_size,
ROUND(SUM(COALESCE(v.invites_sent, 0)) / COUNT(*), 2) AS invites_per_user,
ROUND(SAFE_DIVIDE(SUM(COALESCE(x.referred_installs, 0)),
SUM(COALESCE(v.invites_sent, 0))), 4) AS invite_conversion,
ROUND(SUM(COALESCE(x.referred_installs, 0)) / COUNT(*), 3) AS k_factor
FROM inviters c
LEFT JOIN invites v USING (user_id)
LEFT JOIN converted x USING (user_id)
GROUP BY c.cohort_week
ORDER BY c.cohort_week DESC;Two design decisions are embedded there. The denominator is the whole cohort, not just users who sent an invite — dividing by inviters produces a much larger number that describes an unrepresentative subgroup. And the conversion join requires the referral code to have reached first open, which on iOS means a deferred deep link, since no URL parameter survives the App Store.
| Step | Android | iOS |
|---|---|---|
| Invite link clicked | Code in URL | Code in URL |
| Redirect to store | Code in install referrer | Nothing carried |
| First open, app newly installed | Referrer read by SDK | Deferred match required |
| First open, app already installed | Universal link or intent | Universal link |
| Fallback when nothing matched | Manual code entry | Manual code entry |
Where the number gets inflated
- Dividing by inviters rather than by all users. Produces a flattering number describing a self-selected subgroup.
- Counting invites sent rather than delivered. A contact-list bulk send is not an invitation anyone saw.
- Counting reinstalls as referred installs. Existing users redeeming their own code is not growth.
- Attributing organics to referral. A wide referral window catches users who would have installed anyway; the same problem as view-through attribution.
- Ignoring incentive cost. K of 0.8 bought with a $10 credit on both sides is a paid channel with extra steps.
The honest version of the metric reports invites per user, invite conversion and cycle time separately, then derives K from them. Reporting K alone hides which half moved, and the two halves respond to completely different work — one is a prompt-placement problem, the other is almost entirely a link-routing problem.
UTM builder
Both halves of K depend on referral links that carry their identifier intact through redirects and the store. This builds correctly-encoded campaign and referral URLs with a live preview, so an invite link's code is still readable when the install is joined back to the inviter who sent it.
Open the utm builder →Frequently asked questions
- What is K-factor?
- K-factor is the average number of new users each existing user brings in through invitations. It is calculated by multiplying the number of invitations an average user sends by the share of those invitations that convert into new users. A K above 1 implies self-sustaining growth; below 1 it amplifies other acquisition channels.
- How do you calculate K-factor?
- Multiply invitations sent per user by the conversion rate per invitation. A cohort where each user sends four invites that convert at ten percent has a K of 0.4. Divide by the entire cohort rather than only by users who sent invitations, since dividing by inviters describes a self-selected subgroup rather than the product.
- What is a good K-factor?
- Anything above zero has value, and most apps sit well below 0.5. A K of 0.4 means every paid install eventually brings roughly 0.67 additional users, cutting effective acquisition cost by about forty percent. Sustained values above 1 are rare and temporary, because the addressable pool saturates and early adopters invite most enthusiastically.
- What is viral cycle time?
- It is how long one full invite loop takes, from a user joining to their invitees joining. It determines how quickly the amplification implied by K is realised. At the same K, a one-day cycle converges to the ceiling within a month while a ninety-day cycle has barely completed one generation, so reducing friction in the loop often matters more than raising K.
- Why is measuring K-factor hard on iOS?
- Because no URL parameter survives the App Store, so a referral code carried in an invite link is lost between the click and the first app open. The join back to the inviter has to be re-established by a deferred deep link at first launch. Without that, referred installs look organic and K is systematically understated.
Related terms
- eCPI — Effective cost per install is total marketing spend divided by all installs attributable to that spend, including organic uplift and referred installs, rather than only the installs a network claims.
- Retention rate — Retention rate is the percentage of a cohort of users who are still active after a defined period, measured from a fixed starting event such as install.
- Web-to-app conversion — Web-to-app conversion is the process of moving a mobile web visitor into a native app, ideally landing them on the same content they were viewing rather than on a generic home screen.
- QR code deep link — A QR code deep link is a QR code encoding a universal or app link, so that scanning it opens the corresponding app directly on the intended content, or routes to the app store and restores that content after install.